Mengaktifkan Group Managed Service Accounts (GMSA) untuk node Windows Server Anda di kluster Azure Kubernetes Service (AKS)
Akun Layanan Terkelola Grup (GMSA) adalah akun domain terkelola untuk beberapa server yang menyediakan manajemen kata sandi otomatis, manajemen nama prinsipal layanan (SPN) yang disederhanakan, dan kemampuan untuk mendelegasikan manajemen kepada administrator lain. Dengan Azure Kubernetes Service (AKS), Anda dapat mengaktifkan GMSA pada simpul Windows Server, yang memungkinkan kontainer yang berjalan pada simpul Windows Server untuk diintegrasikan dengan dan dikelola oleh GMSA.
Prasyarat
- Kubernetes 1.19 atau lebih tinggi. Untuk memeriksa versi Anda, lihat Memeriksa peningkatan yang tersedia. Untuk meningkatkan versi Anda, lihat Meningkatkan kluster AKS.
- Azure CLI versi 2.35.0 atau lebih tinggi. Jalankan
az --version
untuk menemukan versinya. Jika Anda perlu memasang atau meningkatkan, lihat Memasang Azure CLI. - Identitas terkelola diaktifkan pada kluster AKS Anda.
- Izin untuk membuat atau memperbarui Azure Key Vault.
- Izin untuk mengonfigurasi GMSA di Active Directory Domain Service atau Active Directory lokal.
- Pengendali domain harus mengaktifkan Layanan Web Active Directory dan harus dapat dijangkau pada port 9389 oleh kluster AKS.
Catatan
Microsoft juga menyediakan modul PowerShell yang dibuat khusus untuk mengonfigurasi gMSA di AKS. Untuk informasi selengkapnya, lihat gMSA di Azure Kubernetes Service.
Konfigurasikan GMSA pada pengendali domain Active Directory
Untuk menggunakan GMSA dengan AKS, Anda memerlukan kredensial pengguna domain standar untuk mengakses kredensial GMSA yang dikonfigurasi pada pengendali domain Anda. Untuk mengonfigurasi GMSA di pengendali domain Anda, lihat Mulai menggunakan Akun Layanan Terkelola Grup. Untuk kredensial pengguna domain standar, Anda dapat menggunakan pengguna yang sudah ada atau membuat yang baru, selama pengguna tersebut memiliki akses ke kredensial GMSA.
Penting
Anda harus menggunakan Layanan Domain Direktori Aktif atau Active Directory lokal. Saat ini, Anda tidak dapat menggunakan Microsoft Entra ID untuk mengonfigurasi GMSA dengan kluster AKS.
Simpan kredensial pengguna domain standar di Azure Key Vault
Kluster AKS Anda menggunakan kredensial pengguna domain standar untuk mengakses kredensial GMSA dari pengendali domain. Untuk menyediakan akses aman ke kredensial tersebut untuk kluster AKS, Anda harus menyimpannya di Azure Key Vault.
Jika Anda belum memiliki brankas kunci Azure, buat brankas kunci menggunakan
az keyvault create
perintah .az keyvault create --resource-group myResourceGroup --name myGMSAVault
Simpan kredensial pengguna domain standar sebagai rahasia di brankas kunci Anda menggunakan
az keyvault secret set
perintah . Contoh berikut menyimpan info masuk pengguna domain dengan kunci GMSADomainUserCred di brankas kunci myGMSAVault .az keyvault secret set --vault-name myGMSAVault --name "GMSADomainUserCred" --value "$Domain\\$DomainUsername:$DomainUserPassword"
Catatan
Pastikan untuk menggunakan Nama Domain yang Sepenuhnya Memenuhi Syarat untuk domain.
Opsional: Menggunakan VNet kustom dengan DNS kustom
Anda perlu mengonfigurasi pengendali domain Anda melalui DNS sehingga dapat dijangkau oleh kluster AKS. Anda dapat mengonfigurasi jaringan dan DNS Anda di luar kluster AKS agar kluster Anda dapat mengakses pengendali domain. Atau, Anda dapat menggunakan Azure CNI untuk mengonfigurasi VNet kustom dengan DNS kustom di kluster AKS Anda untuk menyediakan akses ke pengontrol domain Anda. Untuk informasi selengkapnya, lihat Mengonfigurasi jaringan Azure CNI di Azure Kubernetes Service (AKS).
Opsional: Mengonfigurasi lebih dari satu server DNS
Jika Anda ingin mengonfigurasi lebih dari satu server DNS untuk Windows GMSA di kluster AKS Anda, jangan tentukan --gmsa-dns-server
atau v--gmsa-root-domain-name
. Sebagai gantinya, Anda bisa menambahkan beberapa server DNS di VNet dengan memilih DNS Kustom dan menambahkan server DNS.
Opsional: Gunakan identitas kubelet Anda sendiri untuk kluster
Untuk menyediakan akses kluster AKS ke brankas kunci, identitas kubelet kluster memerlukan akses ke brankas kunci Anda. Saat Anda membuat kluster dengan identitas terkelola diaktifkan, identitas kubelet secara otomatis dibuat secara default.
Anda dapat memberikan akses ke brankas kunci untuk identitas setelah pembuatan kluster atau membuat identitas Anda sendiri untuk digunakan sebelum pembuatan kluster menggunakan langkah-langkah berikut:
Buat identitas kubelet menggunakan
az identity create
perintah .az identity create --name myIdentity --resource-group myResourceGroup
Dapatkan ID identitas menggunakan
az identity list
perintah dan atur ke variabel bernama MANAGED_ID.MANAGED_ID=$(az identity list --query "[].id" -o tsv)
Berikan akses identitas ke brankas kunci Anda menggunakan
az keyvault set-policy
perintah .az keyvault set-policy --name "myGMSAVault" --object-id $MANAGED_ID --secret-permissions get
Mengaktifkan GMSA pada kluster AKS baru
Buat kredensial administrator untuk digunakan selama pembuatan kluster. Perintah berikut meminta nama pengguna dan mengaturnya ke WINDOWS_USERNAME untuk digunakan dalam perintah selanjutnya.
echo "Please enter the username to use as administrator credentials for Windows Server nodes on your cluster: " && read WINDOWS_USERNAME
Buat kluster AKS menggunakan
az aks create
perintah dengan parameter berikut:--enable-windows-gmsa
: Mengaktifkan GMSA untuk kluster.--gmsa-dns-server
: Alamat IP server DNS.--gmsa-root-domain-name
: Nama domain akar server 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
Catatan
Jika Anda menggunakan VNet kustom, Anda perlu menentukan ID VNet menggunakan
vnet-subnet-id
parameter , dan Anda mungkin juga perlu menambahkandocker-bridge-address
parameter ,dns-service-ip
, danservice-cidr
tergantung pada konfigurasi Anda.Jika Anda membuat identitas Anda sendiri untuk identitas kubelet, gunakan
assign-kubelet-identity
parameter untuk menentukan identitas Anda.Saat Anda menentukan
--gmsa-dns-server
parameter dan--gmsa-root-domain-name
, aturan penerusan DNS ditambahkan kekube-system/coredns
ConfigMap. Aturan ini meneruskan permintaan DNS untuk$ROOT_DOMAIN_NAME
dari pod ke$DNS_SERVER
.$ROOT_DOMAIN_NAME:53 { errors cache 30 log forward . $DNS_SERVER }
Tambahkan kumpulan simpul Windows Server menggunakan
az aks nodepool add
perintah .az aks nodepool add \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --os-type Windows \ --name npwin \ --node-count 1
Mengaktifkan GMSA pada kluster yang ada
Aktifkan GMSA pada kluster yang ada dengan simpul Windows Server dan identitas terkelola diaktifkan menggunakan
az aks update
perintah .az aks update \ --resource-group myResourceGroup \ --name myAKSCluster \ --enable-windows-gmsa \ --gmsa-dns-server $DNS_SERVER \ --gmsa-root-domain-name $ROOT_DOMAIN_NAME
Berikan akses ke brankas kunci Anda untuk identitas kubelet
Catatan
Lewati langkah ini jika Anda memberikan identitas Anda sendiri untuk identitas kubelet.
Berikan akses ke brankas kunci Anda untuk identitas kubelet menggunakan
az keyvault set-policy
perintah .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
Instal spesifikasi kredensial GMSA
Konfigurasikan
kubectl
untuk terhubung ke kluster Kubernetes menggunakan perintahaz aks get-credentials
.az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
Buat YAML baru bernama gmsa-spec.yaml dan tempelkan di YAML berikut. Pastikan Anda mengganti tempat penampung dengan nilai Anda sendiri.
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
Catatan
AKS telah meningkatkan apiVersion
dari GMSACredentialSpec
windows.k8s.io/v1alpha1
ke windows.k8s.io/v1
dalam rilis v20230903.
Buat YAML baru bernama gmsa-role.yaml dan tempelkan di YAML berikut.
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"]
Buat YAML baru bernama gmsa-role-binding.yaml dan tempelkan di YAML berikut.
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
Terapkan perubahan dari gmsa-spec.yaml, gmsa-role.yaml, dan gmsa-role-binding.yaml menggunakan
kubectl apply
perintah .kubectl apply -f gmsa-spec.yaml kubectl apply -f gmsa-role.yaml kubectl apply -f gmsa-role-binding.yaml
Memverifikasi penginstalan GMSA
Buat YAML baru bernama gmsa-demo.yaml dan tempelkan di YAML berikut.
--- 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
Terapkan perubahan dari gmsa-demo.yaml menggunakan
kubectl apply
perintah .kubectl apply -f gmsa-demo.yaml
Dapatkan alamat IP aplikasi sampel menggunakan
kubectl get service
perintah .kubectl get service gmsa-demo --watch
Awalnya,
EXTERNAL-IP
untukgmsa-demo
layanan ditampilkan sebagai tertunda:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gmsa-demo LoadBalancer 10.0.37.27 <pending> 80:30572/TCP 6s
EXTERNAL-IP
Ketika alamat berubah dari tertunda ke alamat IP publik aktual, gunakanCTRL-C
untuk menghentikankubectl
proses tontonan.Output contoh berikut menunjukkan alamat IP publik yang valid yang ditetapkan ke layanan:
gmsa-demo LoadBalancer 10.0.37.27 EXTERNAL-IP 80:30572/TCP 2m
Buka browser web ke alamat
gmsa-demo
IP eksternal layanan.Autentikasi dengan
$NETBIOS_DOMAIN_NAME\$AD_USERNAME
kata sandi dan konfirmasikan Anda melihatAuthenticated as $NETBIOS_DOMAIN_NAME\$AD_USERNAME, Type of Authentication: Negotiate
.
Menonaktifkan GMSA pada kluster yang ada
Nonaktifkan GMSA pada kluster yang ada dengan simpul Windows Server menggunakan
az aks update
perintah .az aks update \ --resource-group myResourceGroup \ --name myAKSCluster \ --disable-windows-gmsa
Catatan
Anda dapat mengaktifkan kembali GMSA pada kluster yang ada dengan menggunakan perintah az aks update .
Pemecahan Masalah
Tidak ada autentikasi yang diminta saat memuat halaman
Jika halaman dimuat, tetapi Anda tidak diminta untuk mengautentikasi, gunakan kubectl logs POD_NAME
perintah untuk menampilkan log pod Anda dan verifikasi bahwa Anda melihat IIS dengan autentikasi siap.
Catatan
Kontainer Windows tidak akan menampilkan log pada kubectl secara default. Untuk mengaktifkan kontainer Windows untuk menampilkan log, Anda perlu menyematkan alat Monitor Log pada citra Windows Anda. Untuk informasi selengkapnya, lihat Alat Kontainer Windows.
Batas waktu koneksi saat mencoba memuat halaman
Jika Anda menerima batas waktu koneksi saat mencoba memuat halaman, verifikasi aplikasi sampel berjalan menggunakan kubectl get pods --watch
perintah . Terkadang alamat IP eksternal untuk layanan aplikasi contoh tersedia sebelum pod aplikasi contoh berjalan.
Pod gagal memulai dan kesalahan winapi muncul dalam peristiwa pod
Jika pod Anda tidak dimulai setelah menjalankan kubectl get pods --watch
perintah dan menunggu beberapa menit, gunakan kubectl describe pod POD_NAME
perintah . Jika Anda melihat kesalahan winapi dalam peristiwa pod, kemungkinan kesalahan dalam konfigurasi spesifikasi kredensial GMSA Anda. Pastikan semua nilai pengganti di gmsa-spec.yaml sudah benar, jalankan kembali kubectl apply -f gmsa-spec.yaml
, dan sebarkan ulang aplikasi contoh.
Langkah berikutnya
Untuk informasi selengkapnya, lihat Pertimbangan kontainer Windows dengan Azure Kubernetes Service (AKS).
Azure Kubernetes Service