簡體   English   中英

如何以編程方式對 Azure Kubernetes (AKS) 進行身份驗證

[英]How to programmatically authenticate to Azure Kubernetes (AKS)

我正在設置 AKS 群集,最近啟用了 Azure Active Directory 集成。 我有一個 C# 應用程序在 Kubernetes 集群之外運行,該集群正在創建 Kubernetes 作業。 因此,我使用的是 C# KubernetesClient package,它之前一直運行良好(現在仍然如此)。 但是,它使用了一個未與 Active Directory 集成的所謂“本地帳戶”(即本地管理員用戶)。 從長遠來看,我的目標是完全停用本地帳戶,這意味着我需要一種不同的身份驗證方式。 由於 Kubernetes 集群現已與 AAD 完全集成,因此我最好使用服務主體進行身份驗證。

Microsoft 沒有提供任何有關如何實現此目的的文檔,並且支持也不是特別有用。

您需要手動獲取 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分配給您的服務主體,如此處所述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM