Aracılığıyla paylaş


Azure Kubernetes Hizmeti (AKS) ile hizmet ilkesi kullanma

Azure Kubernetes Service (AKS) kümeleri, diğer Azure kaynaklarını dinamik olarak oluşturmak ve yönetmek için bir Microsoft Entra hizmet sorumlusu veya yönetilen kimlik gerektirir. Bu makalede Microsoft Entra hizmet ilkesi oluşturmanın ve bunu AKS kümenizle birlikte kullanmanın nasıl yapılacağı açıklanmaktadır.

Not

En iyi güvenlik ve kullanım kolaylığı için, aks kümesinden Azure'daki diğer kaynaklara erişim yetkisi vermek için hizmet sorumluları yerine yönetilen kimlikleri kullanmanızı öneririz. Yönetilen kimlik, kimlik bilgilerini yönetmenize ve güvenliğini sağlamanıza gerek kalmadan Microsoft Entra kimlik bilgilerini almak için kullanabileceğiniz özel bir hizmet sorumlusu türüdür. Daha fazla bilgi için AKS'de yönetilen bir kimlik kullanma'ya bakın.

Önkoşullar

  • Azure CLI sürüm 2.0.59 veya üzeri gerekir. komutunu kullanarak az --version sürümünüzü bulun. Yüklemeniz veya yükseltmeniz gerekirse, bkz. Azure CLI yükleme.
  • Azure PowerShell kullanıyorsanız, Azure PowerShell sürüm 5.0.0 veya üzeri gerekir. cmdlet'ini Get-InstalledModule -Name Az kullanarak sürümünüzü bulun. Yüklemeniz veya yükseltmeniz gerekiyorsa bkz . Azure Az PowerShell modülünü yükleme.
  • Bir uygulamayı Microsoft Entra kiracınıza kaydetmek ve uygulamayı aboneliğinizdeki bir role atamak için izinlere ihtiyacınız vardır. Gerekli izinlere sahip değilseniz, Microsoft Entra Id veya abonelik yöneticinizden gerekli izinleri atamasını veya sizin için hizmet sorumlusunu oluşturmasını istemeniz gerekir.

Hizmet sorumlusu kullanırken dikkat edilmesi gerekenler

AKS ile Microsoft Entra hizmet sorumlusu kullanırken aşağıdaki noktaları göz önünde bulundurun:

  • Kubernetes hizmet sorumlusu küme yapılandırmasının bir parçasıdır, ancak kümeyi dağıtmak için bu kimliği kullanmayın. Bunun yerine, önce bir hizmet sorumlusu oluşturun , ardından AKS kümesini oluşturmak için bu hizmet sorumlusunu kullanın.
  • Her hizmet sorumlusu bir Microsoft Entra uygulamasıyla ilişkilendirilir. Kubernetes kümesinin hizmet sorumlusunu geçerli herhangi bir Microsoft Entra uygulama adıyla ilişkilendirebilirsiniz (örneğin: https://www.contoso.org/example). Uygulama URL'sinin gerçek bir uç nokta olması gerekmez.
  • Hizmet sorumlusu istemci kimliğini belirtirken uygulama kimliğinin değerini kullanın (appId Azure CLI veya ApplicationId Azure PowerShell için).
  • AKS kümesindeki sanal makine (VM) aracı düğümlerinde, hizmet temsilcisi kimlik bilgileri /etc/kubernetes/azure.json dosyasında depolanır.
  • AKS kümesini az aks create komutunu veya New-AzAksCluster cmdlet'ini kullanarak oluşturduğunuzda ve sildiğinizde, oluşturulan hizmet sorumlusu otomatik olarak silinmez. Hizmet sorumlusunu silme adımlarına bakın.
  • Farklı bir Microsoft Entra kiracısından hizmet sorumlusu kullanıyorsanız, kümeyi dağıtırken kullanabileceğiniz izinlerle ilgili başka noktalar da vardır. Dizin bilgilerini okumak ve yazmak için uygun izinlere sahip olmayabilirsiniz. Daha fazla bilgi için bkz . Microsoft Entra Id'de varsayılan kullanıcı izinleri nelerdir?

Hizmet sorumlusu oluşturma

  1. komutunu kullanarak az ad sp create-for-rbac bir hizmet sorumlusu oluşturun.

    # Set environment variable
    SERVICE_PRINCIPAL_NAME=<your-service-principal-name>
    
    # Create the service principal
    az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME
    

    Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:

    {
      "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "displayName": "myAKSClusterServicePrincipal",
      "name": "http://myAKSClusterServicePrincipal",
      "password": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
    
  2. AKS kümesini oluştururken kullanılacak çıkış için appId ve password değerlerini kopyalayın.

  1. komutunu kullanarak New-AzADServicePrincipal bir hizmet sorumlusu oluşturun.

    # Set environment variable
    $SpName = <your-service-principal-name>
    
    # Create the service principal
    New-AzADServicePrincipal -DisplayName $SpName -OutVariable sp
    

    Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:

    Secret                : System.Security.SecureString
    ServicePrincipalNames : {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, http://myAKSClusterServicePrincipal}
    ApplicationId         : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    ObjectType            : ServicePrincipal
    DisplayName           : myAKSClusterServicePrincipal
    Id                    : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    Type                  :
    

    Değerler, AKS kümesini oluştururken kullandığınız bir değişkende depolanır.

  2. Aşağıdaki komutu kullanarak Gizli dizi güvenli dizesinde depolanan değerin şifresini çöz.

    $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($sp.Secret)
    [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
    

Mevcut bir hizmet sorumlusuyla AKS kümesi oluşturma

  • Mevcut bir hizmet sorumlusuyla az aks create komutunu kullanarak ve --service-principal ile --client-secret parametrelerini appId ve password değerlerini belirtmek üzere ayarlayarak bir AKS kümesi oluşturun.

    # Set environment variables
    RESOURCE_GROUP=<your-resource-group-name>
    CLUSTER_NAME=<your-aks-cluster-name>
    APP_ID=<app-id>
    CLIENT_SECRET=<password-value>
    
    # Create the AKS cluster
    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --service-principal $APP_ID \
        --client-secret $CLIENT_SECRET \
        --generate-ssh-keys
    
  1. Aşağıdaki komutu kullanarak hizmet sorumlusunu ApplicationId ve Secret PSCredential nesnesine dönüştürün.

    $Cred = New-Object -TypeName System.Management.Automation.PSCredential ($sp.ApplicationId, $sp.Secret)
    
  2. Mevcut hizmet sorumlusuyla bir AKS kümesi oluşturmak için cmdlet'ini kullanarak, değerini PSCredential nesnesi olarak belirttiğiniz parametresini belirtin.

    # Set environment variables
    $ResourceGroupName = <your-resource-group-name>
    $ClusterName = <your-aks-cluster-name>
    
    # Create the AKS cluster
    New-AzAksCluster -ResourceGroupName $ResourceGroupName -Name $ClusterName -ServicePrincipalIdAndSecret $Cred
    

Not

Özelleştirilmiş gizli dizi ile mevcut bir hizmet sorumlusu kullanıyorsanız, gizli dizinin 190 bayttan uzun olmadığından emin olun.

Diğer Azure kaynaklarına erişim yetkisi verme

Diğer kaynaklara erişmek için AKS kümesinin hizmet sorumlusunu kullanabilirsiniz. Örneğin, AKS kümenizi mevcut bir Azure sanal ağı (VNet) alt ağına dağıtmak, ACR'ye bağlanmak veya kümenizden bir anahtar kasasındaki anahtarlara veya gizli dizilere erişmek istiyorsanız, bu kaynaklara erişim için hizmet sorumlusuna temsilci atamanız gerekir. Erişim yetkisi vermek için hizmet sorumlusuna Azure rol tabanlı erişim denetimi (Azure RBAC) rolü atayın.

Rolleri atarken, rol atamasının kapsamını (kaynak grubu veya sanal ağ kaynağı gibi) belirtirsiniz. Rol ataması, hizmet sorumlusunun kaynak üzerinde hangi izinlere sahip olduğunu ve hangi kapsamda olduğunu belirler.

Önemli

Bir kümeyle ilişkili hizmet sorumlusuna verilen izinlerin yayılması 60 dakika sürebilir.

Rol ataması oluşturma

Not

Bir kaynağın kapsamının tam bir kaynak kimliği olması gerekir, örneğin /subscriptions/\<guid\>/resourceGroups/myResourceGroup veya /subscriptions/\<guid\>/resourceGroups/myResourceGroupVnet/providers/Microsoft.Network/virtualNetworks/myVnet gibi.

  • az role assignment create komutunu kullanarak bir rol ataması oluşturun. parametresi için hizmet sorumlusu uygulama kimliğinin --assignee değerini ve parametrenin rol atamasının --scope kapsamını belirtin. Aşağıdaki örnek, bir anahtar kasasındaki sırlara erişmek için hizmet prensibine erişim izinlerini atar:

    az role assignment create \
        --assignee <app-id> \
        --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/<vault-name>" \
        --role "Key Vault Secrets User"
    
  • New-AzRoleAssignment cmdlet'i kullanarak bir rol ataması oluşturun. parametresi için hizmet sorumlusu uygulama kimliğinin -ApplicationId değerini ve parametrenin rol atamasının -Scope kapsamını belirtin. Aşağıdaki örnek, bir anahtar kasasında gizli verilere erişim için hizmet başlatıcıya izin atar:

    New-AzRoleAssignment -ApplicationId <app-id> `
        -Scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/<vault-name>" `
        -RoleDefinitionName "Key Vault Secrets User"
    

Azure Container Registry'ye erişim izni verme

Kapsayıcı görüntü deponuz olarak Azure Container Registry (ACR) kullanıyorsanız AKS kümenizin hizmet sorumlusuna görüntüleri okuması ve çekmesi için izin vermeniz gerekir. Bir kayıt defteriyle tümleştirmek ve hizmet sorumlusu için uygun rolü atamak için Azure Kubernetes Service'ten Azure Container Registry ile kimlik doğrulama başlığı altında yer alan adımların izlenmesini öneririz.

Ağ kaynaklarına erişim izni verme

Farklı kaynak grubundaki bir sanal ağ ve alt ağ veya genel IP adresleriyle gelişmiş ağ kullanıyorsanız, sanal ağ içindeki alt ağda Ağ Katkıda Bulunanı yerleşik rolünü atayabilirsiniz. Alternatif olarak, bu kaynak grubundaki ağ kaynaklarına erişme izinlerine sahip özel bir rol oluşturabilirsiniz. Daha fazla bilgi için bkz . AKS hizmeti izinleri.

Depolama disklerine erişim izni verme

Başka bir kaynak grubundaki mevcut disk kaynaklarına erişmeniz gerekiyorsa, aşağıdaki rol izinleri kümelerinden birini atayın:

Azure Container Instances'a erişim izni verme

AKS ile tümleştirmek için sanal kubelet kullanıyorsanız ve Azure Container Instances'ı (ACI) AKS kümesinden ayrı kaynak grubunda çalıştırıyorsanız, ACI kaynak grubu için AKS kümesi hizmet sorumlusuna Katkıda Bulunan izinleri atamanız gerekir.

Hizmet sorumlusunu silme

  • Hizmet sorumlusu istemci kimliğini (servicePrincipalProfile.clientId) sorgulayın ve az ad sp delete komutunu --id parametresiyle kullanarak hizmet sorumlusunu silin. [az aks show][az-aks-show] komutu, belirtilen AKS kümesi için istemci kimliğini alır.

    # Set environment variables
    RESOURCE_GROUP=<your-resource-group-name>
    CLUSTER_NAME=<your-aks-cluster-name>
    
    # Delete the service principal
    az ad sp delete --id $(az aks show \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --query servicePrincipalProfile.clientId \
        --output tsv)
    
  • Hizmet sorumlusu istemci kimliğini (ServicePrincipalProfile.ClientId) sorgulayıp, Remove-AzADServicePrincipal cmdlet'ini -ApplicationId parametresiyle kullanarak hizmet sorumlusunu silin. [Get-AzAksCluster][get-azakscluster] cmdlet'i belirtilen AKS kümesi için istemci kimliğini alır.

    # Set environment variables
    $ResourceGroupName = <your-resource-group-name>
    $ClusterName = <your-aks-cluster-name>
    $ClientId = (Get-AzAksCluster -ResourceGroupName myResourceGroup -Name myAKSCluster ).ServicePrincipalProfile.ClientId
    
    # Delete the service principal
    Remove-AzADServicePrincipal -ApplicationId $ClientId
    

Hizmet sorumlusu kimlik bilgisi sorunlarını çözme

Azure CLI, AKS kümeleri için hizmet sorumlusu kimlik bilgilerini önbelleğe alır.

Azure PowerShell, AKS kümeleri için hizmet sorumlusu kimlik bilgilerini önbelleğe alır.

Bu kimlik bilgilerinin süresi dolarsa AKS kümesi dağıtımı sırasında hatalarla karşılaşabilirsiniz. Önbelleğe alınan kimlik bilgileriyle ilgili bir sorun varsa aşağıdaki hata iletisine benzer bir hata iletisi alabilirsiniz:

Operation failed with status: 'Bad Request'.
Details: The credentials in ServicePrincipalProfile were invalid. Please see https://aka.ms/aks-sp-help for more details.
Details: adal: Refresh request failed. Status Code = '401'.

az ad app credential list komutunu ve "[].endDateTime" sorgusunu kullanarak hizmet sorumlusu kimlik bilgilerinizin sona erme tarihini kontrol edebilirsiniz. Çıktı, endDateTime kimlik bilgilerinizi gösterir.

az ad app credential list \
    --id <app-id> \
    --query "[].endDateTime" \
    --output tsv
  • cmdlet'ini kullanarak hizmet sorumlusu kimlik bilgilerinizin Get-AzADAppCredential son kullanma tarihini denetleyin. Çıktı, EndDate kimlik bilgilerinizi gösterir.
Get-AzADAppCredential -ApplicationId <app-id> 

Hizmet sorumlusu kimlik bilgileri için varsayılan süre sonu süresi bir yıldır. Kimlik bilgileriniz bir yıldan eskiyse, mevcut kimlik bilgilerini sıfırlayabilir veya yeni bir hizmet sorumlusu oluşturabilirsiniz.