You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:50:24