【问题标题】:How to programmatically authenticate to Azure Kubernetes (AKS)如何以编程方式对 Azure Kubernetes (AKS) 进行身份验证
【发布时间】:2021-08-16 14:43:35
【问题描述】:

我正在设置 AKS 群集,并且最近启用了 Azure Active Directory 集成。我有一个在创建 Kubernetes 作业的 Kubernetes 集群之外运行的 C# 应用程序。因此,我使用的是 C# KubernetesClient 包,它之前一直运行良好(现在仍然如此)。但是,它使用了一个未与 Active Directory 集成的所谓“本地帐户”(即本地管理员用户)。从长远来看,我的目标是完全停用本地帐户,这意味着我需要一种不同的身份验证方式。由于 Kubernetes 集群现在与 AAD 完全集成,我希望使用服务主体进行身份验证。

Microsoft 没有提供任何有关如何实现此目的的文档,并且支持也没有特别有用。

【问题讨论】:

    标签: azure kubernetes azure-active-directory


    【解决方案1】:

    您需要手动获取 Kubernetes 环境的访问令牌。这可以通过以下代码完成:

    var credFactory = new AzureCredentialsFactory();
    var credentials = credFactory.FromServicePrincipal(
        "CLIENT_ID",
        "CLIENT_SECRET",
        "TENANT_ID",
        AzureEnvironment.AzureGlobalCloud
    );
    
    var azure = Microsoft.Azure.Management.Fluent.Azure
        .Authenticate(credentials)
        .WithSubscription("SUBSCRIPTION_ID");
    
    var kubeConfigBytes = azure.KubernetesClusters.GetUserKubeConfigContents(
        "K8S_RESOURCE_GROUP",
        "K8S_CLUSTER_NAME"
    );
    
    
    var kubeConfigRaw = KubernetesClientConfiguration.LoadKubeConfig(new MemoryStream(kubeConfigBytes));
    var authProvider  = kubeConfigRaw.Users.Single().UserCredentials.AuthProvider;
    if (!authProvider.Name.Equals("azure", StringComparison.OrdinalIgnoreCase))
        throw new Exception("Invalid k8s auth provider!");
    
    // Token Helper is a small helper utility that I use instead of MSAL
    // This method is doing a POST call to https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token
    var token = TokenHelper.GetTokenByClientCredentials(
        "CLIENT_ID",
        "CLIENT_SECRET",
        "TENANT_ID",
        "6dae42f8-4368-4678-94ff-3960e28e3630/.default" // This scope is always the same. It's the "Azure Kubernetes Service AAD Server" app from Microsoft. (az ad sp show --id 6dae42f8-4368-4678-94ff-3960e28e3630)
    ).GetAwaiter().GetResult();
    
    authProvider.Config["access-token"] = token.AccessToken;
    authProvider.Config["expires-on"]   = DateTimeOffset.UtcNow.AddSeconds(token.ExpiresIn).ToUnixTimeSeconds().ToString();
    
    var kubeConfig    = KubernetesClientConfiguration.BuildConfigFromConfigObject(kubeConfigRaw);
    var kubernetes = new Kubernetes(kubeConfig);
    
    

    请记住,令牌每小时到期一次,因此您需要定期创建一个新的Kubernetes 实例。另请注意,这只涉及 Authentication,而不是 Authorization。这意味着,您将能够登录,但可能不允许您的服务主体读取/编辑任何 kubernetes 资源。为此,您需要将RoleCluterRole 分配给您的服务主体,如HERE 所述。

    【讨论】:

      猜你喜欢
      • 2020-02-11
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 2013-09-21
      • 1970-01-01
      • 2018-10-12
      相关资源
      最近更新 更多