إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
في هذا المقال، ستتعلم كيفية نشر وتكوين عنقود خدمة Azure Kubernetes (AKS) باستخدام هوية حمل عمل Microsoft Entra. تشمل الخطوات الواردة في هذا المقال:
- أنشئ مجموعة جديدة أو حدثت مجموعة AKS موجودة باستخدام Azure CLI أو Terraform مع إصدار OpenID Connect (OIDC) ومعالج هوية حمل عمل Microsoft Entra مفعل.
- أنشئ هوية عبء العمل وحساب خدمة Kubernetes.
- تكوين الهوية المدارة لاتحاد الرمز المميز.
- انشر حمل العمل وتحقق من المصادقة باستخدام هوية حمل العمل.
- اختياريا، امنح كبسولة في العنقود وصولا إلى الأسرار في خزنة مفاتيح Azure.
المتطلبات الأساسية
- إذا لم يكن لديك حساب Azure، أنشئ حسابا مجاني قبل أن تبدأ.
- تتطلب هذه المقالة الإصدار 2.47.0 أو أحدثه من Azure CLI. إذا كنت تستخدم Azure Cloud Shell، فإن الإصدار الأخير مثبت بالفعل. قم بتشغيل
az --versionللعثور على الإصدار. إذا كنت بحاجة إلى تثبيت أو ترقية، راجع تثبيت Azure CLI. - تأكد من أن الهوية التي تستخدمها لإنشاء نظام المجموعة الخاص بك لديها الحد الأدنى المناسب من الأذونات. لمزيد من المعلومات، راجع خيارات الوصول والهوية ل خدمة Azure Kubernetes (AKS).
- إذا كان لديك عدة اشتراكات Azure، اختر معرف الاشتراك المناسب الذي يجب فيه فوترة الموارد باستخدام أمر
az account set.
- تم تثبيت Terraform محليا. للحصول على تعليمات التثبيت، راجع تثبيت Terraform.
إشعار
يمكنك استخدام Service Connector لمساعدتك في تكوين بعض الخطوات تلقائيا. لمزيد من المعلومات، راجع Instruction: الاتصال بحساب التخزين Azure في خدمة Azure Kubernetes (AKS) باستخدام Service Connector باستخدام هوية حمل عمل Microsoft Entra.
إنشاء ملف تكوين Terraform
ملفات تكوين تيرافورم تحدد البنية التحتية التي ينشئها ويديرها تيرافورم.
أنشئ ملفا باسم
main.tfوأضف الكود التالي لتعريف نسخة Terraform وتحديد مزود Azure:terraform { required_version = ">= 1.5.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 4.0" } kubernetes = { source = "hashicorp/kubernetes" version = "~> 2.30" } random = { source = "hashicorp/random" version = "~> 3.6" } } } provider "azurerm" { features {} subscription_id = var.subscription_id } data "azurerm_client_config" "current" {}أضف الكود التالي إلى
main.tfلتعريف المتغيرات القابلة لإعادة الاستخدام وتوليد أسماء فريدة لجميع الموارد:resource "random_string" "suffix" { length = 6 upper = false special = false numeric = true } locals { suffix = random_string.suffix.result resource_group_name = "rg-aks-wi-${local.suffix}" cluster_name = "akswi${local.suffix}" managed_identity_name = "uami-wi-${local.suffix}" federated_credential_name = "fic-wi-${local.suffix}" key_vault_name = lower(substr("kvwi${local.suffix}", 0, 24)) secret_name = "secret-${local.suffix}" service_account_name = "workload-sa-${local.suffix}" service_account_namespace = "default" workload_identity_subject = "system:serviceaccount:${local.service_account_namespace}:${local.service_account_name}" }
إنشاء مجموعة موارد
إنشاء مجموعة موارد باستخدام az group create الأمر .
export RANDOM_ID="$(openssl rand -hex 3)"
export RESOURCE_GROUP="myResourceGroup$RANDOM_ID"
export LOCATION="<your-preferred-region>"
az group create --name "${RESOURCE_GROUP}" --location "${LOCATION}"
أضف الكود التالي إلى main.tf لإنشاء مجموعة موارد Azure. قم بتحديث قيمة location لتتناسب مع منطقة Azure المفضلة لديك.
resource "azurerm_resource_group" "this" {
name = local.resource_group_name
location = "eastus"
}
تمكين مصدر OIDC ومعرف هوية حمل عمل Microsoft Entra على عنقود AKS
يمكنك تفعيل إصدار OIDC ومعرف هوية حمل عمل Microsoft Entra على عنقود AKS جديد أو موجود.
إنشاء عنقود AKS باستخدام أمر az aks create مع معامل --enable-oidc-issuer لتمكين مصدر OIDC ومعلمة --enable-workload-identity لتفعيل هوية حمل عمل Microsoft Entra. ينشئ المثال التالي مجموعة مع عقدة واحدة:
export CLUSTER_NAME="myAKSCluster$RANDOM_ID"
az aks create \
--resource-group "${RESOURCE_GROUP}" \
--name "${CLUSTER_NAME}" \
--enable-oidc-issuer \
--enable-workload-identity \
--generate-ssh-keys
بعد بضع دقائق، الأمر إكمال وإرجاع معلومات منسقة JSON حول الكتلة.
أضف الكود التالي إلى main.tf لإنشاء مجموعة AKS مع مفعل مصدر OIDC هوية حمل عمل Microsoft Entra:
resource "azurerm_kubernetes_cluster" "this" {
name = local.cluster_name
location = azurerm_resource_group.this.location
resource_group_name = azurerm_resource_group.this.name
dns_prefix = local.cluster_name
oidc_issuer_enabled = true
workload_identity_enabled = true
role_based_access_control_enabled = true
default_node_pool {
name = "system"
node_count = 1
vm_size = "Standard_B4ms"
}
identity {
type = "SystemAssigned"
}
}
استرداد عنوان URL لمصدر OIDC
احصل على رابط مصدر OIDC باستخدام az aks show الأمر واحفظه في متغير بيئي.
export AKS_OIDC_ISSUER="$(az aks show --name "${CLUSTER_NAME}" \
--resource-group "${RESOURCE_GROUP}" \
--query "oidcIssuerProfile.issuerUrl" \
--output tsv)"
يجب أن يحتوي متغير البيئة على عنوان URL المصدر، على غرار المثال التالي:
https://eastus.oic.prod-aks.azure.com/00000000-0000-0000-0000-000000000000/11111111-1111-1111-1111-111111111111/
بشكل افتراضي، يتم تعيين المصدر لاستخدام عنوان URL https://{region}.oic.prod-aks.azure.com/{tenant_id}/{uuid}الأساسي ، حيث تطابق قيمة الموقع {region} الذي يتم نشر نظام مجموعة AKS إليه. تمثل القيمة {uuid} مفتاح OIDC، وهو واجهة مستخدم عشوائي وغير قابلة للتغيير لكل عنقود.
أضف الرمز التالي إلى main.tf لاسترجاع عنوان مصدر OIDC:
output "oidc_issuer_url" {
value = azurerm_kubernetes_cluster.this.oidc_issuer_url
}
إنشاء هوية مدارة
احصل على معرف اشتراكك واحفظه في متغير بيئي باستخدام
az account showالأمر.export SUBSCRIPTION="$(az account show --query id --output tsv)"إنشاء هوية مدارة يعينها المستخدم باستخدام
az identity createالأمر .export USER_ASSIGNED_IDENTITY_NAME="myIdentity$RANDOM_ID" az identity create \ --name "${USER_ASSIGNED_IDENTITY_NAME}" \ --resource-group "${RESOURCE_GROUP}" \ --location "${LOCATION}" \ --subscription "${SUBSCRIPTION}"يوضح مثال الإخراج التالي الإنشاء الناجح لهوية مدارة:
{ "clientId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroupxxxxxx/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentityxxxxxx", "location": "eastus", "name": "myIdentityxxxxxx", "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "resourceGroup": "myResourceGroupxxxxxx", "systemData": null, "tags": {}, "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "type": "Microsoft.ManagedIdentity/userAssignedIdentities" }احصل على معرف العميل للهوية المدارة واحفظه في متغير بيئة باستخدام
az identity showالأمر.export USER_ASSIGNED_CLIENT_ID="$(az identity show \ --resource-group "${RESOURCE_GROUP}" \ --name "${USER_ASSIGNED_IDENTITY_NAME}" \ --query 'clientId' \ --output tsv)"
أضف الكود التالي إلى main.tf لإنشاء هوية مدارة:
resource "azurerm_user_assigned_identity" "this" {
name = local.managed_identity_name
location = azurerm_resource_group.this.location
resource_group_name = azurerm_resource_group.this.name
}
إنشاء حساب خدمة Kubernetes
اتصل بمجموعة AKS الخاصة بك باستخدام
az aks get-credentialsالأمر .az aks get-credentials --name "${CLUSTER_NAME}" --resource-group "${RESOURCE_GROUP}"أنشئ حساب خدمة Kubernetes وقم بإضافة معرف العميل للهوية المدارة عليه عن طريق تطبيق البيان التالي باستخدام
kubectl applyالأمر.export SERVICE_ACCOUNT_NAME="workload-identity-sa$RANDOM_ID" export SERVICE_ACCOUNT_NAMESPACE="default" cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: "${USER_ASSIGNED_CLIENT_ID}" name: "${SERVICE_ACCOUNT_NAME}" namespace: "${SERVICE_ACCOUNT_NAMESPACE}" EOFيظهر الإخراج التالي الإنشاء الناجح لهوية حمل العمل:
serviceaccount/workload-identity-sa created
أضف الكود التالي لتكوين
main.tfوصول Kubernetes للسماح بإنشاء موارد Kubernetes:data "azurerm_kubernetes_cluster" "this" { name = azurerm_kubernetes_cluster.this.name resource_group_name = azurerm_resource_group.this.name } provider "kubernetes" { host = data.azurerm_kubernetes_cluster.this.kube_config[0].host client_certificate = base64decode(data.azurerm_kubernetes_cluster.this.kube_config[0].client_certificate) client_key = base64decode(data.azurerm_kubernetes_cluster.this.kube_config[0].client_key) cluster_ca_certificate = base64decode(data.azurerm_kubernetes_cluster.this.kube_config[0].cluster_ca_certificate) }أضف الكود التالي لإنشاء
main.tfحساب خدمة Kubernetes وأضف له التعليق عليه بمعرف العميل للهوية المدارة:resource "kubernetes_service_account" "this" { metadata { name = local.service_account_name namespace = local.service_account_namespace annotations = { "azure.workload.identity/client-id" = azurerm_user_assigned_identity.this.client_id } } }
إنشاء بيانات اعتماد الهوية الموحدة
إنشاء بيانات اعتماد هوية اتحادية بين الهوية المدارة، ومصدري حساب الخدمة، والموضوع باستخدام الأمر az identity federated-credential create .
export FEDERATED_IDENTITY_CREDENTIAL_NAME="myFedIdentity$RANDOM_ID"
az identity federated-credential create \
--name ${FEDERATED_IDENTITY_CREDENTIAL_NAME} \
--identity-name "${USER_ASSIGNED_IDENTITY_NAME}" \
--resource-group "${RESOURCE_GROUP}" \
--issuer "${AKS_OIDC_ISSUER}" \
--subject system:serviceaccount:"${SERVICE_ACCOUNT_NAMESPACE}":"${SERVICE_ACCOUNT_NAME}" \
--audience api://AzureADTokenExchange
إشعار
يستغرق نشر بيانات اعتماد الهوية الموحدة بضع ثوان بعد إضافتها. إذا تم إجراء طلب رمز مميز مباشرة بعد إضافة بيانات اعتماد الهوية الموحدة، فقد يفشل الطلب حتى يتم تحديث ذاكرة التخزين المؤقت. لتجنب هذه المشكلة، يمكنك إضافة تأخير طفيف بعد إضافة بيانات اعتماد الهوية الموحدة.
أضف الكود التالي لإنشاء main.tf بيانات هوية اتحادية بين الهوية المدارة، ومصدري حساب الخدمة، والموضوع:
resource "azurerm_federated_identity_credential" "this" {
name = local.federated_credential_name
resource_group_name = azurerm_resource_group.this.name
parent_id = azurerm_user_assigned_identity.this.id
issuer = azurerm_kubernetes_cluster.this.oidc_issuer_url
subject = local.workload_identity_subject
audience = ["api://AzureADTokenExchange"]
}
لمزيد من المعلومات حول بيانات الهوية الفيدرالية في Microsoft Entra، راجع نظرة عامة على بيانات الهوية الفيدرالية في Microsoft Entra ID.
إنشاء خزنة مفاتيح باستخدام تفويض Azure RBAC
يوضح المثال التالي كيفية استخدام نموذج الإذن Azure التحكم في الوصول القائم على الأدوار (Azure RBAC) لمنح الوحدة الوصول إلى خزنة المفاتيح. لمزيد من المعلومات حول نموذج Azure صلاحيات RBAC ل Azure Key Vault، راجع منح الإذن للطلبات للوصول إلى Azure key vault باستخدام Azure RBAC.
أنشئ خزنة مفاتيح مع حماية التطهير وتفويض Azure تفويض RBAC باستخدام أمر
az keyvault create. يمكنك أيضا استخدام خزنة مفاتيح موجودة إذا كانت مهيأة لكل من الحماية من التطهير وتفويض Azure RBAC.export KEYVAULT_NAME="keyvault-workload-id$RANDOM_ID" # Ensure the key vault name is between 3-24 characters az keyvault create \ --name "${KEYVAULT_NAME}" \ --resource-group "${RESOURCE_GROUP}" \ --location "${LOCATION}" \ --enable-purge-protection \ --enable-rbac-authorizationاحصل على معرف مورد خزنة المفاتيح واحفظه في متغير بيئة باستخدام
az keyvault showالأمر.export KEYVAULT_RESOURCE_ID=$(az keyvault show --resource-group "${RESOURCE_GROUP}" \ --name "${KEYVAULT_NAME}" \ --query id \ --output tsv)
أضف الكود التالي إلى main.tf لإنشاء خزنة مفاتيح بموافقة Azure RBAC:
resource "azurerm_key_vault" "this" {
name = local.key_vault_name
location = azurerm_resource_group.this.location
resource_group_name = azurerm_resource_group.this.name
tenant_id = data.azurerm_client_config.current.tenant_id
sku_name = "standard"
rbac_authorization_enabled = true
}
تعيين صلاحيات RBAC لإدارة خزنة المفاتيح
احصل على معرف كائن المتصل واحفظه في متغير بيئة باستخدام
az ad signed-in-user showالأمر.export CALLER_OBJECT_ID=$(az ad signed-in-user show --query id -o tsv)خصص لنفسك دور Azure RBAC Key Vault ضابط الأسرار حتى تتمكن من إنشاء سر في key vault الجديد باستخدام أمر
az role assignment create.az role assignment create --assignee "${CALLER_OBJECT_ID}" \ --role "Key Vault Secrets Officer" \ --scope "${KEYVAULT_RESOURCE_ID}"
أضف الكود التالي إلى main.tf لتعيين دور Azure RBAC Key Vault مسؤول الأسرار حتى تتمكن من إنشاء سر في key vault الجديد وتعيين دور Key Vault Secrets User إلى الهوية المدارة التي يعينها المستخدم:
resource "azurerm_role_assignment" "user" {
scope = azurerm_key_vault.this.id
role_definition_name = "Key Vault Secrets Officer"
principal_id = data.azurerm_client_config.current.object_id
}
resource "azurerm_role_assignment" "identity" {
scope = azurerm_key_vault.this.id
role_definition_name = "Key Vault Secrets User"
principal_id = azurerm_user_assigned_identity.this.principal_id
}
إنشاء وتكوين الوصول السري
إنشاء سر في مخزن المفاتيح باستخدام
az keyvault secret setالأمر .export KEYVAULT_SECRET_NAME="my-secret$RANDOM_ID" az keyvault secret set \ --vault-name "${KEYVAULT_NAME}" \ --name "${KEYVAULT_SECRET_NAME}" \ --value "Hello\!"احصل على المعرف الرئيسي للهوية المدارة المعينة من قبل المستخدم واحفظه في متغير بيئة باستخدام
az identity showالأمر.export IDENTITY_PRINCIPAL_ID=$(az identity show \ --name "${USER_ASSIGNED_IDENTITY_NAME}" \ --resource-group "${RESOURCE_GROUP}" \ --query principalId \ --output tsv)تعيين دور Key Vault Secrets User للهوية المدارة المعينة من قبل المستخدم باستخدام أمر
az role assignment create. تمنح هذه الخطوة الهوية المدارة إذنا لقراءة الأسرار من خزنة المفاتيح.az role assignment create \ --assignee-object-id "${IDENTITY_PRINCIPAL_ID}" \ --role "Key Vault Secrets User" \ --scope "${KEYVAULT_RESOURCE_ID}" \ --assignee-principal-type ServicePrincipalأنشئ متغير بيئة لعنوان URL خزنة المفاتيح باستخدام
az keyvault showالأمر.export KEYVAULT_URL="$(az keyvault show \ --resource-group "${RESOURCE_GROUP}" \ --name ${KEYVAULT_NAME} \ --query properties.vaultUri \ --output tsv)"
أضف الكود التالي لإنشاء main.tf سر في خزنة المفاتيح:
resource "azurerm_key_vault_secret" "this" {
name = local.secret_name
value = "Hello from Key Vault"
key_vault_id = azurerm_key_vault.this.id
}
نشر وحدة التحقق واختبار الوصول
نشر وحدة للتحقق من أن هوية عبء العمل يمكنها الوصول إلى السر في خزنة المفتاح. المثال التالي يستخدم صورة
ghcr.io/azure/azure-workload-identity/msal-go، والتي تحتوي على تطبيق نموذجي يستخرج سرا من Azure Key Vault باستخدام هوية حمل عمل Microsoft Entra:kubectl apply -f - <<EOF apiVersion: v1 kind: Pod metadata: name: sample-workload-identity-key-vault 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: ${KEYVAULT_URL} - name: SECRET_NAME value: ${KEYVAULT_SECRET_NAME} nodeSelector: kubernetes.io/os: linux EOFانتظر حتى تصل الكبسولة إلى الحالة التي
Readyتستخدم الأمرkubectl wait.kubectl wait --namespace ${SERVICE_ACCOUNT_NAMESPACE} --for=condition=Ready pod/sample-workload-identity-key-vault --timeout=120sتحقق من أن متغير
SECRET_NAMEالبيئة مضبوط في الوحدة باستخدامkubectl describeالأمر.kubectl describe pod sample-workload-identity-key-vault | grep "SECRET_NAME:"إذا نجحت ، يجب أن يكون الإخراج مشابها للمثال التالي:
SECRET_NAME: ${KEYVAULT_SECRET_NAME}تحقق من أن الكبسولات يمكنها الحصول على رمز والوصول إلى المورد باستخدام الأمر
kubectl logs.kubectl logs sample-workload-identity-key-vaultإذا نجحت ، يجب أن يكون الإخراج مشابها للمثال التالي:
I0114 10:35:09.795900 1 main.go:63] "successfully got secret" secret="Hello\\!"هام
قد تستغرق تعيينات أدوار Azure RBAC حتى 10 دقائق للنشر. إذا تعذر على الجراب الوصول إلى السر، فقد تحتاج إلى الانتظار حتى يتم نشر تعيين الدور. لمزيد من المعلومات، راجع Troubleshoot Azure RBAC.
تعطيل معرف هوية حمل عمل Microsoft Entra على مجموعة AKS
قم بتعطيل هوية حمل عمل Microsoft Entra في عنقود AKS حيث تم تفعيله وتكوينه، وقم بتحديث تجمع AKS باستخدام أمر az aks update مع معامل --disable-workload-identity.
az aks update \
--resource-group "${RESOURCE_GROUP}" \
--name "${CLUSTER_NAME}" \
--disable-workload-identity
نشر وحدة التحقق
أضف الكود التالي لنشر main.tf وحدة تحقق تستخدم هوية عبء العمل للوصول إلى السر في خزنة المفاتيح:
resource "kubernetes_pod" "test" {
metadata {
name = "workload-identity-test"
namespace = local.service_account_namespace
labels = {
"azure.workload.identity/use" = "true"
}
}
spec {
service_account_name = kubernetes_service_account.this.metadata[0].name
container {
name = "test"
image = "ghcr.io/azure/azure-workload-identity/msal-go"
env {
name = "KEYVAULT_URL"
value = azurerm_key_vault.this.vault_uri
}
env {
name = "SECRET_NAME"
value = azurerm_key_vault_secret.this.name
}
}
}
}
تهيئة Terraform
قم بتهيئة Terraform في الدليل الذي يحتوي على ملفك main.tf باستخدام الأمر.terraform init يقوم هذا الأمر بتنزيل مزود Azure المطلوب لإدارة موارد Azure باستخدام Terraform.
terraform init
إنشاء خطة تنفيذ Terraform
إنشاء خطة تنفيذ Terraform باستخدام terraform plan الأمر . هذا الأمر يعرض لك الموارد التي سيخلقها Terraform أو يعدلها في اشتراكك في Azure.
terraform plan
تطبيق تكوين Terraform
بعد مراجعة وتأكيد خطة التنفيذ، طبق تكوين Terraform باستخدام terraform apply الأمر. يقوم هذا الأمر بإنشاء أو تعديل الموارد المعرفة في ملف main.tf الخاص بك في اشتراك Azure الخاص بك.
terraform apply
تحقق من التوزيع
اتصل بمجموعة AKS الخاصة بك باستخدام
az aks get-credentialsالأمر .az aks get-credentials --name <cluster-name> --resource-group <resource-group>تحقق من حالة وحدة التحقق باستخدام
kubectl get podsالأمر.بمجرد وصول
Readyالكبسولة إلى حالة، تحقق من أنها تستطيع الوصول إلى سر خزنة المفاتيح من خلال التحقق من سجلات الكبسولة باستخدامkubectl logsالأمر.kubectl logs workload-identity-test
المحتوى ذو الصلة
في هذا المقال، قمت بنشر عنقود Kubernetes وقمت بتكوينها لاستخدام هوية حمل عمل Microsoft Entra استعدادا لأحمال العمل للتطبيقات للتحقق باستخدام تلك الاعتمادات. الآن أنت جاهز لنشر تطبيقك وتكوينه لاستخدام هوية عبء العمل مع أحدث إصدار من مكتبة عملاء Azure Identity. إذا لم تتمكن من إعادة كتابة التطبيق الخاص بك لاستخدام أحدث إصدار لمكتبة العميل، يمكنك إعداد جراب التطبيق الخاص بك للمصادقة باستخدام الهوية المدارة مع هوية حمل العمل كحل ترحيل قصير الأجل.
يساعد تكامل Service Connector في تبسيط تكوين الاتصال لأحمال عمل AKS وخدمات الدعم Azure. يتعامل مع المصادقة وتكوينات الشبكة بشكل آمن ويتبع أفضل الممارسات للاتصال بخدمات Azure. لمزيد من المعلومات، راجع Connect to Azure OpenAI في نماذج Foundry Models في AKS باستخدام Microsoft Entra Workload Identity ومقدمة Service Connector.