Questo tutorial mostra come creare un'applicazione web ASP.NET che utilizza IIS con Integrated Windows Authentication e come eseguirne il deployment utilizzando un contenitore Windows in un cluster Google Kubernetes Engine (GKE) con nodi Windows Server che hanno aderito al dominio. Questa configurazione è utile per eseguire il deployment di applicazioni ASP.NET in contenitori Windows su Google Cloud in modo che le applicazioni possano autenticarsi in altre risorse Windows. Il tutorial mostra anche come creare un account di servizio gestito di gruppo (gMSA) in Active Directory e come configurare il deployment dell'applicazione web in GKE per utilizzarlo.
Questo tutorial è rivolto agli amministratori di sistema. Si presume che tu abbia familiarità con Active Directory e che tu abbia esperienza con Google Kubernetes Engine (GKE).
Obiettivi
- Crea un cluster GKE con nodi Windows Server aggiunti al dominio e configura il cluster in modo che supporti le gMSA di Active Directory.
- Crea ed esegui il deployment di un'immagine container dell'applicazione web ASP.NET che utilizza IIS con l'autenticazione Windows integrata.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
- Compute Engine
- GKE
- Artifact Registry
- Other costs that are associated with the related tutorial Configuring Active Directory for VMs to automatically join a domain:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il Calcolatore prezzi.
Prima di iniziare
Segui i passaggi descritti nel tutorial Configurare Active Directory per consentire alle VM di partecipare automaticamente a un dominio per creare il servizio Cloud Run di adesione al dominio Active Directory.
Se stai eseguendo questo tutorial in un progetto Google Cloud diverso da quello in cui hai creato una VM per testare l'unione automatica al dominio, segui i passaggi per abilitare un progetto per l'unione automatica al dominio nel tuo progetto Google Cloud .
Al termine dell'altro tutorial, avrai un nuovo servizio Cloud Run e il relativo URL verrà stampato nella finestra PowerShell (il valore della variabile
$RegisterUrl
). Prendi nota dell'indirizzo del servizio, perché lo utilizzerai in questo tutorial.Assicurati di aver attivato le API per Compute Engine, GKE, Cloud Build, Artifact Registry e l'API Cloud Resource Manager:
Al termine di questo tutorial, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.
Architettura
Le applicazioni basate su Windows che vengono eseguite in un server Windows Server aggiunto a un dominio spesso utilizzano le identità di Microsoft Active Directory (AD) per autenticare gli utenti e le applicazioni. Ecco alcuni casi d'uso comuni:
- Creazione di applicazioni web ASP.NET che utilizzano l'autenticazione integrata di Windows per autenticare gli utenti di Active Directory quando tentano di accedere all' applicazione web.
- Creazione di applicazioni che utilizzano l'account computer Active Directory del server per accedere alle risorse tramite la rete, ad esempio una condivisione SMB remota o un'istanza Microsoft SQL Server remota.
I contenitori Windows non possono essere aggiunti a un dominio e pertanto non dispongono di account computer in Active Directory. Per questo motivo, le applicazioni web ASP.NET in esecuzione su container Windows non possono autenticare gli utenti di Active Directory tramite l'autenticazione integrata di Windows e, di conseguenza, non possono accedere alle risorse protette nella rete. Per ulteriori informazioni su come ASP.NET accede alle risorse protette, consulta Identità del pool di applicazioni nella documentazione di Microsoft.
Invece di utilizzare un account computer, i contenitori Windows possono utilizzare un'identità gMSA (account di servizio gestito) di gruppo Active Directory per accedere ad Active Directory e ad altre risorse protette nella rete, come le condivisioni file e le istanze SQL Server. Per ulteriori informazioni, consulta la Panoramica degli account di servizio gestiti dal gruppo nella documentazione di Microsoft.
Il seguente diagramma di architettura mostra le risorse utilizzate in questo tutorial:
Il diagramma mostra i seguenti elementi:
- VM di sviluppo. In questo tutorial crei una VM Windows Server che utilizzerai per compilare l'immagine del contenitore dell'applicazione web ASP.NET e per creare il gMSA.
- Cluster e nodi GKE. Il
cluster GKE in questo tutorial ha sia un node pool Linux che un pool di nodi Windows Server che vengono utilizzati nei seguenti modi:
- I nodi Linux eseguono componenti di sistema che funzionano solo sui sistemi operativi Linux, come il server delle metriche GKE.
- I nodi Windows Server vengono utilizzati per ospitare i container Windows Server e sono uniti a un dominio Active Directory.
- Infrastruttura Active Directory. Per consentire ai nodi Windows GKE di partecipare a un dominio, devi prima eseguire il tutorial sulla configurazione di Active Directory per consentire alle VM di partecipare automaticamente a un dominio. In questo tutorial, crei un servizio Cloud Run responsabile della registrazione di nuovi computer (istanze) in Active Directory e fornisci a ogni nuova istanza una password temporanea che l'istanza utilizza per completare la procedura di adesione al dominio. Ogni nuova istanza nel pool di nodi Windows Server chiama il servizio Cloud Run per unirsi al dominio Active Directory.
- Bilanciatore del carico di rete. Quando un utente on-premise apre il browser e accede all'applicazione web ASP.NET, il traffico passa attraverso un bilanciatore del carico di rete. Il bilanciatore del carico viene creato da GKE quando crei un servizio LoadBalancer GKE per la tua applicazione web. L'utente si autentica anche all'applicazione web passando le proprie credenziali di Active Directory all'applicazione web.
Creazione dell'infrastruttura
Dopo aver completato il tutorial correlato, crea i componenti dell'infrastruttura per il tutorial corrente, tra cui:
- Una VM Windows Server con un'immagine container dell'applicazione web ASP.NET.
- Un cluster GKE con un pool di nodi Windows Server.
- Regole firewall che consentono ai pod GKE di accedere ad Active Directory.
- Un webhook nel cluster GKE che gestisce la configurazione e l'inizializzazione delle risorse gMSA nei deployment.
Crea una VM di sviluppo
L'immagine container Windows Server che crei deve corrispondere alla versione di Windows Server della VM in cui viene creata l'immagine container. Questa versione deve anche corrispondere alla versione di Windows Server dei nodi Windows Server GKE. La creazione di un'immagine container o l'esecuzione di un container in una versione diversa di Windows Server genera un errore. Per ulteriori informazioni sui requisiti di compatibilità dei container Windows, consulta Abbinare la versione dell'host del contenitore alle versioni delle immagini del contenitore.
Questo tutorial utilizza la versione 2022 del Long-Term Servicing Channel (LTSC) di Windows Server per la VM, i nodi Windows Server in GKE e l'immagine del contenitore. Per ulteriori informazioni, consulta la mappatura delle versioni tra le versioni di Windows Server e GKE.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
- Se PowerShell è aperto, chiudilo digitando
exit
. Imposta le variabili di ambiente per il nome della rete e della sottorete e per l'URL del servizio Active Directory:
export NETWORK_NAME=NETWORK-NAME export SUBNETWORK_NAME=SUBNETWORK-NAME export AD_JOIN_SERVICE_URL=AD-JOIN-SERVICE-URL
Sostituisci quanto segue:
NETWORK-NAME
: la rete VPC in cui eseguire il deployment delle VM.SUBNETWORK-NAME
: la subnet in cui eseguire il deployment delle VM.AD-JOIN-SERVICE-URL
: l'URL del servizio Cloud Run di cui hai eseguito il deployment nella sezione Prima di iniziare.
Imposta l'ID progetto e la regione Google Cloud per l'ambiente corrente:
gcloud config set project PROJECT-ID gcloud config set compute/zone ZONE-NAME
Sostituisci quanto segue:
PROJECT-ID
: l'ID del tuo progetto Google Cloud .ZONE-NAME
: la zona in cui eseguire il deployment di tutte le VM. Per ridurre la latenza, ti consigliamo di selezionare una zona nella stessa regione in cui hai eseguito il deployment del servizio Cloud Run di adesione al dominio Active Directory.
Crea un account di servizio per la VM di sviluppo:
export SERVICE_ACCOUNT_NAME=dev-vm export SERVICE_ACCOUNT_EMAIL=$SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \ --display-name="Development VM Service Account"
Concedi all'account di servizio l'accesso ad Artifact Registry:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \ --role="roles/artifactregistry.writer"
Concedi all'account di servizio l'accesso a GKE:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \ --role="roles/container.admin"
All'account di servizio viene concesso il ruolo
container.admin
perché questo ha le autorizzazioni sia per creare cluster GKE nel progetto sia per gestire le risorse nei cluster, incluse le risorse di controllo dell'accesso basato su ruoli (RBAC). Le risorse RBAC sono necessarie per controllare a quale pod è consentito utilizzare un gMSA.Crea una nuova VM Windows Server 2022:
gcloud compute instances create gmsa-dev-vm \ --image-project windows-cloud \ --image-family windows-2022-core \ --machine-type n1-standard-2 \ --boot-disk-type=pd-ssd \ --boot-disk-size=100GB \ --network $NETWORK_NAME \ --subnet $SUBNETWORK_NAME \ --service-account=$SERVICE_ACCOUNT_EMAIL \ --scopes https://www.googleapis.com/auth/cloud-platform \ --metadata sysprep-specialize-script-ps1="iex((New-Object System.Net.WebClient).DownloadString('$AD_JOIN_SERVICE_URL')); Add-WindowsFeature RSAT-AD-PowerShell"
Se prevedi di eseguire il deployment delle applicazioni containerizzate nei contenitori Windows Server 2019, modifica il valore parametro
--image-family
inwindows-2019-core-for-containers
.L'ambito
https://www.googleapis.com/auth/cloud-platform
consente all'istanza di accedere a tutte le API di Google Cloud , a seconda dei ruoli IAM definiti per il account di servizio dell'istanza.La VM viene creata con un indirizzo IP esterno per consentirle di comunicare con internet. La VM deve avere accesso a internet per poter scaricare diverse utilità, come git e kubectl, nonché per scaricare l'applicazione web ASP.NET da GitHub.
Durante la fase
sysprep
, la nuova istanza viene unita al dominio Active Directory per consentirti di accedere da remoto all'istanza utilizzando il tuo account di dominio. Lo script nel comandosysprep
installa anche il modulo PowerShell per Active Directory.
Crea un repository Docker di Artifact Registry
In Cloud Shell, imposta la posizione predefinita per i nuovi repository Artifact Registry:
gcloud config set artifacts/location LOCATION
Sostituisci
LOCATION
con una regione in cui vuoi creare il repository Artifact Registry. Per ridurre la latenza, ti consigliamo di selezionare la stessa regione in cui hai eseguito il deployment della VM di sviluppo.Crea il repository Docker di Artifact Registry:
gcloud artifacts repositories create windows-container-images \ --repository-format=docker
Crea un cluster GKE
In Cloud Shell, imposta una variabile di ambiente per il nome del cluster GKE:
export GKE_CLUSTER_NAME=cluster-1
Crea il cluster GKE:
gcloud container clusters create $GKE_CLUSTER_NAME \ --release-channel rapid \ --network $NETWORK_NAME \ --subnetwork $SUBNETWORK_NAME \ --enable-ip-alias
Se imposti il parametro
--release-channel
surapid
, viene eseguito il deployment del cluster GKE con la versione più recente di Kubernetes. Il parametro--enable-ip-alias
attiva l'alias IP. L'IP alias è obbligatorio per i nodi Windows Server.
Creare un pool di nodi Windows Server in GKE
Quando crei un nuovo cluster GKE tramite la CLI, il cluster viene creato con un pool di nodi Linux. Per utilizzare Windows Server su GKE, crea un pool di nodi Windows Server.
I cluster GKE devono avere almeno un nodo Linux per eseguire i contenitori interni (di sistema) del cluster. Non è possibile creare un cluster GKE solo con nodi Windows Server.
In Cloud Shell, imposta una variabile di ambiente per il nome del pool di nodi del server Windows:
export NODE_POOL_NAME=windows-server-pool
Crea un pool di nodi Windows Server GKE:
gcloud container node-pools create $NODE_POOL_NAME \ --cluster $GKE_CLUSTER_NAME \ --machine-type n1-standard-2 \ --image-type WINDOWS_LTSC_CONTAINERD \ --windows-os-version=ltsc2022 \ --num-nodes 2 \ --no-enable-autoupgrade \ --metadata sysprep-specialize-script-ps1="iex((New-Object System.Net.WebClient).DownloadString('$AD_JOIN_SERVICE_URL'))"
Se prevedi di eseguire il deployment delle tue applicazioni containerizzate nei contenitori Windows Server 2019, modifica il parametro
--windows-os-version
inltsc2019
.La chiave dei metadati
sysprep-specialize-script-ps1
è una chiave integrata che rimanda a uno script PowerShell eseguito durante il passaggio GCESysprep, prima dell'avvio dell'istanza per la prima volta.Il cmdlet
iex
scarica lo script PowerShell dal servizio di unione al dominio Active Directory che hai disegnato su Cloud Run. Quindi, esegue lo script che unisce la nuova istanza al dominio Active Directory.Il parametro
--no-enable-autoupgrade
disattiva l'upgrade automatico dei nodi per tutti i nodi del pool. Questo accade perché l'upgrade dell'immagine Windows di un nodo può causare incompatibilità tra la versione di Windows Server del nodo e la versione di Windows Server del pod. Per ulteriori informazioni, consulta Eseguire l'upgrade dei pool di nodi Windows Server.Dopo aver creato ogni nodo, lo script PowerShell
domain-join
lo unisce al dominio.Attendi diversi minuti fino alla creazione del pool di nodi, quindi esegui il seguente comando per verificare che tutti i nodi si siano uniti al dominio:
kubectl get node \ -l cloud.google.com/gke-nodepool=$NODE_POOL_NAME \ -o custom-columns=":metadata.name" --no-headers \ | xargs -I{} gcloud compute instances get-serial-port-output {} --port 1 \ | grep "sysprep-specialize-script-ps1:.*success" --ignore-case
Se i nodi sono stati uniti al dominio, l'output è il seguente:
timestamp GCEMetadataScripts: sysprep-specialize-script-ps1: Successfully registered computer account. timestamp GCEMetadataScripts: sysprep-specialize-script-ps1: Computer successfully joined to domain Specify --start=152874 in the next get-serial-port-output invocation to get only the new output starting from here.
Se vuoi visualizzare l'output completo dello script, rimuovi
.*success
dalgrep
comando.
Concedi ai pod GKE l'accesso ad Active Directory
Devi creare una regola firewall che consenta ai pod del cluster GKE di accedere ai tuoi controller di dominio utilizzando i seguenti protocolli:
- Kerberos (UDP/88, TCP/88)
- NTP (UDP/123)
- RPC (TCP/135, TCP/49152-65535)
- LDAP (UDP/389, TCP/389)
- SMB (UDP/445, TCP/445)
- Gruppo di condivisioni LDAP (TCP/3268)
- Servizi web Active Directory (TCP/9389)
Puoi applicare la regola in base a un account di servizio che hai assegnato ai tuoi controller di dominio oppure utilizzando un tag di rete, come spiegato in questo tutorial. Per scoprire di più sulle porte correlate ad Active Directory, consulta la documentazione relativa ai requisiti delle porte e dei protocolli di Active Directory e all'utilizzo di Active Directory su firewall.
Se utilizzi il Managed Service for Microsoft Active Directory (Microsoft AD gestito), puoi saltare questa procedura.
In Cloud Shell, ottieni l'intervallo di indirizzi IP del pod del cluster GKE:
CLUSTER_IP_RANGE=`gcloud container clusters describe $GKE_CLUSTER_NAME --format="value(clusterIpv4Cidr)"`
Crea una regola firewall per concedere ai pod GKE l'accesso ad Active Directory:
gcloud compute firewall-rules create allow-gke-pods-to-ad \ --network $NETWORK_NAME \ --allow udp:88,tcp:88,udp:123,tcp:135,tcp:49152-65535,udp:389,tcp:389,udp:445,tcp:445,tcp:3268,tcp:9389 \ --source-ranges=$CLUSTER_IP_RANGE \ --target-tags DC-TAG
Sostituisci
DC-TAG
con il tag di rete assegnato alle VM dei controller di dominio.
Configura GKE per supportare l'utilizzo di gMSA
Per utilizzare un gMSA nei nodi Windows Server, devi creare l'oggetto gMSA in Active Directory, creare una risorsa gMSA corrispondente in GKE e consentire ai pod appena creati di recuperare le credenziali gMSA.
In Cloud Shell, scarica ed esegui lo script webhook gMSA:
export K8S_GMSA_DEPLOY_DOWNLOAD_REV=b685a27adc40511bb5756dfb3ada2e8578ee72e1 curl https://raw.githubusercontent.com/kubernetes-sigs/windows-gmsa/$K8S_GMSA_DEPLOY_DOWNLOAD_REV/admission-webhook/deploy/deploy-gmsa-webhook.sh -o deploy-gmsa-webhook.sh && chmod +x deploy-gmsa-webhook.sh ./deploy-gmsa-webhook.sh --file ./gmsa-webhook.yml --namespace gmsa-webhook --overwrite rm -drf gmsa-webhook-certs
Lo script aggiunge il manifest della definizione di risorsa personalizzata (CRD) gMSA al cluster GKE e esegue il deployment di un webhook che fornisce le specifiche gMSA ai pod. Ora puoi memorizzare le specifiche gMSA nel tuo cluster e configurare gMSA per i pod e i contenitori.
Per scoprire di più su Kubernetes e gMSA, consulta Configurare GMSA per pod e container Windows.
Il cluster GKE è ora pronto per eseguire applicazioni Windows che richiedono l'uso di un gMSA. Ad esempio, puoi eseguire un'applicazione web ASP.NET nei nodi Windows Server. Puoi configurare l'applicazione in modo che gli utenti accedano con l'autenticazione Windows o che utilizzi il gMSA del pod per accedere a una condivisione di rete remota o a un database SQL Server.
Integrazione con Active Directory
Successivamente, crea un account gMSA per la tua applicazione web ASP.NET in Active Directory, configura come può essere utilizzato e da chi, quindi aggiungi la relativa configurazione a GKE.
Accedi e avvia PowerShell
- Connettiti alla VM
gmsa-dev-vm
. Accedi a Windows utilizzando un account Active Directory autorizzato a creare un gMSA.
Il tuo account deve essere membro del gruppo
Domain Admins
o deve essere in grado di creare oggettiDomain Admins
.msDS-GroupManagedServiceAccount
Per ulteriori informazioni, consulta Provisioning degli account di servizio gestiti del gruppo.Se utilizzi AD Microsoft gestito, il tuo account deve essere membro del gruppo
Cloud Service Managed Service Account Administrators
. Per ulteriori informazioni, consulta Delegare l'amministrazione degli account di servizio gestiti.Digita
15
per uscire dal menu e passare alla riga di comando (PowerShell).
Installa un runtime del contenitore
Windows Server 2022 richiede un runtime del contenitore, come Docker Community Edition (CE), per creare ed eseguire i contenitori Windows. Per ulteriori informazioni sull'installazione di un runtime del contenitore su Windows Server, consulta Guida introduttiva: prepara Windows per i container nella documentazione Microsoft.
Se hai creato la VM di sviluppo utilizzando l'immagine windows-2019-core-for-containers
, puoi saltare la procedura seguente perché l'immagine ha già Docker installato.
Installa Docker Community Edition (CE):
Invoke-WebRequest -UseBasicParsing -o install-docker-ce.ps1 ` "https://raw.githubusercontent.com/microsoft/Windows-Containers/Main/helpful_tools/Install-DockerCE/install-docker-ce.ps1" .\install-docker-ce.ps1
Se durante la procedura di installazione la connessione del desktop remoto si chiude, ricollegati alla VM.
Attendi il completamento del processo di installazione, quindi digita
exit
per chiudere la nuova finestra PowerShell.Digita
15
per uscire dal menu e passare alla riga di comando (PowerShell).
Crea una chiave principale KDS
Prima di creare un gMSA, devi assicurarti che il tuo controller di dominio Active Directory abbia una chiave principale Key Distribution Services (KDS). Active Directory utilizza la chiave principale KDS per generare le password per le gMSA.
Se utilizzi Microsoft AD gestito, puoi saltare la procedura riportata di seguito perché Microsoft AD gestito crea la chiave principale KDS quando crei il dominio.
In
gmsa-dev-vm
, controlla se Active Directory ha già la chiave principale KDS:Get-KdsRootKey
Questo comando mostra l'ID chiave, se esistente.
Se non ricevi un ID chiave in risposta, crea la chiave:
Add-KdsRootKey -EffectiveTime ((get-date).addhours(-10))
Crea il gMSA
Quando crei un gMSA, devi fornire i nomi dei computer che hanno accesso al gMSA. Come best practice di sicurezza, devi concedere l'autorizzazione al gMSA solo alle istanze in cui viene eseguita l'applicazione. Quando crei un pool di nodi Windows Server aggiunto a un dominio, viene creato un nuovo gruppo Active Directory per i computer del pool di nodi. Il nome del gruppo corrisponde al nome del gruppo di istanze gestite (MIG) creato da GKE per il pool di nodi.
In PowerShell, imposta le variabili per l'ID progetto Google Cloud , il nome del cluster, il nome del pool di nodi Windows, il nome del gMSA e il nome del dominio AD:
$ProjectId = "PROJECT-ID" $GkeClusterName = "cluster-1" $PermittedNodePool = "windows-server-pool" $GmsaName = "WebApp-01" $AdDomain = (Get-ADDomain).DNSRoot
Sostituisci
PROJECT-ID
con l'ID progetto Google Cloud .Imposta la configurazione del cluster per lo strumento
gcloud
:gcloud config set project $ProjectId gcloud config set compute/zone "ZONE-NAME"
Sostituisci
ZONE-NAME
con la zona in cui hai eseguito il deployment del cluster GKE.Recupera il nome di dominio del gruppo Active Directory creato per il pool di nodi:
$InstanceGroupUri = gcloud container node-pools describe $PermittedNodePool ` --cluster $GkeClusterName ` --format="value(instanceGroupUrls)" $InstanceGroupName=([System.Uri]$instanceGroupUri).Segments[-1] $GroupDN=(Get-ADGroup -Filter "name -eq '$InstanceGroupName'") Write-Host $GroupDN.DistinguishedName
Crea il gMSA:
New-ADServiceAccount -Name $GmsaName ` -DNSHostName "$GmsaName.$AdDomain" ` -PrincipalsAllowedToRetrieveManagedPassword $GroupDN
Verifica che il gruppo di risorse gestite generiche sia stato creato:
Get-ADServiceAccount -Identity $GmsaName
Se il gruppo di risorse gestite è stato creato, l'output è simile al seguente:
DistinguishedName : CN=WebApp01,CN=Managed Service Accounts,DC=corp,DC=example,DC=com Enabled : True Name : WebApp01 ObjectClass : msDS-GroupManagedServiceAccount ObjectGUID : 5afcff45-cf15-467d-aaeb-d65e53288253 SamAccountName : WebApp01$ SID : S-1-5-21-780151012-601164977-3226406772-2103 UserPrincipalName :
Aggiungi il gMSA a GKE
Per utilizzare un account gMSA in un cluster Kubernetes, devi creare una risorsa gMSA in Kubernetes e configurare gli spazi dei nomi e gli account che possono utilizzarla.
Su
gmsa-dev-vm
, in PowerShell, installa lo strumentogit
:Install-Script -Name Install-Git -Force Install-Git.ps1 $env:Path += ";c:\program files\git\bin"
Installa lo strumento
kubectl
:$version = (Invoke-WebRequest -UseBasicParsing -Uri "https://dl.k8s.io/release/stable.txt").Content $uri = "https://dl.k8s.io/release/$version/bin/windows/amd64/kubectl.exe" New-Item -Type Directory $env:ProgramFiles\kubectl Start-BitsTransfer -Source $uri -Destination $env:ProgramFiles\kubectl\ $env:Path += ";$env:ProgramFiles\kubectl"
Installa il programma binario
gke-gcloud-auth-plugin
:gcloud components install gke-gcloud-auth-plugin
Attendi alcuni minuti per il completamento della procedura di installazione.
Inizializza lo strumento
kubectl
con le credenziali del tuo cluster GKE:gcloud container clusters get-credentials $GkeClusterName
Crea il file Specifiche delle credenziali gMSA:
Install-Module CredentialSpec -Force $GmsaName = $GmsaName.ToLower() $CredSpecFile = Join-Path $env:TEMP "$GmsaName-credspec.json" New-CredentialSpec -AccountName $GmsaName -Path $CredSpecFile $CredentialsSpec=@{ "apiVersion" = "windows.k8s.io/v1"; "kind" = "GMSACredentialSpec"; "metadata" = @{"name" = $GmsaName} "credspec" = (Get-Content $CredSpecFile | ConvertFrom-Json) } $CredentialsSpec | ConvertTo-Json -Depth 5 | Set-Content $CredSpecFile
Il nome della risorsa
GMSACredentialSpec
in Kubernetes deve utilizzare caratteri minuscoli.Lo script modifica le lettere maiuscole della variabile
$GmsaName
per rispettare questa limitazione.Lo script mostra un messaggio di avviso che indica che il test dell'account servizio gestito non è riuscito, come previsto. La VM di sviluppo non è un membro del gruppo assegnato all'account gMSA e, pertanto, non puoi testare l'account gMSA dalla VM. Il messaggio di avviso non impedisce al comando di generare la specifica delle credenziali gMSA.
Aggiungi la specifica delle credenziali gMSA al cluster GKE:
kubectl apply -f $CredSpecFile
Clona il repository GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/windows/aspnet-gmsa/
Aggiungi gli oggetti RBAC gMSA al cluster:
kubectl apply -f gmsa-rbac-webapp-01.yaml
gmsa-rbac-webapp-01.yaml
crea un oggetto RBACClusterRole
per il gMSA e poi lega il nuovo ruolo del cluster all'account di servizio predefinito nello spazio dei nomidefault
. Se esegui il deployment dell'applicazione in un distinto ambito, modifica il filegmsa-rbac-webapp-01.yaml
e modifica l'ambito per l'associazione dei ruoli e per l'account di servizio.
Deployment e utilizzo dell'applicazione web
Successivamente, devi compilare l'applicazione web e l'immagine del contenitore, eseguire il deployment della nuova immagine del contenitore nel cluster GKE e aprire l'applicazione web nel browser per verificare che possa utilizzare il gMSA.
Crea ed esegui il deployment dell'applicazione web ASP.NET
In
gmsa-dev-vm
, in PowerShell, imposta le variabili per la posizione del registry, il nome del registry e il tag immagine:$RegistryLocation = "LOCATION-docker.pkg.dev" $ProjectsRegistry = "$RegistryLocation/$ProjectId" $ImageTag = "$ProjectsRegistry/windows-container-images/test-gmsa:latest"
Sostituisci
LOCATION
con la posizione in cui hai creato il repository Artifact Registry.Crea l'immagine container:
docker build -t $ImageTag -f Dockerfile-WINDOWS_LTSC2022 .
Per creare immagini container per Windows Server 2019, imposta il valore del parametro
-f
suDockerfile-WINDOWS_LTSC2019
.Esegui il push dell'immagine del contenitore in Artifact Registry:
gcloud auth configure-docker $RegistryLocation --quiet docker push $ImageTag
Scarica il file YAML dell'applicazione e aggiornalo con la configurazione gMSA:
$ApplicationYaml = Join-Path $env:TEMP "gmsa-test-webapp-01.yaml" (Get-Content gmsa-test-webapp-01.yaml.template) ` -Replace '\${image_path}',$ImageTag | ` Set-Content $ApplicationYaml
Se crei nodi Windows Server 2019 in GKE, modifica il file YAML dell'applicazione e cambia il valore di
cloud.google.com/gke-windows-os-version
da2022
a2019
.Esegui il deployment dell'applicazione web nel tuo cluster GKE:
kubectl apply -f $ApplicationYaml
Verifica che l'applicazione web ASP.NET sia in esecuzione
L'applicazione web è esposta a internet utilizzando un servizio LoadBalancer
.
Prima di poter accedere all'applicazione web, devi attendere il deployment del pod e del servizio. Il deployment del pod può richiedere diversi minuti perché le immagini dei container Windows Server Core sono di grandi dimensioni (l'immagine dell'applicazione web è più grande di 7 GB) e il nodo impiega del tempo per scaricare l'immagine e creare il container.
Controlla lo stato del pod:
kubectl get pods --selector=app=gmsa-test-webapp-01
Ripeti il comando finché l'output non indica che lo stato del pod è Running:
NAME READY STATUS RESTARTS AGE gmsa-test-webapp-01-76c6d64975-zrtgq 1/1 Running 0 28s
Se lo stato del pod rimane Pending e non diventa ContainerCreating o Running, controlla l'immagine di origine del tuo nodo Windows per assicurarti che sia Windows Server 2022. Puoi anche controllare la tabella della mappatura delle versioni per vedere come le versioni GKE vengono mappate alle versioni di Windows Server. Se le versioni non corrispondono, duplica il file
Dockerfile-WINDOWS_LTSC2022
, imposta la immagine del contenitore di base nel nuovo file in modo che corrisponda alla versione di Windows Server dei tuoi nodi, quindi ripeti i passaggi per eseguire il build e il deployment dell'applicazione web ASP.NET.Controlla lo stato del servizio:
kubectl get service --selector=app=gmsa-test-webapp-01
Ripeti il comando finché l'output non mostra che il servizio ha un indirizzo IP esterno:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gmsa-test-webapp-01 LoadBalancer 10.44.2.112 external-ip 80:32233/TCP 17s
Prendi nota del valore external-ip nell'output, che ti servirà in seguito.
Esegui test preliminari nell'applicazione web ASP.NET
Il pod è ora in esecuzione ed è accessibile da internet tramite un bilanciatore del carico di rete. Successivamente, esegui test preliminari per verificare che il contenitore sia stato eseguito correttamente e che disponga delle autorizzazioni per utilizzare il gMSA.
In un browser, vai a
http://EXTERNAL-IP
per visualizzare l'applicazione web di test gMSA.Sostituisci
EXTERNAL-IP
con l'indirizzo IP che hai ottenuto nella procedura precedente.Scorri fino alla sezione Controlli preflight e fai clic sul pulsante Esegui controlli preflight per verificare che tutti i test siano stati superati.
Se i test vengono superati, l'output è il seguente:
[PASS] Active Directory RSAT PowerShell Module Installed [PASS] IIS Document Root found C:\inetpub\wwwroot\ [PASS] PowerShell Scripts Folder found C:\inetpub\wwwroot\Powershell\ [PASS] Container Diagnostic Script found C:\inetpub\wwwroot\Powershell\\containerDiag.ps1 [PASS] Domain Diagnostic Script found C:\inetpub\wwwroot\Powershell\\domainDiag.ps1 [RES] Result: PASS All checks passed! Please proceed to run the different tests.
Scorri fino alla sezione Informazioni sul contenitore e fai clic sul pulsante Esegui script. Verifica di visualizzare le informazioni sul contenitore e sul nodo e che non venga visualizzato alcun errore.
Utilizzare il gMSA nei container Windows
Ora puoi verificare che la configurazione di gMSA funzioni correttamente eseguendo diversi test nell'applicazione web. Ognuno dei test utilizza gMSA per scopi diversi. Se tutti i test hanno esito positivo, significa che hai configurato correttamente il gMSA.
Convalida la configurazione del contenitore gMSA
Scorri fino alla sezione Connettività del dominio, digita il nome del tuo gMSA (
WebApp-01
) nella casella Nome account e poi fai clic su Esegui script. Attendi qualche secondo per il completamento dei test.L'output è simile al seguente:
***** C O N T A I N E R D I A G N O S T I C S ***** [INFO] Starting script execution at 01-05-2021-13:53:11 [INFO] Using gMSA: WebApp-01 [PASS] gMSA Account found in Active Directory CN=WebApp01,CN=Managed Service Accounts,DC=corp,DC=example,DC=com [PASS] This Container (gmsa-test-webapp01-5bc485b8d5-9lbb7) is running on a GKE Windows Node that is authorized to use WebApp01 [INFO] Script execution complete at 01-05-2021-13:53:12 ***** E N D O F D I A G N O S T I C S *****
Lo script utilizza due cmdlet di PowerShell per testare l'accesso al gMSA:
Get-ADServiceAccount
: questo cmdlet recupera informazioni su un account gMSA. Se questo comando viene eseguito correttamente, il contenitore è in esecuzione con un gMSA valido.Test-ADServiceAccount
: Questo cmdlet verifica se è possibile recuperare le credenziali gMSA. Se il comando viene eseguito correttamente, il contenitore è in esecuzione in un nodo Windows Server autorizzato ad accedere alle credenziali gMSA.
Accedere con l'autenticazione Windows
- Nella barra di navigazione in alto della pagina, fai clic su Accedi.
- Quando ti viene chiesto di inserire le credenziali, inserisci il nome utente e la password del tuo dominio.
Se vedi la pagina Sicuro con i dati del tuo account e non ti viene richiesto di inserire le credenziali, significa che il browser ha eseguito automaticamente l'accesso utilizzando la tua identità corrente.
Una volta autenticato, viene visualizzata la pagina Sicuro. Assicurati di vedere le tre sezioni seguenti:
- Informazioni utente: vengono visualizzati il nome utente e il tipo di autenticazione utilizzato.
- Gruppi: mostra l'elenco dei gruppi di cui fai parte. I nomi dei gruppi nell'elenco vengono recuperati da Active Directory.
- Claim utente: mostra l'elenco dei claim per l'utente forniti da Active Directory durante l'accesso. Le rivendicazioni di appartenenza al gruppo mostrano il SID del gruppo Active Directory, non i relativi nomi.
Oltre a supportare l'autenticazione Windows integrata, l'applicazione web ASP.NET può utilizzare il proprio gMSA per l'autenticazione quando chiama i server remoti. Con gMSA, l'applicazione web e qualsiasi altra applicazione in esecuzione nel contenutore Windows possono accedere alle risorse della rete che richiedono l'autenticazione di Windows, come le istanze SQL Server e le condivisioni di rete basate su SMB.
Risoluzione dei problemi
Se ricevi messaggi di errore durante la procedura di configurazione o durante il test dell'applicazione web, consulta le seguenti pagine di risoluzione dei problemi:
- Risoluzione dei problemi di Windows Server su GKE
- Documentazione di Kubernetes sulla risoluzione dei problemi relativi ai container Windows Server
- Documentazione Microsoft sulla risoluzione dei problemi relativi ai gMSA per i container Windows
Considerazioni aggiuntive per le applicazioni di produzione
Le istruzioni che hai seguito sono state scritte per fornire un percorso ottimale ai fini del tutorial. Per un ambiente di produzione, potresti apportare modifiche ad alcune procedure per rendere il risultato più solido, come descritto nelle sezioni seguenti.
Considerazioni sul pool di nodi Windows Server
Se prevedi di eseguire il deployment della tua applicazione che utilizza un account gMSA e l'applicazione supporta le sessioni client, ti consigliamo di creare almeno due nodi nel pool di nodi. La presenza di più nodi ti consente di utilizzare lo spazio di archiviazione delle sessioni out-of-process per verificare che la tua applicazione possa gestire correttamente le sessioni distribuite.
In questo tutorial, crei un singolo pool di nodi Windows Server per ospitare le tue applicazioni. Tuttavia, potrebbero verificarsi situazioni in cui vuoi creare più pool di nodi Windows Server nel tuo cluster, ad esempio un pool di nodi con dischi permanenti (DP) HDD e un altro pool di nodi con DP SSD. Se devi eseguire il deployment dell'applicazione in più pool di nodi, fornisci un array di oggetti gruppo Active Directory al parametro PrincipalsAllowedToRetrieveManagedPassword
quando crei il gMSA utilizzando il cmdlet New-ADServiceAccount
.
Considerazioni sul nome entità servizio (SPN) e sui gMSA
Se la tua applicazione richiede l'autenticazione degli utenti tramite Kerberos (ad esempio per supportare la delega dell'identità), devi accedere all'applicazione utilizzando un DNS personalizzato e configurare il gMSA con un nome entità servizio (SPN).
Ad esempio, se il bilanciatore del carico espone l'applicazione su GKE tramite https://my-web-app/
, devi creare un SPN denominato HTTP/my-web-app
in uno dei seguenti modi:
Per un nuovo gMSA, crealo con gli SPN richiesti. Ad esempio:
New-ADServiceAccount -Name $GmsaName ` -DNSHostName "$GmsaName.$AdDomain" ` -PrincipalsAllowedToRetrieveManagedPassword $Groups ` -ServicePrincipalNames "HTTP/my-web-app", "HTTP/my-web-app.$AdDomain"
Per un account gMSA esistente, chiama
Set-ADServiceAccount
per aggiungere gli SPN richiesti all'account gMSA. Ad esempio:Set-ADServiceAccount $GmsaName -ServicePrincipalNames @{Add="HTTP/my-web-app", "HTTP/my-web-app.$AdDomain"}
A seconda della configurazione DNS, potrebbe essere necessario creare un SPN anche per HTTP/www.my-web-app
e HTTP/www.my-web-app.$AdDomain
.
Per i protocolli non HTTP, ad esempio un servizio WCF configurato con il binding TCP e l'autenticazione Windows, potrebbe essere necessario creare altri tipi di SPN, ad esempio un SPN HOST/
.
Scelta dell'identità del pool di applicazioni IIS
Le applicazioni web ASP.NET vengono eseguite in Windows sul server web IIS. In IIS, configuri gruppi di applicazioni web che condividono lo stesso processo. Questo gruppo è chiamato
pool di applicazioni.
Ogni pool di applicazioni è ospitato in un processo dedicato denominato w3wp
. I pool di applicazioni IIS forniscono la configurazione del processo, ad esempio se si tratta di un processo a 32 o 64 bit, e forniscono l'identità del processo. Quando
esegui un'applicazione web in un contenitore Windows, imposta l'identità del processo
del pool di applicazioni in modo che utilizzi l'account Network Service integrato.
Gli account dell'identità del pool di applicazioni locali, supportati anche da IIS, non sono obbligatori nei contenitori Windows. Gli account identità del pool di applicazioni sono stati creati da IIS per applicare un confine di sicurezza locale quando vengono eseguite più applicazioni web sulla stessa istanza IIS. Con i contenitori Windows, in cui ogni applicazione web è ospitata in un contenitore separato, non è necessario creare un confine di sicurezza all'interno del contenitore, perché il contenitore stesso fornisce il confine di sicurezza.
Anche se l'identità del pool di applicazioni è configurata per utilizzare l'account Network Service, se l'applicazione invia una richiesta a una risorsa esterna che richiede l'autenticazione, l'applicazione si autentica utilizzando il gMSA che hai configurato per il contenitore Windows.
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Rimozione di singole risorse
Se vuoi mantenere il progetto Google Cloud , ma non vuoi eliminare le risorseGoogle Cloud che hai creato per questo tutorial, puoi rimuoverle singolarmente.
Ripristinare le modifiche di Active Directory
- Connettiti alla VM di sviluppo e accedi come utente con accesso amministrativo al tuo dominio Active Directory.
Nella VM
gmsa-dev-vm
, se PowerShell non è già aperto, apri:PowerShell
Elimina il gMSA:
Remove-ADServiceAccount -Identity "WebApp-01" -Confirm:$false
Eliminare le risorse cloud
In the Google Cloud console, activate Cloud Shell.
Inizializza l'ambiente
gcloud
:gcloud config set project PROJECT-ID gcloud config set compute/zone ZONE-NAME gcloud config set artifacts/location LOCATION
Sostituisci quanto segue:
PROJECT-ID
: l'ID del tuo progetto Google Cloud .ZONE-NAME
: la zona in cui hai eseguito il deployment del cluster GKE e della VM di sviluppo.LOCATION
: la regione in cui hai eseguito il deployment del repository Artifact Registry.
Elimina la VM di sviluppo:
gcloud compute instances delete gmsa-dev-vm --quiet
Elimina l'account di servizio:
gcloud iam service-accounts delete dev-vm@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com --quiet
Elimina il cluster GKE:
gcloud container clusters delete cluster-1 --quiet
Se hai creato una regola firewall per i controller Active Directory, eliminala:
gcloud compute firewall-rules delete allow-gke-pods-to-ad --quiet
Elimina il repository Docker di Artifact Registry:
gcloud artifacts repositories delete windows-container-images --quiet
Per completare, segui i passaggi di pulizia descritti in Configurare Active Directory per consentire alle VM di partecipare automaticamente a un dominio.
Passaggi successivi
- Scopri di più sui container Windows Server su GKE.
- Scopri come creare un cluster GKE utilizzando i pool di nodi Windows Server.
- Scopri altri modi per eseguire il deployment di applicazioni Windows Server.
- Consulta le nostre best practice per il deployment di una foresta di risorse Active Directory su Google Cloud.