如何用Golang从外部连接AKS集群并创建K8s Clientset获取命名空间?
解决方案:通过Azure AD应用身份验证创建AKS Clientset
核心思路
利用Azure SDK for Go直接获取AKS集群的kubeconfig(内含临时访问令牌),无需依赖本地kube-config文件或kubelogin插件,通过Azure AD应用程序的身份凭证完成认证,生成可用的Kubernetes Clientset,进而调用K8s API获取命名空间。
前置准备
- 创建Azure AD应用程序,记录客户端ID、客户端密钥、租户ID
- 为该应用程序授予AKS集群的
Azure Kubernetes Service Cluster User Role(或更高权限如Contributor) - 记录AKS集群的资源组名称和集群名称
代码示例
1. 导入依赖
import ( "context" "fmt" "log" "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v4" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" )
2. 完整实现代码
func main() { // 替换为你的实际参数 tenantID := "你的租户ID" clientID := "你的客户端ID" clientSecret := "你的客户端密钥" resourceGroup := "你的AKS资源组名称" clusterName := "你的AKS集群名称" // 创建Azure AD客户端凭证 cred, err := azidentity.NewClientSecretCredential(tenantID, clientID, clientSecret, nil) if err != nil { log.Fatalf("创建Azure凭证失败: %v", err) } // 初始化AKS管理客户端 aksClient, err := armcontainerservice.NewManagedClustersClient(tenantID, cred, nil) if err != nil { log.Fatalf("创建AKS客户端失败: %v", err) } // 获取管理员权限的kubeconfig(如需用户级权限,替换为ListClusterUserCredentials) resp, err := aksClient.ListClusterAdminCredentials(context.Background(), resourceGroup, clusterName, &armcontainerservice.ManagedClustersClientListClusterAdminCredentialsOptions{ ServerParameters: &armcontainerservice.ServerParameters{ ReturnClientCertificate: to.Ptr(false), }, }) if err != nil { log.Fatalf("获取kubeconfig失败: %v", err) } // 解析kubeconfig并生成K8s配置 kubeconfigBytes := *resp.Kubeconfigs[0].Value config, err := rest.ConfigFromKubeConfig(kubeconfigBytes) if err != nil { log.Fatalf("解析kubeconfig失败: %v", err) } // 创建Kubernetes Clientset k8ClientSet, err := kubernetes.NewForConfig(config) if err != nil { log.Fatalf("创建Clientset失败: %v", err) } // 列出所有命名空间 namespaces, err := k8ClientSet.CoreV1().Namespaces().List(context.Background(), metav1.ListOptions{}) if err != nil { log.Fatalf("获取命名空间失败: %v", err) } fmt.Println("AKS集群中的命名空间:") for _, ns := range namespaces.Items { fmt.Printf("- %s\n", ns.Name) } }
关键说明
- 若需用户级权限而非管理员权限,将
ListClusterAdminCredentials替换为ListClusterUserCredentials即可 - 生成的kubeconfig包含临时有效访问令牌,无需额外处理认证逻辑,Clientset可直接调用K8s API
- 全程无需依赖本地kube-config文件或kubelogin插件,完全通过代码完成认证与API交互
内容的提问来源于stack exchange,提问作者Mudit Surana
相关产品推荐
相关产品推荐

