使用ExternalDNS在Azure上实现Kubernetes服务自动DNS管理

使用ExternalDNS在Azure上实现Kubernetes服务自动DNS管理

external-dns external-dns 项目地址: https://gitcode.com/gh_mirrors/ext/external-dns

前言

在现代云原生架构中,服务发现是至关重要的组件。ExternalDNS作为Kubernetes生态系统中的重要工具,能够自动将服务暴露到外部DNS系统中。本文将详细介绍如何在Azure环境中配置和使用ExternalDNS,实现Kubernetes服务的自动DNS记录管理。

环境准备

版本要求

确保使用ExternalDNS版本≥0.11.0,以获得完整的Azure DNS支持。

工具准备

  • Azure CLI 2.0或更高版本
  • kubectl命令行工具
  • 已创建的Azure Kubernetes Service (AKS)集群

创建Azure DNS区域

ExternalDNS不会自动创建DNS区域,需要预先创建:

# 创建资源组
az group create --name "MyDnsResourceGroup" --location "eastus"

# 创建DNS区域
az network dns zone create --resource-group "MyDnsResourceGroup" --name "example.com"

提示:如果使用自有域名,需将域名注册商的名称服务器指向Azure DNS提供的名称服务器。

内部负载均衡器支持

要创建内部负载均衡器,可在服务资源上添加注解:

service.beta.kubernetes.io/azure-load-balancer-internal: "true"

注意:AKS集群的控制平面托管标识需要被授予"网络贡献者"角色以更新子网。

配置ExternalDNS

配置文件结构

ExternalDNS通过azure.json配置文件与Azure交互,建议以Kubernetes Secret形式注入:

{
  "tenantId": "租户ID",
  "subscriptionId": "订阅ID",
  "resourceGroup": "资源组名称",
  "aadClientId": "客户端ID",
  "aadClientSecret": "客户端密钥"
}

各字段说明:

  • tenantId:Azure Active Directory租户ID
  • subscriptionId:Azure订阅ID
  • resourceGroup:包含DNS区域的资源组
  • aadClientId/aadClientSecret:服务主体凭证

权限配置方案

ExternalDNS需要修改DNS区域的权限,提供四种配置方案:

1. 服务主体方式

创建服务主体
# 创建服务主体
DNS_SP=$(az ad sp create-for-rbac --name ExternalDnsServicePrincipal)

# 分配DNS区域贡献者角色
az role assignment create --role "DNS Zone Contributor" \
  --assignee $EXTERNALDNS_SP_APP_ID --scope $DNS_ID
创建配置文件
cat > azure.json <<EOF
{
  "tenantId": "$(az account show --query tenantId -o tsv)",
  "subscriptionId": "$(az account show --query id -o tsv)",
  "resourceGroup": "$AZURE_DNS_ZONE_RESOURCE_GROUP",
  "aadClientId": "$EXTERNALDNS_SP_APP_ID",
  "aadClientSecret": "$EXTERNALDNS_SP_PASSWORD"
}
EOF

2. AKS Kubelet托管标识

使用AKS节点池的托管标识:

{
  "tenantId": "租户ID",
  "subscriptionId": "订阅ID",
  "resourceGroup": "资源组名称",
  "useManagedIdentityExtension": true,
  "userAssignedIdentityID": "托管标识客户端ID"
}

3. AAD Pod标识

专用于ExternalDNS容器的托管标识:

# 启用AAD Pod标识功能
az feature register --name EnablePodIdentityPreview --namespace Microsoft.ContainerService

# 创建托管标识
az identity create --resource-group "${IDENTITY_RESOURCE_GROUP}" --name "${IDENTITY_NAME}"

# 创建Azure标识绑定
az aks pod-identity add --resource-group ${AZURE_AKS_RESOURCE_GROUP} \
  --cluster-name ${AZURE_AKS_CLUSTER_NAME} --namespace "default" \
  --name "external-dns" --identity-resource-id ${IDENTITY_RESOURCE_ID}

4. 工作负载标识

基于服务账户的托管标识方案:

# 启用工作负载标识
az aks update --resource-group ${AZURE_AKS_RESOURCE_GROUP} \
  --name ${AZURE_AKS_CLUSTER_NAME} --enable-oidc-issuer --enable-workload-identity

# 创建联合身份凭证
az identity federated-credential create --name ${IDENTITY_NAME} \
  --identity-name ${IDENTITY_NAME} --resource-group ${AZURE_AKS_RESOURCE_GROUP} \
  --issuer "$OIDC_ISSUER_URL" --subject "system:serviceaccount:default:external-dns"

部署ExternalDNS

创建配置文件Secret后,部署ExternalDNS时需确保:

  1. 使用正确的配置文件路径
  2. 为Pod添加适当的标识标签(如使用AAD Pod标识时)
  3. 配置正确的DNS策略和域过滤器

验证与调试

部署完成后,可以通过以下方式验证:

  1. 检查ExternalDNS Pod日志
  2. 查询Azure DNS区域记录
  3. 测试服务访问是否解析正确

最佳实践

  1. 为生产环境使用专用服务主体或托管标识
  2. 限制ExternalDNS的操作范围(通过域过滤)
  3. 定期轮换凭证(特别是服务主体方式)
  4. 监控DNS记录变更

总结

通过本文介绍的配置方法,可以在Azure环境中实现Kubernetes服务的自动DNS管理。根据安全需求和环境复杂度,可以选择最适合的权限方案。ExternalDNS与Azure DNS的集成提供了灵活、自动化的服务发现解决方案,大大简化了云原生应用的外部访问管理。

external-dns external-dns 项目地址: https://gitcode.com/gh_mirrors/ext/external-dns

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

褚铃尤Kerwin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值