Azure自托管VMSS代理执行Kubernetes@1任务失败求助
问题解决:Azure自托管代理运行Kubernetes@1任务时DNS解析失败
问题描述
使用基于VMSS的Azure自托管代理(Ubuntu 20.04 LTS)运行Kubernetes@1任务时,出现DNS解析错误:
couldn't get current server API group list: Get "https://<aks>.hcp.westeurope.azmk8s.io/api?timeout=32s": dial tcp: lookup <aks>.hcp.westeurope.azmk8s.io on 127.0.0.53:53: no such host
该AKS并非私有集群,使用Azure托管代理时配置正常;通过AzureCLI@2任务获取凭证并执行kubectl命令可正常工作,但希望使用Kubernetes@1任务。相关任务配置如下:
失败的Kubernetes@1任务
steps: - task: Kubernetes@1 displayName: "Rollout <deployment-name>" inputs: connectionType: "Kubernetes Service Connection" kubernetesServiceEndpoint: <serviceEndpoint> namespace: <namespace> command: "rollout" arguments: "restart deployment <deployment-name>"
正常运行的AzureCLI@2任务
steps: - task: AzureCLI@2 inputs: azureSubscription: $(azureSubscription) scriptType: bash scriptLocation: inlineScript inlineScript: | az aks get-credentials --resource-group <resource-group> --name <aks-name> kubectl rollout -n <namespace> restart deployment <deployment-name>
补充信息:使用ServiceAccount而非kube config文件,自定义镜像预装kubectl命令。
解决方案
1. 检查并修复自托管代理的DNS配置
Ubuntu 20.04默认使用systemd-resolved,其默认DNS服务器可能无法解析AKS的hcp.westeurope.azmk8s.io域名,而Azure托管代理默认使用Azure内部DNS(168.63.129.16)可正常解析。
- 先在代理节点上测试域名解析:
如果返回nslookup <aks>.hcp.westeurope.azmk8s.iono such host,则修改DNS配置:- 编辑
/etc/systemd/resolved.conf,添加或修改:DNS=168.63.129.16 - 重启systemd-resolved服务:
sudo systemctl restart systemd-resolved - 再次测试解析,确认能正常返回AKS API的IP地址。
- 编辑
2. 验证Kubernetes服务连接配置
- 确认服务连接中填写的AKS集群API地址完全正确,无拼写错误;
- 检查服务连接使用的身份(如服务主体)是否拥有AKS集群的
Cluster Admin或足够权限(AzureCLI能正常运行则权限大概率没问题,但可交叉验证)。
3. 测试ServiceAccount的手动认证
将Kubernetes服务连接中的ServiceAccount信息提取出来,在代理节点手动配置kubeconfig并测试,排查是否为任务配置问题:
- 创建临时kubeconfig文件(替换占位符):
apiVersion: v1 clusters: - cluster: certificate-authority-data: <CA_CERT_DATA_FROM_SERVICE_CONNECTION> server: https://<aks>.hcp.westeurope.azmk8s.io name: aks-cluster contexts: - context: cluster: aks-cluster user: <SERVICE_ACCOUNT_NAME> name: aks-context current-context: aks-context kind: Config preferences: {} users: - name: <SERVICE_ACCOUNT_NAME> user: token: <SERVICE_ACCOUNT_TOKEN_FROM_SERVICE_CONNECTION> - 导出环境变量并执行kubectl命令:
export KUBECONFIG=./temp-kubeconfig kubectl get nodes- 如果同样出现DNS错误:确认是代理节点的DNS问题,回到步骤1解决;
- 如果能正常执行:说明Kubernetes@1任务的配置可能存在问题,可尝试重新创建服务连接,或升级任务到Kubernetes@2版本测试。
4. 检查kubectl版本兼容性
确认自定义镜像中预装的kubectl版本与AKS集群的API版本兼容(kubectl版本建议与集群版本差不超过1个大版本)。在代理节点执行:
kubectl version --client
对比AKS集群的版本(可通过az aks show --name <aks-name> --resource-group <resource-group> --query kubernetesVersion查看),若版本差异过大,可更新镜像中的kubectl版本。
内容的提问来源于stack exchange,提问作者Tomáš Starý
相关产品推荐
相关产品推荐

