Aracılığıyla paylaş


Azure Kubernetes Service'te Microsoft Entra pod ile yönetilen kimlikleri kullanma (Önizleme)

Microsoft Entra pod ile yönetilen kimlikler, Azure kaynakları için yönetilen kimlikleri ve Microsoft Entra Kimliği'ndeki kimlikleri podlarla ilişkilendirmek için Kubernetes temel öğelerini kullanır. Yöneticiler, podların kimlik sağlayıcısı olarak Microsoft Entra Id kullanan Azure kaynaklarına erişmesine olanak sağlayan Kubernetes temel bilgileri olarak kimlikler ve bağlamalar oluşturur.

Önemli

Microsoft Entra İş Yükü Kimliği gözden geçirmenizi öneririz. Bu kimlik doğrulama yöntemi, uygulama adına herhangi bir dış kimlik sağlayıcısıyla federasyon sağlamak için Kubernetes yerel özellikleriyle tümleşen pod ile yönetilen kimliğin (önizleme) yerini alır.

Azure Kubernetes Service'teki açık kaynak Microsoft Entra pod yönetilen kimliği (önizleme) 24.10.2022 tarihinde kullanımdan kaldırılmıştır ve proje Eylül 2023'te arşivlenmiştir. Daha fazla bilgi için kullanımdan kaldırma bildirimine bakın. AKS Yönetilen eklentisi Eylül 2024'te kullanımdan kaldırmaya başlar.

AKS Yönetilen eklentisini devre dışı bırakmak için şu komutu kullanın: az feature unregister --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview".

Başlamadan önce

Azure CLI sürüm 2.20.0 veya üzeri yüklü olmalıdır.

Sınırlamalar

  • Küme için en fazla 200 pod ile yönetilen kimlik kullanılabilir.
  • Bir küme için en fazla 200 pod tarafından yönetilen kimlik özel durumuna izin verilir.
  • Pod ile yönetilen kimlikler yalnızca Linux düğüm havuzlarında kullanılabilir.
  • Bu özellik yalnızca Sanal Makine Ölçek Kümeleri desteklenen kümeler için desteklenir.

aks-preview Azure CLI uzantısını yükleme

Önemli

AKS ö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. AKS önizlemeleri, müşteri desteği tarafından kısmen en iyi çaba temelinde ele alınmaktadır. Bu nedenle, bu özellikler üretim kullanımı için tasarlanmamıştır. Daha fazla bilgi için aşağıdaki destek makalelerine bakın:

aks-preview uzantısını yüklemek için aşağıdaki komutu çalıştırın:

az extension add --name aks-preview

Yayımlanan uzantının en son sürümüne güncelleştirmek için aşağıdaki komutu çalıştırın:

az extension update --name aks-preview

'EnablePodIdentityPreview' özellik bayrağını kaydetme

EnablePodIdentityPreview Aşağıdaki örnekte gösterildiği gibi az feature register komutunu kullanarak özellik bayrağını kaydedin:

az feature register --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

Durumun Kayıtlı olarak gösterilmesi birkaç dakika sürer. az feature show komutunu kullanarak kayıt durumunu doğrulayın:

az feature show --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

Durum Kayıtlı olarak gösterildiğinde az provider register komutunu kullanarak Microsoft.ContainerService kaynak sağlayıcısının kaydını yenileyin:

az provider register --namespace Microsoft.ContainerService

İşlem modu seçenekleri

Microsoft Entra pod ile yönetilen kimlik iki işlem modunu destekler:

  • Standart Mod: Bu modda, AKS kümesine aşağıdaki iki bileşen dağıtılır:
    • Yönetilen Kimlik Denetleyicisi (MIC):MIC, Kubernetes API Sunucusu aracılığıyla podlarda, AzureIdentity'de ve AzureIdentityBinding'de yapılan değişiklikleri izleyen bir Kubernetes denetleyicisidir. İlgili bir değişiklik algıladığında, MIC gerektiğinde AzureAssignedIdentity ekler veya siler. Özel olarak, bir pod zamanlandığında, MIC Azure'da yönetilen kimliği oluşturma aşamasında düğüm havuzu tarafından kullanılan temel Sanal Makine Ölçek Kümesine atar. Kimliği kullanan tüm podlar silindiğinde, aynı yönetilen kimlik diğer podlar tarafından kullanılmadığı sürece kimliği düğüm havuzunun Sanal Makine Ölçek Kümesinden kaldırır. AzureIdentity veya AzureIdentityBinding oluşturulduğunda veya silindiğinde MIC de benzer eylemler gerçekleştirir.
    • Düğüm Yönetilen Kimliği (NMI): NMI, AKS kümesindeki her düğümde DaemonSet olarak çalışan bir poddur. NMI, her düğümdeki Azure Örnek Meta Veri Hizmeti'ne yönelik güvenlik belirteci isteklerini durdurur, bunları kendisine yönlendirir ve podun belirteç istediği kimliğe erişimi olup olmadığını doğrular ve uygulama adına Microsoft Entra kiracısından belirteci getirir.
  • Yönetilen Mod: Bu mod yalnızca NMI sunar. AKS kümesi eklentisi aracılığıyla yüklendiğinde Azure, kullanıcının CLI komutlarına yanıt olarak Kubernetes temel öğelerinin (AzureIdentity ve AzureIdentityBinding) oluşturulmasını ve kimlik atamasını yönetir. Aksi takdirde Helm grafiği aracılığıyla yüklenirse, kimliğin kullanıcı tarafından el ile atanması ve yönetilmesi gerekir. Daha fazla bilgi için bkz . Yönetilen modda pod kimliği.

Microsoft Entra pod yönetilen kimliğini Yükleme Kılavuzu'nda gösterildiği gibi Helm grafiği veya YAML bildirimi aracılığıyla yüklediğinizde, ve managed modu arasında standard seçim yapabilirsiniz. Bunun yerine, bu makalede gösterildiği gibi AKS kümesi eklentisini kullanarak Microsoft Entra pod yönetilen kimliğini yüklemeye karar verirseniz, kurulum modu kullanır managed .

Azure Container Networking Interface (CNI) ile AKS kümesi oluşturma

Not

Bu varsayılan önerilen yapılandırmadır

Azure CNI ve pod ile yönetilen kimlik etkin bir AKS kümesi oluşturun. Aşağıdaki komutlar myResourceGroup adlı bir kaynak grubu oluşturmak için az group create ve myResourceGroup kaynak grubunda myAKSCluster adlı bir AKS kümesi oluşturmak için az aks create komutunu kullanır.

az group create --name myResourceGroup --location eastus
az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --enable-pod-identity \
    --network-plugin azure \
    --generate-ssh-keys

AKS kümenizde oturum açmak için az aks get-credentials komutunu kullanın. Bu komut ayrıca geliştirme bilgisayarınızdaki istemci sertifikasını kubectl indirir ve yapılandırr.

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

Not

AKS kümenizde pod ile yönetilen kimliği etkinleştirdiğinizde, kube-system ad alanına aks-addon-exception adlı bir AzurePodIdentityException eklenir. AzurePodIdentityException, belirli etiketleri olan podların NMI sunucusu tarafından müdahale edilmeden Azure Örnek Meta Veri Hizmeti (IMDS) uç noktasına erişmesine olanak tanır. aks-addon-exception, Microsoft Entra pod ile yönetilen kimlik gibi AKS birinci taraf eklentilerinin AzurePodIdentityException'ı el ile yapılandırmak zorunda kalmadan çalışmasına olanak tanır. İsteğe bağlı olarak, , az aks pod-identity exception deleteaz aks pod-identity exception update, veya kubectlkullanarak az aks pod-identity exception addbir AzurePodIdentityException ekleyebilir, kaldırabilir ve güncelleştirebilirsiniz.

Mevcut AKS kümesini Azure CNI ile güncelleştirme

Mevcut aks kümesini Azure CNI ile pod ile yönetilen kimlik içerecek şekilde güncelleştirin.

az aks update --resource-group $MY_RESOURCE_GROUP --name $MY_CLUSTER --enable-pod-identity

Microsoft Entra pod ile yönetilen kimliklerle Kubenet ağ eklentisini kullanma

Önemli

Microsoft Entra pod yönetilen kimliğini Kubenet ile bir kümede çalıştırmak, güvenlik sorunlarından dolayı önerilen bir yapılandırma değildir. Varsayılan Kubenet yapılandırması, bir pod tarafından başka bir pod olarak hareket etmek ve sahip olması amaçlanmamış bir kimliğe erişim elde etmek için kullanılabilecek ARP kimlik sahtekarlıklarını önleyemiyor. Kubenet ile bir kümede Microsoft Entra pod ile yönetilen kimliği etkinleştirmeden önce lütfen risk azaltma adımlarını izleyin ve ilkeleri yapılandırın.

Risk azaltma

Güvenlik açığını küme düzeyinde azaltmak için, CAP_NET_RAW saldırısını sınırlamak için "Kubernetes küme kapsayıcıları yalnızca izin verilen özellikleri kullanmalıdır" Azure yerleşik ilkesini kullanabilirsiniz.

"Gerekli bırakma özellikleri"ne NET_RAW ekleme

görüntü

Azure İlkesi kullanmıyorsanız, OpenPolicyAgent erişim denetleyicisini Ağ Geçidi Denetleyicisi web kancasını doğrulayarak birlikte kullanabilirsiniz. Kümenizde Gatekeeper zaten yüklüyse K8sPSPCapabilities türündeki ConstraintTemplate değerini ekleyin:

kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper-library/master/library/pod-security-policy/capabilities/template.yaml

NET_RAW özelliğiyle Podların doğuşunu sınırlamak için bir şablon ekleyin:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPCapabilities
metadata:
  name: prevent-net-raw
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    excludedNamespaces:
      - "kube-system"
  parameters:
    requiredDropCapabilities: ["NET_RAW"]

Kubenet ağ eklentisi ile AKS kümesi oluşturma

Kubenet ağ eklentisi ve pod ile yönetilen kimlik etkinleştirilmiş bir AKS kümesi oluşturun.

az aks create \
    --resource-group $MY_RESOURCE_GROUP \
    --name $MY_CLUSTER \
    --enable-pod-identity \
    --enable-pod-identity-with-kubenet \
    --generate-ssh-keys

Mevcut AKS kümesini Kubenet ağ eklentisiyle güncelleştirme

Mevcut aks kümesini Kubenet ağ eklentisiyle pod ile yönetilen kimlik içerecek şekilde güncelleştirin.

az aks update --resource-group $MY_RESOURCE_GROUP --name $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet

Kimlik oluşturma

Önemli

Kimliği oluşturmak için aboneliğinizde ilgili izinlere (örneğin Sahip) sahip olmanız gerekir.

az identity create ile demo pod tarafından kullanılacak bir kimlik oluşturun ve IDENTITY_CLIENT_ID ve IDENTITY_RESOURCE_ID değişkenlerini ayarlayın.

az group create --name myIdentityResourceGroup --location eastus
export IDENTITY_RESOURCE_GROUP="myIdentityResourceGroup"
export IDENTITY_NAME="application-identity"
az identity create --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME}
export IDENTITY_CLIENT_ID="$(az identity show --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME} --query clientId -o tsv)"
export IDENTITY_RESOURCE_ID="$(az identity show --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME} --query id -o tsv)"

Yönetilen kimlik için izin atama

Pod'a atanacak yönetilen kimliğe, gerçekleştireceği eylemlerle uyumlu izinler verilmesi gerekir.

Tanıtımı çalıştırmak için IDENTITY_CLIENT_ID yönetilen kimliğin AKS kümenizin Sanal Makine Ölçek Kümesini içeren kaynak grubunda Sanal Makine Katılımcısı izinlerine sahip olması gerekir.

# Obtain the name of the resource group containing the Virtual Machine Scale set of your AKS cluster, commonly called the node resource group
NODE_GROUP=$(az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)

# Obtain the id of the node resource group 
NODES_RESOURCE_ID=$(az group show --name $NODE_GROUP -o tsv --query "id")

# Create a role assignment granting your managed identity permissions on the node resource group
az role assignment create --role "Virtual Machine Contributor" --assignee "$IDENTITY_CLIENT_ID" --scope $NODES_RESOURCE_ID

Pod kimliği oluşturma

kullanarak az aks pod-identity addküme için pod ile yönetilen bir kimlik oluşturun.

export POD_IDENTITY_NAME="my-pod-identity"
export POD_IDENTITY_NAMESPACE="my-app"
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME} --identity-resource-id ${IDENTITY_RESOURCE_ID}

Not

"POD_IDENTITY_NAME" RFC 1123'te tanımlandığı gibi geçerli bir DNS alt etki alanı adı olmalıdır.

Not

kullanarak pod-identity addpod ile yönetilen kimliği atadığınızda Azure CLI, pod ile yönetilen kimlik (IDENTITY_RESOURCE_ID) üzerinden Yönetilen Kimlik operatörü rolünü küme kimliğine atamayı dener.

Azure, kümenizde Azure'daki kimliği temsil eden bir AzureIdentity kaynağı ve AzureIdentity'yi seçiciye bağlayan bir AzureIdentityBinding kaynağı oluşturur. Bu kaynakları şu kaynaklarla görüntüleyebilirsiniz:

kubectl get azureidentity -n $POD_IDENTITY_NAMESPACE
kubectl get azureidentitybinding -n $POD_IDENTITY_NAMESPACE

Örnek uygulama çalıştırma

Bir pod'un Microsoft Entra pod ile yönetilen kimliği kullanması için pod, AzureIdentityBinding'den bir seçiciyle eşleşen bir değere sahip bir aadpodidbinding etiketine ihtiyaç duyar. Varsayılan olarak, seçici pod ile yönetilen kimliğin adıyla eşleşecektir, ancak çağrılırken az aks pod-identity addseçeneği kullanılarak --binding-selector da ayarlanabilir.

Microsoft Entra pod ile yönetilen kimliği kullanarak örnek bir uygulama çalıştırmak için aşağıdaki içeriğe sahip bir demo.yaml dosya oluşturun. POD_IDENTITY_NAME, IDENTITY_CLIENT_ID ve IDENTITY_RESOURCE_GROUP önceki adımlarda yer alan değerlerle değiştirin. SUBSCRIPTION_ID değerini abonelik kimliğiniz ile değiştirin.

Not

Önceki adımlarda POD_IDENTITY_NAME, IDENTITY_CLIENT_ID ve IDENTITY_RESOURCE_GROUP değişkenlerini oluşturdunuz. gibi bir komut echo kullanarak değişkenler için ayarladığınız değeri görüntüleyebilirsiniz, örneğin echo $POD_IDENTITY_NAME.

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    aadpodidbinding: $POD_IDENTITY_NAME
spec:
  containers:
  - name: demo
    image: mcr.microsoft.com/oss/azure/aad-pod-identity/demo:v1.6.3
    args:
      - --subscriptionid=$SUBSCRIPTION_ID
      - --clientid=$IDENTITY_CLIENT_ID
      - --resourcegroup=$IDENTITY_RESOURCE_GROUP
    env:
      - name: MY_POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name
      - name: MY_POD_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace
      - name: MY_POD_IP
        valueFrom:
          fieldRef:
            fieldPath: status.podIP
  nodeSelector:
    kubernetes.io/os: linux

Pod tanımında, önceki adımda çalıştırdığınız az aks pod-identity add pod ile yönetilen kimliğin adıyla eşleşen bir değere sahip bir aadpodidbinding etiketi olduğuna dikkat edin.

kullanarak kubectl applypod ile yönetilen kimliğiniz ile aynı ad alanına dağıtındemo.yaml:

kubectl apply -f demo.yaml --namespace $POD_IDENTITY_NAMESPACE

kullanarak kubectl logsörnek uygulamanın başarıyla çalıştığını doğrulayın.

kubectl logs demo --follow --namespace $POD_IDENTITY_NAMESPACE

Günlüklerde bir belirtecin başarıyla alındığını ve GET işleminin başarılı olduğunu doğrulayın.

...
successfully doARMOperations vm count 0
successfully acquired a token using the MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token)
successfully acquired a token, userAssignedID MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token) clientID(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
successfully made GET on instance metadata
...

Bir uygulamayı birden çok kimlikle çalıştırma

Bir uygulamanın birden çok kimlik kullanmasını sağlamak için pod kimlikleri oluştururken öğesini aynı seçiciye ayarlayın --binding-selector .

az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME_1} --identity-resource-id ${IDENTITY_RESOURCE_ID_1} --binding-selector myMultiIdentitySelector
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME_2} --identity-resource-id ${IDENTITY_RESOURCE_ID_2} --binding-selector myMultiIdentitySelector

Ardından pod YAML'nizdeki alanı belirttiğiniz bağlama seçici olarak ayarlayın aadpodidbinding .

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    aadpodidbinding: myMultiIdentitySelector
...

Mevcut kümede pod ile yönetilen kimliği devre dışı bırakma

Mevcut bir kümede pod ile yönetilen kimliği devre dışı bırakmak için pod ile yönetilen kimlikleri kümeden kaldırın. Ardından kümedeki özelliği devre dışı bırakın.

az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az aks update --resource-group myResourceGroup --name myAKSCluster --disable-pod-identity

Temizleme

Kümenizden Microsoft Entra pod yönetilen kimliğini kaldırmak için örnek uygulamayı ve pod ile yönetilen kimliği kümeden kaldırın. Ardından, küme kimliğinin kimliğini ve rol atamasını kaldırın.

kubectl delete pod demo --namespace $POD_IDENTITY_NAMESPACE
az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az identity delete --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME}
az role assignment delete --role "Managed Identity Operator" --assignee "$IDENTITY_CLIENT_ID" --scope "$IDENTITY_RESOURCE_ID"

Sonraki adımlar

Yönetilen kimlikler hakkında daha fazla bilgi için bkz . Azure kaynakları için yönetilen kimlikler.