如何在Azure部署的App Service中获取kubeconfig并访问AKS的Kubernetes API
AKS 无个人凭据连接方案及 SSL 报错原因解析
个人 kubeconfig 部署到 App Service 报 SSL 错误的原因
- 你本地获取的 kubeconfig 中内置的个人 Azure AD 访问令牌有效期通常仅为几小时,令牌过期后与 AKS API 建立 TLS 握手时会被身份校验拦截,错误表现常被归类为 SSL 相关异常
- kubeconfig 中存储的 AKS CA 证书内容在复制、上传到 App Service 过程中可能出现字符转义、缺失,导致客户端无法正确解析 CA 证书,无法完成服务端证书校验触发 SSL 报错
- 部分本地生成的 kubeconfig 为适配本地网络环境配置了特殊的 TLS 校验规则,放到 App Service 运行环境后规则不匹配也会触发校验失败
无个人凭据的编程实现方案
核心思路是使用 App Service 托管身份获取 AKS 访问权限,完全避免硬编码或上传包含个人凭据的 kubeconfig 文件,实现步骤如下:
- 为目标 App Service 启用系统分配的托管身份,启用后 Azure 会自动为该服务生成专属的服务主体,无需你维护任何凭据
- 为托管身份授予 AKS 访问权限,可通过 Azure CLI 执行命令完成授权:
az role assignment create --assignee <托管身份的客户端ID> --role "Azure Kubernetes Service Cluster User" --scope <AKS资源的完整资源ID> - 在 AKS 中配置对应 RBAC 权限,将托管身份的对象ID绑定到你需要的 ClusterRole/Role,满足业务对 K8S 资源的操作权限要求
- 将 AKS API 服务器地址、AKS CA 证书内容(可从本地 kubeconfig 的
certificate-authority-data字段获取)配置到 App Service 的应用配置(环境变量)中,避免硬编码 - 代码改造,引入
Azure.Identity和KubernetesClient两个 NuGet 包,直接通过托管身份获取访问令牌构造 K8S 客户端:
using Azure.Identity; using k8s; using System.Security.Cryptography.X509Certificates; // 从App Service环境变量读取配置 var aksApiHost = Environment.GetEnvironmentVariable("AKS_API_HOST"); var aksCaCertBase64 = Environment.GetEnvironmentVariable("AKS_CA_CERT_BASE64"); // 获取托管身份的AKS访问令牌 var azureCredential = new DefaultAzureCredential(); var aksToken = await azureCredential.GetTokenAsync(new Azure.Core.TokenRequestContext( new[] { "6dae42f8-4368-4678-94ff-3960e28e3630/.default" } )); // 手动构造K8S客户端配置 var k8sConfig = new KubernetesClientConfiguration { Host = aksApiHost, AccessToken = aksToken.Token, SslCaCerts = new X509Certificate2Collection() }; // 导入AKS CA证书完成TLS校验 k8sConfig.SslCaCerts.Add(new X509Certificate2(Convert.FromBase64String(aksCaCertBase64))); // 初始化可正常使用的K8S客户端 var kubernetesClient = new Kubernetes(k8sConfig);
DefaultAzureCredential 兼容本地开发环境,本地调试时会自动读取你本地 Azure CLI 登录的凭据,不需要修改代码就能本地跑通,部署到 App Service 后会自动切换为系统托管身份的凭据。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

