Aktivera grupphanterade tjänstkonton (GMSA) för dina Windows Server-noder i ditt AKS-kluster (Azure Kubernetes Service)
Grupphanterade tjänstkonton (GMSA) är ett hanterat domänkonto för flera servrar som tillhandahåller automatisk lösenordshantering, förenklad hantering av tjänstens huvudnamn (SPN) och möjligheten att delegera hantering till andra administratörer. Med Azure Kubernetes Service (AKS) kan du aktivera GMSA på dina Windows Server-noder, vilket gör att containrar som körs på Windows Server-noder kan integreras med och hanteras av GMSA.
Förutsättningar
- Kubernetes 1.19 eller senare. Information om hur du kontrollerar din version finns i Söka efter tillgängliga uppgraderingar. Information om hur du uppgraderar din version finns i Uppgradera AKS-kluster.
- Azure CLI version 2.35.0 eller senare. Kör
az --version
för att hitta versionen. Om du behöver installera eller uppgradera kan du läsa Installera Azure CLI. - Hanterade identiteter aktiverade i ditt AKS-kluster.
- Behörigheter för att skapa eller uppdatera ett Azure Key Vault.
- Behörigheter för att konfigurera GMSA på Active Directory-domän Service eller lokal Active Directory.
- Domänkontrollanten måste ha Active Directory Web Services aktiverat och måste kunna nås på port 9389 av AKS-klustret.
Kommentar
Microsoft tillhandahåller också en specialbyggd PowerShell-modul för att konfigurera gMSA på AKS. Mer information finns i gMSA på Azure Kubernetes Service.
Konfigurera GMSA på Active Directory-domänkontrollant
Om du vill använda GMSA med AKS behöver du en standardautentiseringsuppgift för domänanvändare för att få åtkomst till de GMSA-autentiseringsuppgifter som konfigurerats på domänkontrollanten. Information om hur du konfigurerar GMSA på domänkontrollanten finns i Kom igång med grupphanterade tjänstkonton. För standardautentiseringsuppgifter för domänanvändare kan du använda en befintlig användare eller skapa en ny, så länge den har åtkomst till GMSA-autentiseringsuppgifterna.
Viktigt!
Du måste använda antingen Active Directory-domän Service eller lokal Active Directory. För närvarande kan du inte använda Microsoft Entra-ID för att konfigurera GMSA med ett AKS-kluster.
Lagra standardautentiseringsuppgifterna för domänanvändare i Azure Key Vault
AKS-klustret använder standardautentiseringsuppgifterna för domänanvändare för att komma åt GMSA-autentiseringsuppgifterna från domänkontrollanten. Om du vill ge säker åtkomst till dessa autentiseringsuppgifter för AKS-klustret bör du lagra dem i Azure Key Vault.
Om du inte redan har ett Azure-nyckelvalv skapar du ett med kommandot
az keyvault create
.az keyvault create --resource-group myResourceGroup --name myGMSAVault
Lagra standardautentiseringsuppgifterna för domänanvändare som en hemlighet i nyckelvalvet med hjälp av
az keyvault secret set
kommandot . I följande exempel lagras domänanvändarens autentiseringsuppgifter med nyckeln GMSADomainUserCred i nyckelvalvet myGMSAVault .az keyvault secret set --vault-name myGMSAVault --name "GMSADomainUserCred" --value "$Domain\\$DomainUsername:$DomainUserPassword"
Kommentar
Se till att använda det fullständigt kvalificerade domännamnet för domänen.
Valfritt: Använd ett anpassat virtuellt nätverk med anpassad DNS
Du måste konfigurera domänkontrollanten via DNS så att den kan nås av AKS-klustret. Du kan konfigurera nätverket och DNS utanför AKS-klustret så att klustret får åtkomst till domänkontrollanten. Du kan också använda Azure CNI för att konfigurera ett anpassat VNet med en anpassad DNS i AKS-klustret för att ge åtkomst till domänkontrollanten. Mer information finns i Konfigurera Azure CNI-nätverk i Azure Kubernetes Service (AKS).
Valfritt: Konfigurera mer än en DNS-server
Om du vill konfigurera mer än en DNS-server för Windows GMSA i AKS-klustret ska du inte ange --gmsa-dns-server
eller v--gmsa-root-domain-name
. I stället kan du lägga till flera DNS-servrar i det virtuella nätverket genom att välja Anpassad DNS och lägga till DNS-servrarna.
Valfritt: Använd din egen kubelet-identitet för klustret
För att ge AKS-klustret åtkomst till ditt nyckelvalv behöver klustrets kubelet-identitet åtkomst till ditt nyckelvalv. När du skapar ett kluster med hanterad identitet aktiverad skapas en kubelet-identitet automatiskt som standard.
Du kan antingen bevilja åtkomst till ditt nyckelvalv för identiteten när klustret har skapats eller skapa en egen identitet som ska användas innan klustret skapas med hjälp av följande steg:
Skapa en kubelet-identitet med kommandot
az identity create
.az identity create --name myIdentity --resource-group myResourceGroup
Hämta identitetens ID med hjälp av
az identity list
kommandot och ange det till en variabel med namnet MANAGED_ID.MANAGED_ID=$(az identity list --query "[].id" -o tsv)
Ge identiteten åtkomst till ditt nyckelvalv med hjälp av
az keyvault set-policy
kommandot .az keyvault set-policy --name "myGMSAVault" --object-id $MANAGED_ID --secret-permissions get
Aktivera GMSA i ett nytt AKS-kluster
Skapa administratörsautentiseringsuppgifter som ska användas när klustret skapas. Följande kommandon uppmanar dig att ange ett användarnamn och ange det till WINDOWS_USERNAME för användning i ett senare kommando.
echo "Please enter the username to use as administrator credentials for Windows Server nodes on your cluster: " && read WINDOWS_USERNAME
Skapa ett AKS-kluster med kommandot
az aks create
med följande parametrar:--enable-windows-gmsa
: Aktiverar GMSA för klustret.--gmsa-dns-server
: DNS-serverns IP-adress.--gmsa-root-domain-name
: DNS-serverns rotdomännamn.
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
Kommentar
Om du använder ett anpassat virtuellt nätverk måste du ange det virtuella nätverks-ID:t med hjälp av parametern
vnet-subnet-id
och du kan också behöva lägga till parametrarnadocker-bridge-address
,dns-service-ip
ochservice-cidr
beroende på din konfiguration.Om du har skapat din egen identitet för kubelet-identiteten använder du parametern
assign-kubelet-identity
för att ange din identitet.När du anger parametrarna
--gmsa-dns-server
och--gmsa-root-domain-name
läggs en DNS-vidarebefordranregel till ikube-system/coredns
ConfigMap. Den här regeln vidarebefordrar DNS-begäranden från$ROOT_DOMAIN_NAME
poddarna till$DNS_SERVER
.$ROOT_DOMAIN_NAME:53 { errors cache 30 log forward . $DNS_SERVER }
Lägg till en Windows Server-nodpool med kommandot
az aks nodepool add
.az aks nodepool add \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --os-type Windows \ --name npwin \ --node-count 1
Aktivera GMSA i ett befintligt kluster
Aktivera GMSA i ett befintligt kluster med Windows Server-noder och hanterade identiteter aktiverade med kommandot
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
Bevilja åtkomst till ditt nyckelvalv för kubelet-identiteten
Kommentar
Hoppa över det här steget om du har angett din egen identitet för kubelet-identiteten.
Bevilja åtkomst till ditt nyckelvalv för kubelet-identiteten
az keyvault set-policy
med hjälp av kommandot .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
Installera GMSA cred spec
Konfigurera
kubectl
för att ansluta till kubernetes-klustret med hjälp avaz aks get-credentials
kommandot .az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
Skapa en ny YAML med namnet gmsa-spec.yaml och klistra in följande YAML. Se till att du ersätter platshållarna med dina egna värden.
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
Kommentar
AKS har uppgraderat apiVersion
GMSACredentialSpec
från windows.k8s.io/v1alpha1
till windows.k8s.io/v1
i version v20230903.
Skapa en ny YAML med namnet gmsa-role.yaml och klistra in följande 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"]
Skapa en ny YAML med namnet gmsa-role-binding.yaml och klistra in följande 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
Använd ändringarna från gmsa-spec.yaml, gmsa-role.yaml och gmsa-role-binding.yaml med kommandot
kubectl apply
.kubectl apply -f gmsa-spec.yaml kubectl apply -f gmsa-role.yaml kubectl apply -f gmsa-role-binding.yaml
Verifiera GMSA-installationen
Skapa en ny YAML med namnet gmsa-demo.yaml och klistra in följande 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
Använd ändringarna från gmsa-demo.yaml med kommandot
kubectl apply
.kubectl apply -f gmsa-demo.yaml
Hämta IP-adressen för exempelprogrammet med kommandot
kubectl get service
.kubectl get service gmsa-demo --watch
EXTERNAL-IP
Till en början visas förgmsa-demo
tjänsten som väntande:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gmsa-demo LoadBalancer 10.0.37.27 <pending> 80:30572/TCP 6s
EXTERNAL-IP
När adressen ändras från väntande till en faktisk offentlig IP-adress använder duCTRL-C
för att stoppakubectl
bevakningsprocessen.Följande exempelutdata visar en giltig offentlig IP-adress som har tilldelats tjänsten:
gmsa-demo LoadBalancer 10.0.37.27 EXTERNAL-IP 80:30572/TCP 2m
Öppna en webbläsare till tjänstens
gmsa-demo
externa IP-adress.Autentisera
$NETBIOS_DOMAIN_NAME\$AD_USERNAME
med lösenordet och och bekräfta att du serAuthenticated as $NETBIOS_DOMAIN_NAME\$AD_USERNAME, Type of Authentication: Negotiate
.
Inaktivera GMSA i ett befintligt kluster
Inaktivera GMSA i ett befintligt kluster med Windows Server-noder med kommandot
az aks update
.az aks update \ --resource-group myResourceGroup \ --name myAKSCluster \ --disable-windows-gmsa
Kommentar
Du kan återaktivera GMSA i ett befintligt kluster med hjälp av kommandot az aks update .
Felsökning
Ingen autentisering tillfrågas när sidan läses in
Om sidan läses in, men du inte uppmanas att autentisera kubectl logs POD_NAME
, använder du kommandot för att visa loggarna för din podd och kontrollera att IIS med autentisering är klar.
Kommentar
Windows-containrar visar inte loggar på kubectl som standard. Om du vill att Windows-containrar ska visa loggar måste du bädda in loggövervakningsverktyget på Windows-avbildningen. Mer information finns i Windows Container Tools.
Tidsgräns för anslutning vid försök att läsa in sidan
Om du får en tidsgräns för anslutningen när du försöker läsa in sidan kontrollerar du att exempelappen körs med kommandot kubectl get pods --watch
. Ibland är den externa IP-adressen för exempelapptjänsten tillgänglig innan exempelapppodden körs.
Podden startar inte och ett winapi-fel visas i poddhändelserna
Om podden inte startar efter att kubectl get pods --watch
ha kört kommandot och väntat i flera minuter använder du kubectl describe pod POD_NAME
kommandot . Om du ser ett winapi-fel i poddhändelserna är det troligtvis ett fel i konfigurationen av gmsa-cred-specifikationen. Kontrollera att alla ersättningsvärden i gmsa-spec.yaml är korrekta, kör kubectl apply -f gmsa-spec.yaml
om och distribuera om exempelprogrammet.
Nästa steg
Mer information finns i Överväganden för Windows-containrar med Azure Kubernetes Service (AKS).
Azure Kubernetes Service