استخدام الهويات المدارة بواسطة Microsoft Entra pod في خدمة Azure Kubernetes (معاينة)

تستخدم الهويات المدارة بواسطة Microsoft Entra pod أوليات Kubernetes لربط الهويات المدارة لموارد Azure والهويات في معرف Microsoft Entra بوحدات الجراب. ينشئ مسؤول istrators هويات وروابط كبدائيات Kubernetes تسمح للقرون بالوصول إلى موارد Azure التي تعتمد على معرف Microsoft Entra كموفر هوية.

هام

نوصي بمراجعة هوية حمل عمل Microsoft Entra. يحل أسلوب المصادقة هذا محل الهوية المدارة بواسطة pod (معاينة)، والتي تتكامل مع قدرات Kubernetes الأصلية للاتحاد مع أي موفري هوية خارجيين نيابة عن التطبيق.

تم إهمال الهوية مصدر مفتوح التي تديرها Microsoft Entra pod (معاينة) في خدمة Azure Kubernetes في 10/24/2022، وأرشفة المشروع في سبتمبر 2023. لمزيد من المعلومات، راجع إشعار الإهمال. تبدأ الوظيفة الإضافية المدارة AKS في الإهمال في سبتمبر 2024.

لتعطيل الوظيفة الإضافية AKS المدارة، استخدم الأمر التالي: az feature unregister --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview".

قبل البدء

يجب أن يكون لديك الإصدار 2.20.0 من Azure CLI أو إصدار أحدث مثبتا.

القيود

  • يسمح بحد أقصى 200 هوية مدارة بواسطة pod لنظام مجموعة.
  • يسمح بحد أقصى 200 استثناء هوية مدارة بواسطة pod لمجموعة.
  • تتوفر الهويات المدارة بواسطة Pod في تجمعات عقد Linux فقط.
  • هذه الميزة مدعومة فقط للمجموعات المدعومة من Virtual Machine Scale Sets.

تثبيت ملحق aks-preview Azure CLI

هام

تتوفر ميزات معاينة AKS على أساس الخدمة الذاتية والاشتراك. يتم توفير المعاينات "كما هي" و"كما هي متوفرة"، ويتم استبعادها من اتفاقيات مستوى الخدمة والضمان المحدود. تتم تغطية معاينات AKS جزئيًا بواسطة دعم العملاء على أساس بذل أفضل الجهود. على هذا النحو، هذه الميزات ليست مخصصة للاستخدام الإنتاجي. لمزيد من المعلومات، يُرجي الاطلاع على مقالات الدعم الآتية:

لتثبيت ملحق aks-preview، قم بتشغيل الأمر التالي:

az extension add --name aks-preview

قم بتشغيل الأمر التالي للتحديث إلى أحدث إصدار من الملحق الذي تم إصداره:

az extension update --name aks-preview

تسجيل علامة ميزة "EnablePodIdentityPreview"

قم بتسجيلEnablePodIdentityPreviewميزة الإشارة باستخدامتسجيل ميزة az كما هو موضح في المثال التالي:

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

يستغرق الأمر بضع دقائق حتى تظهر الحالة مُسجل. تحقق من حالة التسجيل باستخدام الأمر az feature show :

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

عندما تعكس الحالة Registered، قم بتحديث تسجيل موفر موارد Microsoft.ContainerService باستخدام الأمر az provider register:

az provider register --namespace Microsoft.ContainerService

خيارات وضع التشغيل

تدعم الهوية المدارة بواسطة Microsoft Entra وضعين للعملية:

  • الوضع القياسي: في هذا الوضع، يتم نشر المكونين التاليين إلى نظام مجموعة AKS:
    • وحدة التحكم في الهوية المُدارة (MIC): إن MIC عبارة عن وحدة تحكم Kubernetes تراقب التغييرات التي تم إجراؤها على pods و AzureIdentity و AzureIdentityBinding عبر خادم Kubernetes API. عندما يكتشف تغييراً ذات صلة، يضيف MIC أو يحذف AzureAssignedIdentityحسب الحاجة. على وجه التحديد، عند جدولة جراب، يعين MIC الهوية المدارة على Azure إلى مجموعة مقياس الجهاز الظاهري الأساسية المستخدمة من قبل تجمع العقدة أثناء مرحلة الإنشاء. عند حذف جميع الحجيرات التي تستخدم الهوية، فإنه يزيل الهوية من مجموعة مقياس الجهاز الظاهري لتجمع العقدة، ما لم يتم استخدام نفس الهوية المدارة من قبل pods الأخرى. يتخذ MIC إجراءات مماثلة عند إنشاء Azure Identity أو AzureIdentityBinding أو حذفهما.
    • Node Managed Identity (NMI): NMI عبارة عن جراب يعمل كمجموعة DaemonSet على كل عقدة في مجموعة AKS. يعترض NMI طلبات رمز الأمان المميز لخدمة بيانات تعريف مثيل Azure على كل عقدة، ويعاد توجيهها إلى نفسها ويتحقق مما إذا كان لدى الجراب حق الوصول إلى الهوية التي يطلب رمزا مميزا لها وجلب الرمز المميز من مستأجر Microsoft Entra نيابة عن التطبيق.
  • الوضع المدار: هذا الوضع يوفر NMI فقط. عند التثبيت عبر الوظيفة الإضافية للكتلة AKS، يدير Azure إنشاء العناصر الأولية لـ Kubernetes (AzureIdentity وAzureIdentityBinding) وتعيين الهوية استجابةً لأوامر CLI بواسطة المستخدم. خلاف ذلك، إذا تم التثبيت عبر مخطط Helm، فيجب تعيين الهوية يدوياً وإدارتها بواسطة المستخدم. لمزيد من المعلومات، راجعهوية Pod في الوضع المُدار.

عند تثبيت هوية Microsoft Entra pod المدارة عبر مخطط Helm أو بيان YAML كما هو موضح في دليل التثبيت، يمكنك الاختيار بين standard الوضعين و managed . إذا قررت بدلا من ذلك تثبيت هوية Microsoft Entra المدارة باستخدام الوظيفة الإضافية لنظام مجموعة AKS كما هو موضح في هذه المقالة، فسيستخدم managed الإعداد الوضع .

إنشاء مجموعة AKS باستخدام واجهة شبكة Azure Container (CNI)

إشعار

هذا هو التكوين الافتراضي الموصى به

إنشاء نظام مجموعة AKS مع تمكين Azure CNI والهوية المدارة بالجراب. تستخدم الأوامر التاليةaz group create لإنشاء مجموعة موارد تسمى myResourceGroup وأمر az aks create لإنشاء مجموعة AKS تسمى myAKSCluster في مجموعة موارد myResourceGroup.

az group create --name myResourceGroup --location eastus
az aks create -g myResourceGroup -n myAKSCluster --enable-pod-identity --network-plugin azure

استخدم الحصول على بيانات الاعتماد من az aks لتسجيل الدخول إلى مجموعة AKS الخاصة بك. يقوم هذا الأمر أيضًا بتحميل شهادة العميل وتكوينها kubectl على جهاز الكمبيوتر الخاص بك.

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

إشعار

عند تمكين الهوية المُدارة بواسطة الجراب على مجموعة AKS الخاصة بك، تتم إضافة AzurePodIdentityException المسمىaks-addon-Exception إلى مساحة اسم نظام kube. يسمح AzurePodIdentityException للبودات ذات التسميات المحددة بالوصول إلى نقطة نهاية خدمة بيانات تعريف مثيلAzure (IMDS) دون أن يعترضها خادم NMI. يسمح استثناء aks-addon ل AKS بإضافات الطرف الأول، مثل الهوية المدارة بواسطة Microsoft Entra pod، بالعمل دون الحاجة إلى تكوين AzurePodIdentityException يدويا. اختياريًّا، يمكنك إضافة AzurePodIdentityException وإزالته وتحديثه باستخدامaz aks pod-identity exception addأوaz aks pod-identity exception deleteأوaz aks pod-identity exception updateأوkubectl.

قم بتحديث مجموعة AKS الحالية باستخدام Azure CNI

قم بتحديث مجموعة AKS الحالية باستخدام Azure CNI لتضمين هوية مُدارة بواسطة البود.

az aks update -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity

استخدام المكون الإضافي لشبكة Kubenet مع الهويات المدارة بواسطة Microsoft Entra pod

هام

تشغيل هوية Microsoft Entra pod المدارة في نظام مجموعة مع Kubenet ليس تكوينا موصى به بسبب مخاوف أمنية. فشل تكوين Kubenet الافتراضي في منع انتحال ARP، والذي يمكن استخدامه بواسطة بود صغيرة للعمل كجهاز آخر والوصول إلى هوية لا يقصد امتلاكها. يرجى اتباع خطوات التخفيف وتكوين النهج قبل تمكين هوية Microsoft Entra المدارة في نظام مجموعة مع Kubenet.

التخفيف

لتقليل الثغرة الأمنية على مستوى المجموعة، تستطيع استخدام نهج Azure المدمج "يجب أن تستخدم حاويات مجموعة Kubernetes القدرات المسموح بها فقط" ذلك للحد من هجوم CAP_NET_RAW.

إضافة NET_RAW إلى "إمكانيات الإفلات المطلوبة"

image

إذا كنت لا تستخدم Azure Policy، فتستطيع استخدام وحدة تحكم قبول OpenPolicyAgent جنبًا إلى جنب مع Gatekeeper للتحقق من خطاف الويب. شريطة أن يكون لديك Gatekeeper مثبت بالفعل في المجموعة الخاصة بك، قم بإضافة ConstraintTemplate من النوع K8sPS:

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

إضافة قالب للحد من تكاثر القرون مع إمكانية NET_RAW:

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"]

قم بإنشاء مجموعة AKS باستخدام مكون شبكة Kubenet الإضافي

قم بإنشاء مجموعة AKS مع تمكين مكون الشبكة الإضافي Kubenet والهوية المدارة بواسطة pod.

az aks create -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet

قم بتحديث مجموعة AKS الحالية باستخدام مكون شبكة Kubenet الإضافي

قم بتحديث مجموعة AKS الحالية باستخدام مكون شبكة Kubenet الإضافي لتضمين هوية مُدارة بواسطة pod.

az aks update -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet

إنشاء هوية

هام

لا بد أن يكون لديك الأذونات ذات الصلة (على سبيل المثال، المالك) في اشتراكك لإنشاء الهوية.

قم بإنشاء هوية سيتم استخدامها بواسطة البود التوضيحي مع az identity create وتعيين المتغيرين IDENTITY_CLIENT_ID وIDENTITY_RESOURCE_ID.

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 -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME} --query clientId -otsv)"
export IDENTITY_RESOURCE_ID="$(az identity show -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME} --query id -otsv)"

تعيين أذونات من أجل الهوية المدارة

يجب منح الهوية المُدارة التي سيتم تعيينها للبود أذونات تتوافق مع الإجراءات التي ستتخذها.

لتشغيل العرض التوضيحي، يجب أن يكون للهوية المدارة IDENTITY_CLIENT_ID أذونات مساهم الجهاز الظاهري في مجموعة الموارد التي تحتوي على مجموعة مقياس الجهاز الظاهري لمجموعة AKS الخاصة بك.

# 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 -g myResourceGroup -n myAKSCluster --query nodeResourceGroup -o tsv)

# Obtain the id of the node resource group 
NODES_RESOURCE_ID=$(az group show -n $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 للمجموعة باستخدام az aks pod-identity add.

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}

إشعار

يجب أن يكون "POD_IDENTITY_NAME" اسم نطاق فرعيصالح لنظام بالنسبة لأسماءالنطاقات كما هو محدد فيRFC 1123.

إشعار

عند تعيين الهوية المدارة بواسطة pod باستخدام pod-identity add، يحاول Azure CLI منح دور عامل تشغيل الهوية المدارة عبر الهوية المدارة بواسطة pod (IDENTITY_RESOURCE_ID) إلى هوية نظام المجموعة.

سيقوم Azure بإنشاء مورد AzureIdentity في مجموعتك يمثل الهوية في Azure، ومورد AzureIdentityBinding الذي يربط AzureIdentity بمحدد. يمكنك عرض هذه الموارد مع

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

تشغيل نموذج التطبيق

لكي تستخدم pod هوية Microsoft Entra pod المدارة، تحتاج الجراب إلى تسمية aadpodidbinding بقيمة تطابق محددا من AzureIdentityBinding. بشكل افتراضي، سيطابق المحدد اسم الهوية المدارة بواسطة pod، ولكن يمكن أيضا تعيينه باستخدام --binding-selector الخيار عند استدعاء az aks pod-identity add.

لتشغيل نموذج تطبيق باستخدام هوية Microsoft Entra pod المدارة، قم بإنشاء demo.yaml ملف بالمحتويات التالية. استبدل POD_IDENTITY_NAME و IDENTITY_CLIENT_ID و IDENTITY_RESOURCE_GROUP بالقيم من الخطوات السابقة. استبدل SUBSCRIPTION_ID بمعرف اشتراكك.

إشعار

في الخطوات السابقة، لقد قمت بإنشاء متغيرات POD_IDENTITY_NAME و IDENTITY_CLIENT_ID و IDENTITY_RESOURCE_GROUP. يمكنك استخدام أمر مثل echoعرض القيمة التي قمت بتعيينها للمتغيرات، على سبيل 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

لاحظ أن تعريف الجراب يحتوي على تسمية aadpodidbinding بقيمة تطابق اسم الهوية المدارة بواسطة pod التي قمت بتشغيلها az aks pod-identity add في الخطوة السابقة.

النشر demo.yaml إلى نفس مساحة الاسم مثل الهوية المدارة بواسطة pod باستخدام kubectl apply:

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

تحقق من أن نموذج التطبيق يعمل بنجاح باستخدامkubectl logs.

kubectl logs demo --follow --namespace $POD_IDENTITY_NAMESPACE

تحقق من أن السجلات تُظهر أنه تم الحصول على رمز مميز بنجاح وأن عملية GET ناجحة.

...
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
...

تشغيل تطبيق بهويات متعددة كثيرة

لتمكين تطبيق ما من استخدام هويات متعددة، قم--binding-selector بتعيين نفس المحدد عند إنشاء هويات pod.

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

ثم قمaadpodidbinding بضبط الحقل في جراب YAML على محدد الربط الذي حددته.

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

تعطيل الهوية المدارة بواسطة الجراب على نظام مجموعة موجود

لتعطيل الهوية المدارة بواسطة pod على نظام مجموعة موجود، قم بإزالة الهويات المدارة بواسطة pod من نظام المجموعة. ثم قم بتعطيل الميزة على نظام المجموعة.

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

تنظيف

لإزالة هوية مدارة بواسطة Microsoft Entra pod من مجموعتك، قم بإزالة نموذج التطبيق والهوية المدارة بواسطة pod من نظام المجموعة. ثم قم بإزالة الهوية وتعيين الدور لهوية نظام المجموعة.

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 -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME}
az role assignment delete --role "Managed Identity Operator" --assignee "$IDENTITY_CLIENT_ID" --scope "$IDENTITY_RESOURCE_ID"

الخطوات التالية

لمزيد من المعلومات حول الهويات المُدارة بشكل عام، اطلع على الهويات المُدارة لمصادر وموارد Azure.