In questa pagina scoprirai come eseguire il deployment di un'applicazione Windows Server senza stato su un cluster Google Kubernetes Engine (GKE), che può essere pubblico o privato. Inoltre, puoi scoprire come il deployment di un'applicazione Windows stateful.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:
- Attiva l'API Artifact Registry l'API Google Kubernetes Engine. Abilita le API
- Se vuoi utilizzare Google Cloud CLI per questa attività,
install e poi
inizializzare
con gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente
eseguendo
gcloud components update
.
Deployment di un'applicazione Windows Server in un cluster
Per eseguire il deployment di un'applicazione Windows Server in un cluster pubblico GKE, devi svolgere le seguenti attività:
- Crea un cluster.
- Crea un file manifest di deployment.
- Crea ed esponi il deployment.
- Verifica che il pod sia in esecuzione.
Crea un cluster
Se hai già un cluster GKE che utilizza pool di nodi Windows Server, vai al passaggio successivo. In caso contrario, crea un cluster utilizzando i pool di nodi di Windows Server.
Creare un file manifest di deployment
I nodi di Windows Server sono
incompatibile
con la seguente coppia chiave-valore: node.kubernetes.io/os=windows:NoSchedule
.
Questo danneggiamento garantisce che lo scheduler GKE non provi a eseguire i container Linux sui nodi Windows Server. Per pianificare i contenitori Windows Server su nodi Windows Server, il file manifest deve includere questo selettore di nodi:
nodeSelector:
kubernetes.io/os: windows
Un webhook di ammissione in esecuzione nel cluster controlla la presenza di questo selettore di nodi Windows nei nuovi carichi di lavoro e, se lo trova, applica la seguente tolleranza al carico di lavoro, che consente di eseguirlo sui nodi Windows Server compromessi:
tolerations:
- effect: NoSchedule
key: node.kubernetes.io/os
operator: Equal
value: windows
In alcuni casi può essere necessario includere questa tolleranza esplicitamente nel file manifest. Ad esempio, se stai eseguendo il deployment di un DaemonSet con un'immagine contenitore multi-arch da eseguire su tutti i nodi Linux e Windows Server del cluster, il file manifest non includerà il selettore dei nodi Windows. Devi includere esplicitamente la tolleranza per l'incompatibilità di Windows.
File manifest di esempio
Il seguente esempio di file di deployment (iis.yaml
) esegue il deployment dell'immagine IIS di Microsoft
a un singolo pod:
apiVersion: apps/v1
kind: Deployment
metadata:
name: iis
labels:
app: iis
spec:
replicas: 1
selector:
matchLabels:
app: iis
template:
metadata:
labels:
app: iis
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: iis-server
image: mcr.microsoft.com/windows/servercore/iis
ports:
- containerPort: 80
Questo file è destinato a un cluster in cui tutti i carichi di lavoro utilizzano lo stesso tipo e la stessa versione dell'immagine del nodo Windows Server. Per maggiori dettagli su come utilizzare immagini dei nodi miste, consulta Sezione Utilizzo di immagini dei nodi miste.
crea ed esponi il deployment
Crea ed esponi il file di deployment creato nel passaggio precedente come servizio Kubernetes con un deployment del bilanciatore del carico esterno.
Per creare la risorsa Deployment, esegui il comando seguente:
kubectl apply -f iis.yaml
Per esporre il deployment come bilanciatore del carico esterno, esegui questo comando :
kubectl expose deployment iis \ --type=LoadBalancer \ --name=iis
Verifica che il pod sia in esecuzione
Verifica che il pod funzioni convalidandolo.
Controlla lo stato del pod utilizzando
kubectl
:kubectl get pods
Attendi finché l'output restituito non indica che lo stato del pod è
Running
:NAME READY STATUS RESTARTS AGE iis-5c997657fb-w95dl 1/1 Running 0 28s
Visualizza lo stato del servizio e attendi fino al campo
EXTERNAL-IP
è compilato:kubectl get service iis
Dovresti vedere l'output seguente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE iis LoadBalancer 10.44.2.112 external-ip 80:32233/TCP 17s
Ora puoi utilizzare il browser per aprire http://EXTERNAL_IP
e visualizzare la pagina web di IIS.
Deployment di un'applicazione Windows Server in un cluster privato
Questa sezione mostra come eseguire il deployment di un'applicazione contenitore Windows Server in un cluster privato.
Le immagini container di Windows Server hanno diversi livelli, mentre quelli di base sono forniti da Microsoft. I livelli di base vengono memorizzati come livello esterno anziché essere incorporati nell'immagine come avviene per i livelli dell'immagine Docker di Linux. Quando un'immagine del container Windows Server viene recuperata per la prima volta, i livelli di base devono essere scaricati dai server Microsoft. Poiché i nodi del cluster privato non hanno connettività a internet, i livelli del contenitore di base Windows Server non possono essere estratti direttamente dai server Microsoft.
Per utilizzare i cluster privati, puoi configurare il daemon Docker in modo da consentire il push e non distribuibili ai registri privati. Per scoprire di più, consulta la sezione Consenti il push di elementi non distribuibili nella pagina GitHub di Docker.
Per eseguire il deployment dell'applicazione Windows Server in un cluster privato:
- Crea un cluster privato con nodi Windows Server.
- Crea l'immagine Docker dell'applicazione Windows Server.
- Esegui il deployment dell'applicazione in un cluster privato.
- Verifica che il pod sia in esecuzione.
Creare un cluster privato
Segui le istruzioni riportate in Creazione di un cluster con nodi Windows Server e Creazione di un cluster privato per creare e aggiungere un pool di nodi Windows a un cluster privato.
Crea l'immagine Docker dell'applicazione Windows Server
Per creare l'immagine Docker, avvia un'istanza Compute Engine con la versione di Windows Server su cui vuoi eseguire i container dell'applicazione, ad esempio Windows Server 2019 o Windows Server versione 20H2. Inoltre, assicurati di avere una connessione a internet.
Nell'istanza Compute Engine, vai alla configurazione del daemon Docker:
cat C:\ProgramData\docker\config\daemon.json
Configura il file Docker
daemon.json
per consentire il push di livelli esterni nel tuo registry privato aggiungendo queste righe:{ "allow-nondistributable-artifacts": ["REGISTRY_REGION-docker.pkg.dev"] }
In questo esempio,
REGISTRY_REGION-docker.pkg.dev
si riferisce ad Artifact Registry, in cui verrà ospitata l'immagine.Riavvia il daemon Docker:
Restart-Service docker
Crea e tagga l'immagine Docker per la tua applicazione:
cd C:\my-app
docker build -t REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2 .
Questo comando indica a Docker di creare l'immagine utilizzando il Dockerfile nella directory corrente e la tagga con un nome, ad esempio
us-central1-docker.pkg.dev/my-project/my-repository/my-app:v2
.Esegui il push dell'immagine Docker dell'applicazione nel repository Artifact Registry del progetto. L'insieme di configurazione
allow-nondistributable-artifacts
causa il Livelli di base di Windows da inviare al tuo registro privato.docker push REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
Creare un file manifest di deployment
Di seguito è riportato un file manifest di deployment di esempio denominato my-app.yaml
. L'immagine in questo esempio è quella che hai inviato nel passaggio precedente (REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
).
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: my-server
image: REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
Utilizza il comando
get-credentials
per consentire akubectl
di funzionare con il cluster che hai creato:gcloud container clusters get-credentials CLUSTER_NAME
Sostituisci
CLUSTER_NAME
con il nome del privato che hai creato.Esegui il deployment dell'applicazione specificata nel file
my-app.yaml
nel tuo cluster privato:kubectl apply -f my-app.yaml
Verifica che il pod sia in esecuzione
Elenca tutti i pod per assicurarti che l'applicazione venga eseguita correttamente:
kubectl get pods
Dovresti vedere il pod con lo stato Running
come nell'output seguente:
NAME READY STATUS RESTARTS AGE
my-app-c95fc5596-c9zcb 1/1 Running 0 5m
Utilizzo di immagini dei nodi miste
I cluster possono contenere pool di nodi con più tipi di Windows Server e Versioni server. Possono anche combinare i carichi di lavoro di Windows Server e Linux. Le sezioni che seguono forniscono dettagli su come configurare i carichi di lavoro per l'utilizzo di questi tipi di cluster.
Utilizzo di carichi di lavoro con tipi di immagini dei nodi Windows Server diversi
Puoi aggiungere pool di nodi con diversi tipi di immagini Windows Server al tuo cluster. In un cluster con tipi di Windows Server misti, devi assicurarti che i container Windows Server non siano pianificati su un Nodo Windows Server.
Se hai un pool di nodi Windows Server LTSC e un pool di nodi Windows Server SAC, aggiungi l'etichetta del nodo gke-os-distribution
a entrambi i carichi di lavoro.
Includi il seguente nodeSelector nel file manifest per il tuo server Windows Carichi di lavoro LTSC:
nodeSelector:
kubernetes.io/os: windows
cloud.google.com/gke-os-distribution: windows_ltsc
Includi il seguente nodeSelector nel file manifest per i carichi di lavoro Windows Server SAC.
nodeSelector:
kubernetes.io/os: windows
cloud.google.com/gke-os-distribution: windows_sac
L'aggiunta di questa etichetta garantisce che le immagini container LTSC non vengano pianificate su nodi SAC incompatibili e viceversa.
Utilizzo di carichi di lavoro con versioni diverse del sistema operativo Windows Server LTSC
I nodi Windows Server supportano le immagini del sistema operativo LTSC2022 e LTSC2019. Puoi
specifica la versione del sistema operativo Windows da utilizzare (LTSC2022) con la seguente coppia chiave-valore
nell'associazione nodeSelector: cloud.google.com/gke-windows-os-version=2022
.
Questa etichetta del nodo garantisce che lo scheduler GKE scelga i nodi Windows Server corretti per eseguire i carichi di lavoro LTSC2022 o LTSC2019. Entrambi i nodi Windows Server appartengono al tipo di immagine windows_ltsc_containerd
. Il valore dell'etichetta del nodo può essere 2022
o 2019
. Se l'etichetta del nodo non è specificata, è possibile utilizzare sia i nodi LTSC2019 sia quelli LTSC2022 per pianificare i container. Per pianificare i contenitori Windows Server solo sui nodi Windows Server LTSC 2022, il file manifest deve includere questo selettore di nodi:
nodeSelector:
kubernetes.io/os: windows
cloud.google.com/gke-os-distribution: windows_ltsc
cloud.google.com/gke-windows-os-version: 2022
Utilizzo di carichi di lavoro con versioni diverse di Windows Server
Se devi eseguire pool di nodi Windows Server con più LTSC o
per le versioni SAC, consigliamo di creare le immagini container
immagini multi-arco
che possono essere eseguite su tutte le versioni di Windows Server in uso nel cluster.
L'etichetta del nodo gke-os-distribution
non è sufficiente per impedire i carichi di lavoro
dalla potenziale pianificazione su nodi incompatibili.
Utilizzo di carichi di lavoro Linux e Windows Server in un cluster
Aggiungi il seguente selettore dei nodi ai tuoi carichi di lavoro Linux per assicurarti che vengano sempre pianificati sui nodi Linux:
nodeSelector:
kubernetes.io/os: linux
Ciò fornisce una protezione aggiuntiva per evitare la pianificazione dei carichi di lavoro Linux su nodi Windows Server nel caso in cui l'contaminazione NoSchedule
venga rimossa accidentalmente dai nodi Windows Server.