تمكين حسابات الخدمة المُدارة للمجموعة (GMSA) لعُقد Windows Server على مجموعة Azure Kubernetes Service (AKS)
حسابات الخدمة المدارة للمجموعة (GMSA) هي حساب مجال مدار لخوادم متعددة توفر إدارة تلقائية لكلمات المرور وإدارة مبسطة لاسم الخدمة الأساسي (SPN) والقدرة على تفويض الإدارة إلى المسؤولين الآخرين. باستخدام Azure Kubernetes Service (AKS)، يمكنك تمكين GMSA على عقد Windows Server، والتي تسمح للحاويات التي تعمل على عقد Windows Server بالتكامل مع GMSA وإدارتها.
المتطلبات الأساسية
- Kubernetes 1.19 أو أكبر. للتحقق من الإصدار، راجع التحقق من وجود ترقيات متوفرة. لترقية الإصدار الخاص بك، راجع ترقية نظام مجموعة AKS.
- الإصدار 2.35.0 من Azure CLI أو أحدث. قم بتشغيل
az --version
للعثور على الإصدار. إذا كنت بحاجة إلى التثبيت أو الترقية، فراجع تثبيت Azure CLI. - الهويات المدارة الممكنة على نظام مجموعة AKS.
- أذونات لإنشاء Azure Key Vault أو تحديثه.
- أذونات لتكوين GMSA على خدمة مجال Active Directory أو Active Directory محلي.
- يجب أن يكون لدى وحدة تحكم المجال خدمات ويب Active Directory ممكّنة ويجب أن تكون قابلة للوصول على المنفذ 9389 بواسطة مجموعة AKS.
إشعار
توفر Microsoft أيضا وحدة PowerShell مصممة لهذا الغرض لتكوين gMSA على AKS. لمزيد من المعلومات، راجع gMSA على خدمة Azure Kubernetes.
تكوين GMSA على وحدة تحكم مجال Active Directory
لاستخدام GMSA مع AKS، تحتاج إلى بيانات اعتماد مستخدم مجال قياسية للوصول إلى بيانات اعتماد GMSA المكونة على وحدة التحكم بالمجال. لتكوين GMSA على وحدة التحكم بالمجال، راجع بدء استخدام حسابات الخدمة المدارة للمجموعة. بالنسبة إلى بيانات اعتماد مستخدم المجال القياسي، يمكنك استخدام مستخدم حالي أو إنشاء مستخدم جديد، طالما أن لديه حق الوصول إلى بيانات اعتماد GMSA.
هام
يجب استخدام خدمة مجال Active Directory أو Active Directory محلي. في هذا الوقت، لا يمكنك استخدام معرف Microsoft Entra لتكوين GMSA مع نظام مجموعة AKS.
تخزين بيانات اعتماد مستخدم المجال القياسية في Azure Key Vault
تستخدم مجموعة AKS الخاصة بك بيانات اعتماد مستخدم المجال القياسية للوصول إلى بيانات اعتماد GMSA من وحدة تحكم المجال. لتوفير وصول آمن إلى بيانات الاعتماد هذه لمجموعة AKS، يجب تخزينها في Azure Key Vault.
إذا لم يكن لديك مخزن مفاتيح Azure بالفعل، فبادر بإنشاء مخزن باستخدام
az keyvault create
الأمر .az keyvault create --resource-group myResourceGroup --name myGMSAVault
قم بتخزين بيانات اعتماد مستخدم المجال القياسي كبيانات سرية
az keyvault secret set
في مخزن المفاتيح الخاص بك باستخدام الأمر . يخزن المثال التالي بيانات اعتماد مستخدم المجال مع المفتاح GMSADomainUserCred في مخزن مفاتيح myGMSAVault .az keyvault secret set --vault-name myGMSAVault --name "GMSADomainUserCred" --value "$Domain\\$DomainUsername:$DomainUserPassword"
إشعار
تأكد من استخدام اسم المجال المؤهل بالكامل للمجال.
اختياري: استخدام شبكة ظاهرية مخصصة مع DNS مخصص
تحتاج إلى تكوين وحدة تحكم المجال الخاصة بك من خلال DNS بحيث يمكن الوصول إليها بواسطة نظام مجموعة AKS. يمكنك تكوين شبكتك ونظام أسماء النطاقات خارج مجموعة AKS للسماح لمجموعتك بالوصول إلى وحدة تحكم المجال. بدلا من ذلك، يمكنك استخدام Azure CNI لتكوين شبكة ظاهرية مخصصة مع DNS مخصص على نظام مجموعة AKS لتوفير الوصول إلى وحدة التحكم بالمجال. لمزيد من المعلومات، راجع تكوين شبكة Azure CNI في خدمة Azure Kubernetes (AKS).
اختياري: تكوين أكثر من خادم DNS واحد
إذا كنت ترغب في تكوين أكثر من خادم DNS واحد ل Windows GMSA في نظام مجموعة AKS، فلا تحدد --gmsa-dns-server
أو v--gmsa-root-domain-name
. بدلا من ذلك، يمكنك إضافة عدة خوادم DNS في VNet عن طريق تحديد DNS مخصص وإضافة خوادم DNS.
اختياري: استخدم هوية kubelet الخاصة بك لمجموعتك
لتوفير وصول مجموعة AKS إلى خزينة المفاتيح، تحتاج هوية مجموعة kubelet إلى الوصول إلى خزينة المفاتيح الخاصة بك. عند إنشاء نظام مجموعة مع تمكين الهوية المدارة، يتم إنشاء هوية kubelet تلقائيا بشكل افتراضي.
يمكنك إما منح حق الوصول إلى مخزن المفاتيح الخاص بك للهوية بعد إنشاء نظام المجموعة أو إنشاء هويتك الخاصة لاستخدامها قبل إنشاء نظام المجموعة باستخدام الخطوات التالية:
إنشاء هوية kubelet باستخدام
az identity create
الأمر .az identity create --name myIdentity --resource-group myResourceGroup
احصل على معرف الهوية باستخدام
az identity list
الأمر وقم بتعيينه إلى متغير يسمى MANAGED_ID.MANAGED_ID=$(az identity list --query "[].id" -o tsv)
امنح الوصول إلى الهوية إلى مخزن المفاتيح الخاص بك باستخدام
az keyvault set-policy
الأمر .az keyvault set-policy --name "myGMSAVault" --object-id $MANAGED_ID --secret-permissions get
تمكين GMSA على نظام مجموعة AKS جديد
إنشاء بيانات اعتماد المسؤول لاستخدامها أثناء إنشاء نظام المجموعة. تطالبك الأوامر التالية باسم مستخدم وتعيينه إلى WINDOWS_USERNAME للاستخدام في أمر لاحق.
echo "Please enter the username to use as administrator credentials for Windows Server nodes on your cluster: " && read WINDOWS_USERNAME
إنشاء نظام مجموعة AKS باستخدام
az aks create
الأمر مع المعلمات التالية:--enable-windows-gmsa
: تمكين GMSA للمجموعة.--gmsa-dns-server
: عنوان IP لخادم DNS.--gmsa-root-domain-name
: اسم المجال الجذر لخادم DNS.
DNS_SERVER=<IP address of DNS server> ROOT_DOMAIN_NAME="contoso.com" az aks create \ --resource-group myResourceGroup \ --name myAKSCluster \ --vm-set-type VirtualMachineScaleSets \ --network-plugin azure \ --load-balancer-sku standard \ --windows-admin-username $WINDOWS_USERNAME \ --enable-windows-gmsa \ --gmsa-dns-server $DNS_SERVER \ --gmsa-root-domain-name $ROOT_DOMAIN_NAME \ --generate-ssh-keys
إشعار
إذا كنت تستخدم شبكة ظاهرية مخصصة، فأنت بحاجة إلى تحديد معرف الشبكة الظاهرية باستخدام المعلمة
vnet-subnet-id
، وقد تحتاج أيضا إلى إضافةdocker-bridge-address
dns-service-ip
المعلمات و وservice-cidr
اعتمادا على التكوين الخاص بك.إذا قمت بإنشاء هويتك الخاصة لهوية kubelet، فاستخدم المعلمة
assign-kubelet-identity
لتحديد هويتك.عند تحديد
--gmsa-dns-server
المعلمتين و--gmsa-root-domain-name
، تتم إضافة قاعدة إعادة توجيه DNS إلىkube-system/coredns
ConfigMap. تقوم هذه القاعدة بإعادة توجيه طلبات DNS من$ROOT_DOMAIN_NAME
pods إلى$DNS_SERVER
.$ROOT_DOMAIN_NAME:53 { errors cache 30 log forward . $DNS_SERVER }
أضف تجمع عقدة Windows Server باستخدام
az aks nodepool add
الأمر .az aks nodepool add \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --os-type Windows \ --name npwin \ --node-count 1
تمكين GMSA على نظام المجموعة الحالي
تمكين GMSA على نظام مجموعة موجود مع عقد Windows Server والهويات المدارة الممكنة
az aks update
باستخدام الأمر .az aks update \ --resource-group myResourceGroup \ --name myAKSCluster \ --enable-windows-gmsa \ --gmsa-dns-server $DNS_SERVER \ --gmsa-root-domain-name $ROOT_DOMAIN_NAME
منح حق الوصول إلى خزنة المفاتيح الخاصة بك لهوية kubelet
إشعار
تخطي هذه الخطوة إذا قمت بتوفير هويتك الخاصة لهوية kubelet.
امنح حق الوصول إلى مخزن المفاتيح الخاص بك لهوية kubelet باستخدام
az keyvault set-policy
الأمر .MANAGED_ID=$(az aks show -g myResourceGroup -n myAKSCluster --query "identityProfile.kubeletidentity.objectId" -o tsv) az keyvault set-policy --name "myGMSAVault" --object-id $MANAGED_ID --secret-permissions get
تثبيت مواصفات أرصدة GMSA
قم بتكوين
kubectl
للاتصال بنظام مجموعة Kubernetes باستخدام أمرaz aks get-credentials
.az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
أنشئ YAML جديدا باسم gmsa-spec.yaml والصق في YAML التالي. تأكد من استبدال العناصر النائبة بقيمك الخاصة.
apiVersion: windows.k8s.io/v1 kind: GMSACredentialSpec metadata: name: aks-gmsa-spec # This name can be changed, but it will be used as a reference in the pod spec credspec: ActiveDirectoryConfig: GroupManagedServiceAccounts: - Name: $GMSA_ACCOUNT_USERNAME Scope: $NETBIOS_DOMAIN_NAME - Name: $GMSA_ACCOUNT_USERNAME Scope: $DNS_DOMAIN_NAME HostAccountConfig: PluginGUID: '{CCC2A336-D7F3-4818-A213-272B7924213E}' PortableCcgVersion: "1" PluginInput: "ObjectId=$MANAGED_ID;SecretUri=$SECRET_URI" # SECRET_URI takes the form https://$akvName.vault.azure.net/secrets/$akvSecretName CmsPlugins: - ActiveDirectory DomainJoinConfig: DnsName: $DNS_DOMAIN_NAME DnsTreeName: $DNS_ROOT_DOMAIN_NAME Guid: $AD_DOMAIN_OBJECT_GUID MachineAccountName: $GMSA_ACCOUNT_USERNAME NetBiosName: $NETBIOS_DOMAIN_NAME Sid: $GMSA_SID
إشعار
قامت AKS بترقية apiVersion
من GMSACredentialSpec
windows.k8s.io/v1alpha1
إلى windows.k8s.io/v1
في الإصدار v20230903.
أنشئ YAML جديدا باسم gmsa-role.yaml والصقه في YAML التالي.
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: aks-gmsa-role rules: - apiGroups: ["windows.k8s.io"] resources: ["gmsacredentialspecs"] verbs: ["use"] resourceNames: ["aks-gmsa-spec"]
أنشئ YAML جديدا باسم gmsa-role-binding.yaml والصقه في YAML التالي.
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: allow-default-svc-account-read-on-aks-gmsa-spec namespace: default subjects: - kind: ServiceAccount name: default namespace: default roleRef: kind: ClusterRole name: aks-gmsa-role apiGroup: rbac.authorization.k8s.io
قم بتطبيق التغييرات من gmsa-spec.yaml و gmsa-role.yaml و gmsa-role-binding.yaml باستخدام
kubectl apply
الأمر .kubectl apply -f gmsa-spec.yaml kubectl apply -f gmsa-role.yaml kubectl apply -f gmsa-role-binding.yaml
التحقق من تثبيت GMSA
أنشئ YAML جديدا باسم gmsa-demo.yaml والصقه في YAML التالي.
--- kind: ConfigMap apiVersion: v1 metadata: labels: app: gmsa-demo name: gmsa-demo namespace: default data: run.ps1: | $ErrorActionPreference = "Stop" Write-Output "Configuring IIS with authentication." # Add required Windows features, since they are not installed by default. Install-WindowsFeature "Web-Windows-Auth", "Web-Asp-Net45" # Create simple ASP.NET page. New-Item -Force -ItemType Directory -Path 'C:\inetpub\wwwroot\app' Set-Content -Path 'C:\inetpub\wwwroot\app\default.aspx' -Value 'Authenticated as <B><%=User.Identity.Name%></B>, Type of Authentication: <B><%=User.Identity.AuthenticationType%></B>' # Configure IIS with authentication. Import-Module IISAdministration Start-IISCommitDelay (Get-IISConfigSection -SectionPath 'system.webServer/security/authentication/windowsAuthentication').Attributes['enabled'].value = $true (Get-IISConfigSection -SectionPath 'system.webServer/security/authentication/anonymousAuthentication').Attributes['enabled'].value = $false (Get-IISServerManager).Sites[0].Applications[0].VirtualDirectories[0].PhysicalPath = 'C:\inetpub\wwwroot\app' Stop-IISCommitDelay Write-Output "IIS with authentication is ready." C:\ServiceMonitor.exe w3svc --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: gmsa-demo name: gmsa-demo namespace: default spec: replicas: 1 selector: matchLabels: app: gmsa-demo template: metadata: labels: app: gmsa-demo spec: securityContext: windowsOptions: gmsaCredentialSpecName: aks-gmsa-spec containers: - name: iis image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019 imagePullPolicy: IfNotPresent command: - powershell args: - -File - /gmsa-demo/run.ps1 volumeMounts: - name: gmsa-demo mountPath: /gmsa-demo volumes: - configMap: defaultMode: 420 name: gmsa-demo name: gmsa-demo nodeSelector: kubernetes.io/os: windows --- apiVersion: v1 kind: Service metadata: labels: app: gmsa-demo name: gmsa-demo namespace: default spec: ports: - port: 80 targetPort: 80 selector: app: gmsa-demo type: LoadBalancer
تطبيق التغييرات من gmsa-demo.yaml باستخدام
kubectl apply
الأمر .kubectl apply -f gmsa-demo.yaml
احصل على عنوان IP الخاص بنموذج التطبيق باستخدام
kubectl get service
الأمر .kubectl get service gmsa-demo --watch
في البداية،
EXTERNAL-IP
يظهر للخدمةgmsa-demo
على أنه معلق:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gmsa-demo LoadBalancer 10.0.37.27 <pending> 80:30572/TCP 6s
EXTERNAL-IP
عندما يتغير العنوان من معلق إلى عنوان IP عام فعلي، استخدمCTRL-C
لإيقافkubectl
عملية المراقبة.يوضح المثال التالي إخراج لعنوان IP عام صالحاً تم تعيينه للخدمة:
gmsa-demo LoadBalancer 10.0.37.27 EXTERNAL-IP 80:30572/TCP 2m
افتح مستعرض ويب إلى عنوان IP الخارجي للخدمة
gmsa-demo
.قم بالمصادقة باستخدام
$NETBIOS_DOMAIN_NAME\$AD_USERNAME
و كلمة المرور وتأكد من أنك ترىAuthenticated as $NETBIOS_DOMAIN_NAME\$AD_USERNAME, Type of Authentication: Negotiate
.
تعطيل GMSA على نظام مجموعة موجود
تعطيل GMSA على نظام مجموعة موجود مع عقد Windows Server باستخدام
az aks update
الأمر .az aks update \ --resource-group myResourceGroup \ --name myAKSCluster \ --disable-windows-gmsa
إشعار
يمكنك إعادة تمكين GMSA على مجموعة موجودة باستخدام الأمر az aks update .
استكشاف الأخطاء وإصلاحها
لا يتم طلب المصادقة عند تحميل الصفحة
إذا تم تحميل الصفحة، ولكن لم تتم مطالبتك بالمصادقة، فاستخدم kubectl logs POD_NAME
الأمر لعرض سجلات الجراب والتحقق من أنك ترى IIS مع المصادقة جاهزا.
إشعار
لن تعرض حاويات Windows السجلات على kubectl بشكل افتراضي. لتمكين حاويات Windows من إظهار السجلات، تحتاج إلى تضمين أداة "مراقبة السجل" على صورة Windows. لمزيد من المعلومات، راجع أدوات حاوية Windows.
انتهت مهلة الاتصال عند محاولة تحميل الصفحة
إذا تلقيت مهلة اتصال عند محاولة تحميل الصفحة، فتحقق من تشغيل نموذج التطبيق باستخدام kubectl get pods --watch
الأمر . أحيانًا يكون عنوان IP الخارجي لنموذج التطبيق متاحًا قبل تشغيل نموذج حاوية التطبيق.
فشل بدء تشغيل الجراب ويظهر خطأ winapi في أحداث pod
إذا لم يبدأ تشغيل الكبسولة kubectl get pods --watch
بعد تشغيل الأمر والانتظار عدة دقائق، فاستخدم kubectl describe pod POD_NAME
الأمر . إذا رأيت خطأ winapi في أحداث pod، فمن المحتمل أن يكون خطأ في تكوين مواصفات GMSA cred. تحقق من صحة كافة قيم الاستبدال في gmsa-spec.yaml وأعد تشغيل kubectl apply -f gmsa-spec.yaml
ثم أعد نشر نموذج التطبيق.
الخطوات التالية
لمزيد من المعلومات، راجع اعتبارات حاويات Windows مع خدمة Azure Kubernetes (AKS).
Azure Kubernetes Service