Azure Arc kümesi tarafından etkinleştirilen bir AKS'de İş Yükü Kimliğini dağıtma ve yapılandırma (önizleme)

Azure Local üzerinde AKS için geçerlidir

İş yükü kimliği federasyonu, Kubernetes gibi bir dış kimlik sağlayıcısından (IdP) gelen belirteçlere güvenmek için Microsoft Entra Kimliği'nde kullanıcı tarafından atanan yönetilen kimliği veya uygulama kaydını yapılandırmanıza olanak tanır ve Azure Key Vault veya Azure Blob depolama gibi Microsoft Entra tarafından korunan kaynaklara erişim sağlar.

Azure Arc tarafından etkinleştirilen Azure Kubernetes Service (AKS), iş yükü kimliği etkinleştirilmiş Kubernetes kümelerini kolayca dağıtmanıza olanak tanıyan yönetilen bir Kubernetes hizmetidir. Bu makalede aşağıdaki görevlerin nasıl gerçekleştirildiği açıklanmaktadır:

  • İş yükü kimliği etkinleştirilmiş (önizleme) bir AKS Arc kümesi oluşturun.
  • Bir Kubernetes hizmet hesabı oluşturun ve bunu Azure Yönetilen Kimliği'ne bağlayın.
  • OIDC verene güvenmek için yönetilen kimlikte bir federasyon kimlik bilgisi oluşturun.
  • Uygulamanızı dağıtın.
  • Örnek: Kümedeki bir pod'a Azure anahtar kasasındaki gizli verilere erişim izni verin.

İş yükü kimlik federasyonuna kavramsal genel bakış için bkz. Azure Arc özellikli Kubernetes'te İş yükü kimliği federasyonu (önizleme).

Önemli

Bu önizleme özellikleri self servis ve kabul temelinde kullanılabilir. Önizlemeler "olduğu gibi" ve "kullanılabilir" olarak sağlanır ve hizmet düzeyi sözleşmelerinin ve sınırlı garantinin dışında tutulur. Azure Arc önizlemeleri tarafından etkinleştirilen Azure Kubernetes Service, müşteri desteği tarafından, mümkün olan en iyi çaba temelinde kısmi olarak kapsam altına alınmaktadır.

Not

Genel önizlemede, Azure Yerel üzerinde AKS, AKS kümesi oluşturma sırasında iş yükü kimliğini etkinleştirmeyi destekler. Ancak, küme oluşturulduktan sonra iş yükü kimliğini etkinleştirme veya daha sonra devre dışı bırakma şu anda desteklenmiyor.

Önkoşullar

Azure Arc etkin bir Kubernetes kümesi dağıtmadan önce aşağıdaki önkoşullara sahip olmanız gerekir:

  • Azure aboneliğiniz yoksa başlamadan önce ücretsiz hesap oluşturun.
  • Azure CLI'nın 1.4.23 veya sonraki bir sürümü. Azure Cloud Shell kullanıyorsanız en son sürüm zaten yüklüdür.

Ortam değişkenlerini dışarı aktarma

Gerekli kimlikleri yapılandırma adımlarını basitleştirmek için aşağıdaki komutları çalıştırarak ortam değişkenlerini tanımlayın. Bu makaledeki örnekler bu değişkenlere başvurur. Aşağıdaki değerleri kendi değerlerinizle değiştirin:

$AZSubscriptionID = "00000000-0000-0000-0000-000000000000" 
$Location = "westeurope" 
$resource_group_name = "myResourceGroup" 

$aks_cluster_name = "myAKSCluster" 

$SERVICE_ACCOUNT_NAMESPACE = "default" 
$SERVICE_ACCOUNT_NAME = "workload-identity-sa" 

$FedIdCredentialName = "myFedIdentity" 
$MSIName = "myIdentity" 

# To access key vault secrets from a pod in the cluster, include these variables:
$KVName = "KV-workload-id" 
$KVSecretName= "KV-secret"

Etkin aboneliği ayarlama

İlk olarak aboneliğinizi geçerli etkin abonelik olarak ayarlayın. az account set komutunu abonelik kimliğiniz ile çalıştırın:

az login  
az account set -s $AZSubscriptionID

Kaynak grubu oluşturma

Azure kaynak grubu, Azure kaynaklarının dağıtıldığı ve yönetildiği mantıksal bir grupdur. Bir kaynak grubu oluşturduğunuzda, bir konum belirtmeniz istenir. Bu konum, kaynak grubu meta verilerinizin depolama konumudur ve kaynak oluşturma sırasında başka bir bölge belirtmezseniz kaynaklarınızın Azure'da çalıştırıldığı konumdur.

Kaynak grubu oluşturmak için az group create komutunu çalıştırın:

az group create --name $resource_group_name --location $Location

Aşağıdaki örnek çıktıda bir kaynak grubunun başarıyla oluşturulması gösterilmektedir:

{ 
  "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup", 
  "location": "westeurope", 
  "managedBy": null, 
  "name": "$resource_group_name", 
  "properties": { 
    "provisioningState": "Succeeded" 
  }, 
  "tags": null 
}

1. Adım: İş yükü kimliği etkin bir AKS Arc kümesi oluşturma

AKS Arc kümesi oluşturmak için hem hem de $customlocation_ID$logicnet_Id değerlerine ihtiyacınız vardır.

  • $customlocation_ID: Özel konumun Azure Resource Manager kimliği. Özel konum, Azure Yerel küme dağıtımı sırasında yapılandırılır. Altyapı yöneticiniz size özel konumun Resource Manager kimliğini vermelidir. Ayrıca, altyapı yöneticisi özel bir konum adı ve kaynak grubu adı sağlıyorsa, Resource Manager kimliğini almak için $customlocation_ID = $(az customlocation show --name "<your-custom-location-name>" --resource-group $resource_group_name --query "id" -o tsv) komutunu çalıştırabilirsiniz.
  • $logicnet_Id: Aşağıdaki adımları izleyerek oluşturulan Azure Yerel mantıksal ağının Azure Resource Manager kimliği. Altyapı yöneticiniz size mantıksal ağın Resource Manager kimliğini vermelidir. Ayrıca, altyapı yöneticisi bir mantıksal ağ adı ve kaynak grubu adı sağlıyorsa, komutunu çalıştırarak $logicnet_Id = $(az stack-hci-vm network lnet show --name "<your-lnet-name>" --resource-group $resource_group_name --query "id" -o tsv)Resource Manager kimliğini de alabilirsiniz.

az aksarc create komutunu parametresiyle --enable-oidc-issuer --enable-workload-identity çalıştırın. entra-admin-group-object-ids bilgilerinizi sağlayın ve ara sunucu modu erişimi için Microsoft Entra ID yönetici grubunun üyesi olduğunuzdan emin olun:

az aksarc create  
-n $aks_cluster_name -g $resource_group_name  
--custom-location $customlocation_ID --vnet-ids $logicnet_Id  
--aad-admin-group-object-ids <entra-admin-group-object-ids> 
--generate-ssh-keys  
--enable-oidc-issuer --enable-workload-identity

Birkaç dakika sonra komut tamamlanıp kümeyle ilgili JSON biçimli bilgileri döndürür.

Sağlanan küme başarıyla oluşturulduktan sonra iş yükü kimlik uzantısının dağıtılması biraz zaman alabilir. İş yükü kimlik uzantısı durumunu denetlemek için aşağıdaki komutu kullanın:

az connectedk8s show -n $aks_cluster_name -g $resource_group_name
# agentState = "Succeeded" 
"agentPublicKeyCertificate": "", 
  "agentVersion": "1.21.10", 
  "arcAgentProfile": { 
    "agentAutoUpgrade": "Enabled", 
    "agentErrors": [], 
    "agentState": "Succeeded", 
    "desiredAgentVersion": "", 
    "systemComponents": null 

# oidcIssuerProfile "enabled": true and "issuerUrl" present 

"oidcIssuerProfile": { 
    "enabled": true, 
    "issuerUrl": "https://oidcdiscovery-{location}-endpoint-1111111111111111.000.azurefd.net/00000000-0000-0000-0000-000000000000/11111111-1111-1111-1111-111111111111/"}

Azure portalında, Kubernetes kümenizin Özellikler bölümünde wiextension uzantısını görüntüleyebilirsiniz.

Önemli

AKS Arc kümelerine yönelik güvenlik geliştirmesinin bir parçası olarak, iş yükü kimliği etkinleştirme iki değişiklik tetikler. İlk olarak, Kubernetes hizmet hesabı imzalama anahtarı her 45 günde bir otomatik olarak döndürülür. İkincisi, --service-account-extend-token-expiration bayrak devre dışı bırakılarak belirteç geçerliliği bir yıldan en fazla 24 saate indirilir.

OIDC veren URL'sini bir ortam değişkenine kaydetme

AKS kümesi başarıyla oluşturulduktan sonra OIDC veren URL'sini alabilir ve bir ortam değişkenine kaydedebilirsiniz. Şu komutu çalıştırın:

$SERVICE_ACCOUNT_ISSUER =$(az connectedk8s show --n $aks_cluster_name --resource-group $resource_group_name --query "oidcIssuerProfile.issuerUrl" --output tsv)

2. Adım: Kubernetes hizmet hesabı oluşturma ve bunu Azure Yönetilen Kimliği'ne bağlama

İlk olarak yönetilen kimlik oluşturun. az identity create komutunu çalıştırın:

az identity create --name $MSIName --resource-group $resource_group_name --location $Location --subscription $AZSubscriptionID

Ardından yönetilen kimliğin istemci kimliği için değişkenler oluşturun:

$MSIId=$(az identity show --resource-group $resource_group_name --name $MSIName --query 'clientId' --output tsv)
$MSIPrincipalId=$(az identity show --resource-group $resource_group_name --name $MSIName --query 'principalId' --output tsv)

Kubernetes hizmet hesabı oluşturma

Bu adımda, bir Kubernetes hizmet hesabı oluşturuyor ve bunu, önceki adımda oluşturduğunuz yönetilen kimliğin istemci kimliğiyle ek açıklamalarla etiketliyorsunuz.

Kümenize bir istemci cihazından erişmek için küme bağlantısı kullanın. Daha fazla bilgi için bkz. İstemci cihazından kümenize erişme:

az connectedk8s proxy -n $aks_cluster_name -g $resource_group_name

Yeni bir CLI komut penceresi açın. Aşağıdaki komutları kopyalayıp yapıştırın:

$yaml = @"
apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    azure.workload.identity/client-id: $MSIId
  name: $SERVICE_ACCOUNT_NAME
  namespace: $SERVICE_ACCOUNT_NAMESPACE
"@

$yaml = $yaml -replace '\$MSIId', $MSIId `
               -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME `
               -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE

$yaml | kubectl apply -f -

Aşağıdaki çıkışta hizmet hesabının başarıyla oluşturulduğu gösterilmektedir:

serviceaccount/workload-identity-sa created

3. Adım: OIDC sağlayıcısına güvenmek için yönetilen kimlikte federe kimlik bilgisi oluşturma

Öncelikle, bir federe kimlik bilgisi oluşturun. Yönetilen kimlik, hizmet hesabı veren kimliğini ve konu ile birleşik kimlik kimlik bilgilerini oluşturmak için az identity federated-credential create komutunu kullanın. Microsoft Entra'daki federasyon kimlik bilgileri hakkında daha fazla bilgi için bkz . Microsoft Entra Id'de federasyon kimlik bilgilerine genel bakış.

# Create a federated credential 

az identity federated-credential create --name $FedIdCredentialName --identity-name $MSIName --resource-group $resource_group_name --issuer $SERVICE_ACCOUNT_ISSUER --subject "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}" 

# Show the federated credential 

az identity federated-credential show --name $FedIdCredentialName --resource-group $resource_group_name --identity-name $MSIName

Not

Federasyon kimlik bilgilerini ekledikten sonra yayılması birkaç saniye sürer. Hemen sonrasında yapılan belirteç istekleri, önbellek yenilenene kadar başarısız olabilir. Bu sorunu önlemek için, federasyon kimlik bilgilerini oluşturduktan sonra kısa bir gecikme eklemeyi düşünün.

4. Adım: Uygulamanızı dağıtma

Uygulama podlarınızı dağıttığınızda bildirim, Kubernetes hizmet hesabı oluşturma adımında oluşturulan hizmet hesabına başvurmalıdır. Aşağıdaki bildirim, hesaba nasıl başvurulacağını, özellikle metadata\namespace ve spec\serviceAccountName özelliklerini gösterir. `image` için bir görüntü ve `containerName` için bir konteyner adı belirlemeniz gerektiğinden emin olun.

$image = "<image>"  # Replace <image> with the actual image name 
$containerName = "<containerName>"  # Replace <containerName> with the actual container name 

$yaml = @" 
apiVersion: v1 
kind: Pod 
metadata: 
  name: sample-quick-start 
  namespace: $SERVICE_ACCOUNT_NAMESPACE 
  labels: 
    azure.workload.identity/use: "true" # Required. Only pods with this label can use workload identity. 
spec: 
  serviceAccountName: $SERVICE_ACCOUNT_NAME 
  containers: 
    - image: $image 
      name: $containerName 
"@ 

# Replace variables within the YAML content 
$yaml = $yaml -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE ` 
                -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME 

# Apply the YAML configuration 
$yaml | kubectl apply -f - 

Önemli

İş yükü kimliği kullanan uygulama podlarının, pod belirtiminde azure.workload.identity/use: "true" etiketinin bulunduğundan emin olun. Aksi takdirde, podlar yeniden başlatıldıktan sonra çalışmaz.

Örnek: Azure Key Vault'a erişim izinleri verme

Bu adımdaki yönergeler, Azure anahtar kasasındaki gizli bilgiler, anahtarlar veya sertifikalara poddan nasıl erişileceğini açıklamaktadır. Bu bölümdeki örnekler, iş yükü kimlikleri için anahtar deposunda gizli bilgilere erişimi yapılandırır, ancak anahtarlara veya sertifikalara erişimi yapılandırmak için benzer adımları gerçekleştirebilirsiniz.

Aşağıdaki örnek, pod'un anahtar kasasına erişimini sağlamak için Azure rol tabanlı erişim denetimi (Azure RBAC) izin modelinin nasıl kullanılacağını göstermektedir. Azure Key Vault için Azure RBAC izin modeli hakkında daha fazla bilgi için bkz . Azure RBAC kullanarak uygulamalara Azure anahtar kasasına erişim izni verme.

  1. Temizleme koruması ve RBAC yetkilendirmesi etkinleştirilmiş bir anahtar kasası oluşturun. Hem temizleme koruması hem de RBAC yetkilendirmesi için yapılandırılmışsa mevcut bir anahtar kasasını da kullanabilirsiniz:

    az keyvault create --name $KVName --resource-group $resource_group_name --location $Location --enable-purge-protection --enable-rbac-authorization
    
    # retrieve the key vault ID for role assignment
    $KVId=$(az keyvault show --resource-group $resource_group_name --name $KVName --query id --output tsv)
    
  2. Yeni anahtar kasasında gizli dizi oluşturabilmek için RBAC Anahtar Kasası Gizli DiziLeri Yetkilisi rolünü kendinize atayın. Yeni rol atamalarının yayılması beş dakika kadar sürebilir ve yetkilendirme sunucusu tarafından güncelleştirilebilir.

    $CALLER_OBJECT_ID=$(az ad signed-in-user show --query id -o tsv)
    
    az role assignment create --assignee-object-id $CALLER_OBJECT_ID --role "Key Vault Secrets Officer" --scope $KVId --assignee-principal-type ServicePrincipal
    
  3. Anahtar kasasında bir gizli oluşturun:

    az keyvault secret set --vault-name $KVName --name $KVSecretName --value "Hello!"
    
  4. Key Vault Gizli Dizileri Kullanıcı rolünü daha önce oluşturduğunuz kullanıcı tarafından atanan yönetilen kimliğe atayın. Bu adım, yönetilen kimliğe anahtar kasasından gizli bilgileri okuma izni verir.

    $IDENTITY_PRINCIPAL_ID=$(az identity show --name "$USER_ASSIGNED_IDENTITY_NAME" --resource-group "$resource_group_name" --query principalId --output tsv)
    
    az role assignment create --assignee-object-id $IDENTITY_PRINCIPAL_ID --role "Key Vault Secrets User" --scope $KVId --assignee-principal-type ServicePrincipal
    
  5. Anahtar kasası URL'si için bir ortam değişkeni oluşturun:

    $KVUrl=$(az keyvault show --resource-group $resource_group_name --name $KVName --query properties.vaultUri --output tsv)
    
  6. Hizmet hesabını ve anahtar kasası URL'sini kullanan bir pod dağıtın.

    $yaml = @" 
    apiVersion: v1 
    kind: Pod 
    metadata: 
      name: sample-quick-start 
      namespace: $SERVICE_ACCOUNT_NAMESPACE 
      labels: 
        azure.workload.identity/use: "true" 
    spec: 
      serviceAccountName: $SERVICE_ACCOUNT_NAME 
      containers: 
        - image: ghcr.io/azure/azure-workload-identity/msal-go 
          name: oidc 
          env: 
          - name: KEYVAULT_URL 
            value: $KVUrl 
          - name: SECRET_NAME 
            value: $KVSecretName 
      nodeSelector: 
        kubernetes.io/os: linux 
    "@ 
    
    # Replace variables within the YAML content 
    $yaml = $yaml -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE ` 
                    -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME ` 
                    -replace '\$KVUrl', $KVUrl ` 
                    -replace '\$KVSecretName', $KVSecretName 
    
    # Apply the YAML configuration 
    $yaml | kubectl --kubeconfig <path-to-aks-cluster-kubeconfig> apply -f -
    

AKS Arc kümesini silme

AKS Arc kümesini silmek için az aksarc delete komutunu kullanın:

az aksarc delete -n $aks_cluster_name -g $resource_group_name

Not

PodDisruptionBudget (PDB) kaynaklarıyla bir AKS Arc kümesini sildiğinizde, silme işlemi bu PDB kaynaklarını kaldıramayabilir. Microsoft sorunun farkındadır ve bir düzeltme üzerinde çalışmaktadır.

PDB, iş yükü kimliği etkin AKS Arc kümelerinde varsayılan olarak yüklenir. İş yükü kimliğinin etkinleştirildiği AKS Arc kümesini silmek içinsorun giderme kılavuzuna bakın.

Sonraki adımlar

Bu makalede bir Kubernetes kümesi dağıttınız ve uygulama iş yüklerinin kimlik doğrulaması yapabilmesi için bu kümeyi bir iş yükü kimliği kullanacak şekilde yapılandırdınız. Artık uygulamanızı dağıtmaya ve Azure Identity istemci kitaplığının en son sürümüyle iş yükü kimliğini kullanacak şekilde yapılandırmaya hazırsınız.

Azure Arc tarafından etkinleştirilen AKS güvenlik kitabındaki yönergeleri izleyerek kümenizin korunmasına başka yollarla da yardımcı olabilirsiniz.