Bagikan melalui


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.

  1. Jika Anda belum memiliki brankas kunci Azure, buat brankas kunci menggunakan az keyvault create perintah .

    az keyvault create --resource-group myResourceGroup --name myGMSAVault
    
  2. 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-serveratau 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:

  1. Buat identitas kubelet menggunakan az identity create perintah .

    az identity create --name myIdentity --resource-group myResourceGroup
    
  2. Dapatkan ID identitas menggunakan az identity list perintah dan atur ke variabel bernama MANAGED_ID.

    MANAGED_ID=$(az identity list --query "[].id" -o tsv)
    
  3. 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

  1. 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 
    
  2. 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 menambahkan docker-bridge-addressparameter , dns-service-ip, dan service-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 ke kube-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
      }
      
  3. 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

  1. Konfigurasikan kubectl untuk terhubung ke kluster Kubernetes menggunakan perintah az aks get-credentials.

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  2. 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.

  1. 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"]
    
  2. 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
    
  3. 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

  1. 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
    
  2. Terapkan perubahan dari gmsa-demo.yaml menggunakan kubectl apply perintah .

    kubectl apply -f gmsa-demo.yaml
    
  3. Dapatkan alamat IP aplikasi sampel menggunakan kubectl get service perintah .

    kubectl get service gmsa-demo --watch
    

    Awalnya, EXTERNAL-IP untuk gmsa-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
    
  4. EXTERNAL-IP Ketika alamat berubah dari tertunda ke alamat IP publik aktual, gunakan CTRL-C untuk menghentikan kubectl 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
    
  5. Buka browser web ke alamat gmsa-demo IP eksternal layanan.

  6. Autentikasi dengan $NETBIOS_DOMAIN_NAME\$AD_USERNAME kata sandi dan konfirmasikan Anda melihat Authenticated 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).