ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

使用 Go 官方 SDK(armprivatedns)管理 Azure Private DNS:从客户端工厂到虚拟网络链接的完整指南

使用 Go 官方 SDK(armprivatedns)管理 Azure Private DNS:从客户端工厂到虚拟网络链接的完整指南 测试云原生质量保障【免费下载链接】originConformance test suite for OpenShift项目地址https://gitcode.com/gh_mirrors/or/origin点击查看免费下载导读本文以 OpenShift 项目中 vendored 的 Azure Go SDK 模块armprivatedns位于仓库vendor/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns/对应 go.mod 中github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns v1.2.0为对象系统讲解如何通过新一代 Azure SDK for Go 的 ARM 资源管理客户端来操作 Azure Private DNS——即私有 DNS 区域Private Zone、记录集Record Set与虚拟网络链接Virtual Network Link的创建、查询、更新与删除。读完本文你将掌握该模块的安装方式、azidentity认证接入、ClientFactory工厂模式的使用、三大客户端PrivateZonesClient、RecordSetsClient、VirtualNetworkLinksClient的 API 组织方式以及基于内存 Fake Server 编写单元测试的思路。一、模块概览armprivatedns 是什么armprivatedns是 Azure SDK for Go 中负责Azure Private DNS 资源管理ARM 平面的模块它基于 AutoRest 代码生成器自动生成对应的 ARM API 版本为2020-06-01可在 privatezones_client.go 等请求构造代码中看到api-version2020-06-01的固定写入。从仓库内的文件布局可以确认该模块的核心组成文件职责client_factory.goClientFactory客户端工厂统一创建本模块所有客户端privatezones_client.goPrivateZonesClient私有 DNS 区域的生命周期管理recordsets_client.goRecordSetsClient区域内 A/AAAA/CNAME/MX/PTR/SOA/SRV/TXT 记录集管理virtualnetworklinks_client.goVirtualNetworkLinksClient区域与虚拟网络的链接管理models.go全部请求/响应模型PrivateZone、RecordSet、VirtualNetworkLink等constants.go枚举常量ProvisioningState、RecordType、VirtualNetworkLinkState与模块版本号options.go各方法的可选参数ETag 条件头、Top分页上限、ResumeToken等CHANGELOG.md版本演进记录v1.2.0 起支持 test fakes 与 OpenTelemetry trace spans根据 CHANGELOG.md该模块自v1.0.02022-05-18起切换到下一代设计原则包含破坏性变更v1.1.0引入ClientFactoryv1.2.02023-11-24增加 test fakes 与 OpenTelemetry trace spans 支持。仓库当前锁定版本正是 v1.2.0。二、快速开始环境与安装2.1 前置条件使用该模块前需要满足一个有效的Azure 订阅Subscription订阅 ID 会在每个服务调用的 URI 中体现Go 1.18 或更高版本。这一点在源码中得到印证所有客户端源文件头部都有//go:build go1.18构建标签如 client_factory.go低于 1.18 的 Go 版本无法编译该模块。2.2 安装模块本项目采用 Go Modules 进行版本化与依赖管理安装命令为go get github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns在 OpenShift 仓库中该依赖以间接依赖// indirect形式记录于根目录 go.mod 第 151 行并被 vendored 进vendor/目录。如果你的项目也使用 vendor 模式go get之后需要同步 vendor 目录。三、认证用 azidentity 提供 TokenCredential创建任意客户端时都需要传入一个azcore.TokenCredential凭据用于向 Azure 服务发起带令牌的请求。官方推荐的获取方式是使用azidentity模块的默认凭据链它依次尝试环境变量client/secret、证书、托管身份等常见认证方式cred, err : azidentity.NewDefaultAzureCredential(nil)该凭据对象随后被传入客户端构造函数。从 client_factory.go 的注释可见credential参数的定位是“用于对请求授权的凭据通常是来自 azidentity 的凭据”。四、Client Factory创建任意客户端armprivatedns模块由多个客户端组成官方为此提供了ClientFactory工厂用于统一创建模块内的任意客户端避免为每个客户端重复传入订阅 ID、凭据和选项clientFactory, err : armprivatedns.NewClientFactory(subscription ID, cred, nil)从源码看NewClientFactory 会先通过arm.NewClient(moduleName, moduleVersion, credential, options)校验并初始化底层 ARM 客户端然后将subscriptionID、credential与克隆后的options保存在工厂内。工厂内部为每个子客户端提供便捷构造方法func (c *ClientFactory) NewPrivateZonesClient() *PrivateZonesClient func (c *ClientFactory) NewRecordSetsClient() *RecordSetsClient func (c *ClientFactory) NewVirtualNetworkLinksClient() *VirtualNetworkLinksClient这些方法会把工厂持有的订阅 ID、凭据与选项传播给新建的客户端见 client_factory.go。用法示例client : clientFactory.NewPrivateZonesClient()注意各客户端的NewXxxClient构造函数的注释均明确“不要直接使用类型请通过构造函数或工厂创建”如 privatezones_client.go。4.1 ClientOptions切换公有云、主权云与 Azure StackClientOptions位于github.com/Azure/azure-sdk-for-go/sdk/azcore/arm包用于设置端点以连接公有云、主权云以及 Azure Stack。以下示例将客户端指向Azure China云options : arm.ClientOptions { ClientOptions: azcore.ClientOptions { Cloud: cloud.AzureChina, }, } clientFactory, err : armprivatedns.NewClientFactory(subscription ID, cred, options)传入nil则使用默认值Azure 公有云。五、三大客户端与核心 API“客户端”将一组相关 API 聚合在一起提供对某一资源维度的访问能力。本模块包含三个客户端覆盖 Azure Private DNS 的全部资源类型。5.1 PrivateZonesClient私有 DNS 区域负责私有 DNS 区域的增删改查方法包括BeginCreateOrUpdate(ctx, resourceGroupName, privateZoneName, parameters, options)创建或更新区域。源码注释强调它不会修改区域内的虚拟网络链接或 DNS 记录privatezones_client.goGet(ctx, resourceGroupName, privateZoneName, options)获取区域属性但不包含虚拟网络链接与记录集BeginUpdate(...)更新区域仅更新PrivateZone的可写字段不改链接与记录BeginDelete(...)删除区域。警告区域内的所有 DNS 记录将一并删除且不可恢复必须先移除所有指向该区域的虚拟网络链接才能删除区域privatezones_client.goNewListPager(options)分页列出订阅内全部资源组中的私有区域NewListByResourceGroupPager(resourceGroupName, options)分页列出某资源组内的私有区域。从请求构造代码可以看到 REST 资源路径模式privatezones_client.go/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/privateDnsZones/{privateZoneName}创建、更新属于长时运行操作LROBeginXxx返回*runtime.Poller[T]轮询器可通过PollUntilDone等待完成同时支持通过options.ResumeToken从断点恢复轮询runtime.NewPollerFromResumeToken。列表类方法返回*runtime.Pager[T]分页器内部依据响应中的NextLink自动翻页privatezones_client.go。5.2 RecordSetsClient记录集负责区域内记录集同一名称与类型的 DNS 记录集合的管理CreateOrUpdate(ctx, resourceGroupName, privateZoneName, recordType, relativeRecordSetName, parameters, options)创建或更新记录集。注意SOA 类型的记录集只能更新不能创建——它在区域创建时自动生成recordsets_client.goGet(...)、Update(...)、Delete(...)对应的查、改、删NewListPager(...)、NewListByTypePager(...)分页枚举记录集两者都支持Recordsetnamesuffix按后缀过滤与Top参数。RecordType枚举定义了 8 种支持的类型constants.go常量值说明RecordTypeAAIPv4 地址记录RecordTypeAAAAAAAAIPv6 地址记录RecordTypeCNAMECNAME别名记录RecordTypeMXMX邮件交换记录RecordTypePTRPTR反向解析记录RecordTypeSOASOA起始授权记录RecordTypeSRVSRV服务定位记录RecordTypeTXTTXT文本记录对应的记录模型定义在 models.go 中ARecordIPv4Address、AaaaRecordIPv6Address、CnameRecordCname、MxRecordExchangePreference、PtrRecordPtrdname、SrvRecordPort/Priority/Target/Weight、TxtRecordValue []*string与SoaRecordHost/Email/SerialNumber/RefreshTime/RetryTime/ExpireTime/MinimumTTL。RecordSetProperties还包含TTL记录 TTL秒、Metadata附加元数据、只读的Fqdn记录集全限定域名与IsAutoRegistered是否通过虚拟网络链接自动注册等字段models.go。5.3 VirtualNetworkLinksClient虚拟网络链接将私有区域与 Azure 虚拟网络绑定使该网络内的资源能够解析区域内的私有域名BeginCreateOrUpdate(ctx, resourceGroupName, privateZoneName, virtualNetworkLinkName, parameters, options)创建或更新链接BeginUpdate(...)、BeginDelete(...)更新与删除链接。警告若删除的是注册型registration虚拟网络的链接该网络在区域内所有自动注册的 DNS 记录也会一并删除且无法撤销virtualnetworklinks_client.goGet(...)、NewListPager(...)查询与分页枚举。VirtualNetworkLinkProperties的关键可写字段是RegistrationEnabled *bool是否启用虚拟网络内虚拟机记录的自动注册与VirtualNetwork *SubResource被链接虚拟网络的引用只读字段包括ProvisioningState与VirtualNetworkLinkStateInProgress/Completed见 models.go 与 constants.go。5.4 可选参数options.go速查各方法通过*Options结构体接收可选参数核心字段如下完整定义见 options.go字段适用方法语义IfMatch *string各 Create/Update/Delete携带资源的 ETag省略则无条件覆盖指定上次见到的 ETag 可防止覆盖并发变更IfNoneMatch *stringCreateOrUpdate 系列设为*允许新建但不允许更新已有资源其他值被忽略ResumeToken stringBegin* 系列从提供的令牌恢复长时操作轮询Top *int32List 系列返回条数上限未指定时默认最多返回100条Recordsetnamesuffix *stringRecordSets List 系列按名称后缀过滤枚举结果六、模型与枚举理解数据平面6.1 核心模型PrivateZonemodels.go私有区域资源可写字段为Location、Tags、Etag与PropertiesID/Name/Type为只读。PrivateZonePropertiesmodels.go全部为只读包括ProvisioningState、MaxNumberOfRecordSets、MaxNumberOfVirtualNetworkLinks、MaxNumberOfVirtualNetworkLinksWithRegistration以及当前计数NumberOfRecordSets等。RecordSet/RecordSetProperties见 5.2 节。VirtualNetworkLink/VirtualNetworkLinkProperties见 5.3 节。6.2 关键枚举ProvisioningStateconstants.goCanceled、Creating、Deleting、Failed、Succeeded、Updating为只读属性尝试设置会被忽略。RecordType见 5.2 节表格。VirtualNetworkLinkStateInProgress与Completed。每个枚举类型都配套提供PossibleXxxValues()函数如PossibleRecordTypeValues()返回全部合法取值可用于校验输入。七、Fakes离线单元测试从 v1.2.0 起本模块支持test fakes——fake 包提供了构建内存假服务器的类型用于单元测试中模拟服务端各种成功/失败场景无需连接真实 Azure 服务即可覆盖业务逻辑的边界条件。典型的应用方式是在测试中构造对应的 fake server 类型将其作为 HTTP 传输层注入客户端azcore的ClientOptions.Transport指向 fake 服务器随后正常调用客户端方法断言返回结果与错误分支。这与官方sdk/samples/fakes中给出的模式一致也呼应了 CHANGELOG 中“Support for test fakes and OpenTelemetry trace spans”的版本特性。八、在 OpenShift 仓库中的定位与集成注意点armprivatedns在当前 OpenShift conformance 测试仓库中是以vendored 间接依赖的形式存在的见根目录 go.mod源码目录为vendor/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns/。这意味着它随 Azure SDK for Go 的管理平面依赖链被拉入供集群相关测试或基础设施工具在需要操作 Azure 私有 DNS 资源时直接 import使用时应遵循 Go Modules vendor 的依赖管理约束升级模块版本需同步更新go.mod/go.sum并重新 vendor若在仓库外独立项目中使用直接执行go get github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns即可获取最新稳定版当前仓库锁定的 v1.2.0 对应 ARM API 2020-06-01。九、最小可运行骨架综合上述内容一个最小化的端到端使用骨架如下package main import ( context fmt github.com/Azure/azure-sdk-for-go/sdk/azidentity github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns ) func main() { subscriptionID : subscription ID resourceGroupName : resource group name privateZoneName : example.internal // 不带结尾点号 // 1. 认证 cred, err : azidentity.NewDefaultAzureCredential(nil) if err ! nil { panic(err) } // 2. 通过工厂创建客户端nil 选项 Azure 公有云默认端点 clientFactory, err : armprivatedns.NewClientFactory(subscriptionID, cred, nil) if err ! nil { panic(err) } zonesClient : clientFactory.NewPrivateZonesClient() recordsClient : clientFactory.NewRecordSetsClient() ctx : context.Background() // 3. 创建私有 DNS 区域长时操作 poller, err : zonesClient.BeginCreateOrUpdate(ctx, resourceGroupName, privateZoneName, armprivatedns.PrivateZone{Location: tostring}, nil) if err ! nil { panic(err) } resp, err : poller.PollUntilDone(ctx, nil) if err ! nil { panic(err) } fmt.Println(zone created:, *resp.PrivateZone.Name) // 4. 创建 A 记录集 _, err recordsClient.CreateOrUpdate(ctx, resourceGroupName, privateZoneName, armprivatedns.RecordTypeA, db, armprivatedns.RecordSet{ Properties: armprivatedns.RecordSetProperties{ TTL: toint64, ARecords: []*armprivatedns.ARecord{ {IPv4Address: tostring}, }, }, }, nil) if err ! nil { panic(err) } }说明示例中的toT是常见的指针辅助函数实际工程中可使用azcore/to包提供的指针工具或自行定义。区域名、记录名均“不带结尾点号”不含 terminating dot。十、进一步学习与反馈模块内更多细节可直接阅读仓库内 README.md 及其同目录源码client、models、options、constants以及 CHANGELOG.md 了解版本演进官方针对 Private Zone、Record Sets、Virtual Network Link 分别提供了可运行示例可作为代码参考若遇到 bug 或有改进建议可按 Azure SDK 的 issue 流程提交并附带Private DNS标签便于维护团队定位。适用前提与限制本文所有 API 形态、参数与枚举均以仓库内锁定版本v1.2.0对应 ARM API 版本 2020-06-01为准不同版本的 SDK 可能在方法签名或字段上存在差异升级前请参考对应版本的 CHANGELOG 与迁移指南。赞分享测试云原生质量保障【免费下载链接】originConformance test suite for OpenShift项目地址https://gitcode.com/gh_mirrors/or/origin点击查看免费下载相关推荐Azure Container Registry Go SDKarmcontainerregistry实战指南客户端工厂、认证与容器镜像管理Azure Container Registry Go SDKarmcontainerregistry实战指南客户端工厂、认证与容器镜像管理 Azure测试云原生质量保障使用 Argo Workflows Go SDK 的 gRPC 客户端远程操作 Argo Server从连接到工作流管理的完整实战指南使用 Argo Workflows Go SDK 的 gRPC 客户端远程操作 Argo Server从连接到工作流管理的完整实战指南 本篇技术指南以仓库 s云原生容器编排工作流自动化任务调度后端OpenShift 仓库中的 Azure Key Vault Go SDKarmkeyvault管理平面客户端使用指南OpenShift 仓库中的 Azure Key Vault Go SDKarmkeyvault管理平面客户端使用指南 导读 本文以 armkeyvault测试云原生质量保障上一篇3个技巧让网盘下载提速10倍LinkSwift直链解析工具实战指南下一篇Adobe破解工具终极指南三步解锁专业设计软件完整功能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表