使用ExternalDNS在Azure上实现Kubernetes服务自动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租户IDsubscriptionId
:Azure订阅IDresourceGroup
:包含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时需确保:
- 使用正确的配置文件路径
- 为Pod添加适当的标识标签(如使用AAD Pod标识时)
- 配置正确的DNS策略和域过滤器
验证与调试
部署完成后,可以通过以下方式验证:
- 检查ExternalDNS Pod日志
- 查询Azure DNS区域记录
- 测试服务访问是否解析正确
最佳实践
- 为生产环境使用专用服务主体或托管标识
- 限制ExternalDNS的操作范围(通过域过滤)
- 定期轮换凭证(特别是服务主体方式)
- 监控DNS记录变更
总结
通过本文介绍的配置方法,可以在Azure环境中实现Kubernetes服务的自动DNS管理。根据安全需求和环境复杂度,可以选择最适合的权限方案。ExternalDNS与Azure DNS的集成提供了灵活、自动化的服务发现解决方案,大大简化了云原生应用的外部访问管理。
external-dns 项目地址: https://gitcode.com/gh_mirrors/ext/external-dns
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考