Questa pagina spiega come eseguire il deployment di un'applicazione stateful utilizzando Google Kubernetes Engine (GKE).
Panoramica
Le applicazioni stateful salvano i dati nello spazio di archiviazione su disco permanente per l'utilizzo da parte del server, dei client e di altre applicazioni. Un esempio di applicazione stateful è un database o un archivio chiave-valore in cui i dati vengono salvati e recuperati da altre applicazioni.
Lo spazio di archiviazione permanente può essere sottoposto a provisioning dinamico, in modo che i volumi sottostanti vengano creati on demand. In Kubernetes, configuri il provisioning dinamico creando un oggettoStorageClass. In GKE, un oggetto StorageClass predefinito ti consente di eseguire il provisioning dinamico di Compute Engine dischi permanenti.
Kubernetes utilizza il StatefulSet controller per eseguire il deployment di applicazioni stateful come oggetti StatefulSet. I pod negli StatefulSet non sono intercambiabili: ogni pod ha un identificatore univoco che viene mantenuto indipendentemente dalla posizione in cui è pianificato.
Le applicazioni stateful sono diverse dalle applicazioni stateless, in cui i dati dei client non vengono salvati sul server tra le sessioni.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti attività:
- Abilita l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializza gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima
versione eseguendo il
gcloud components updatecomando. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
- Assicurati che l'applicazione containerizzata sia archiviata in un registro di immagini, come Artifact Registry.
Puoi seguire la guida rapida, per abilitare l'API GKE, creare un cluster e scoprire di più su GKE.
Richiesta di spazio di archiviazione permanente in uno StatefulSet
Le applicazioni possono richiedere spazio di archiviazione permanente con un PersistentVolumeClaim.
In genere, devi creare oggetti PersistentVolumeClaim oltre a creare il pod. Tuttavia, gli oggetti StatefulSet includono un array volumeClaimTemplates, che genera automaticamente gli oggetti PersistentVolumeClaim. Ogni replica di StatefulSet ottiene il proprio oggetto PersistentVolumeClaim.
Puoi anche utilizzare un disco preesistente in uno StatefulSet.
Creazione di uno StatefulSet
Per creare una risorsa StatefulSet, utilizza il kubectl apply
comando.
Il comando kubectl apply utilizza i file manifest per creare, aggiornare ed eliminare le risorse nel cluster. Si tratta di un metodo
dichiarativo
di configurazione degli oggetti. Questo metodo mantiene le scritture eseguite sugli oggetti live senza unire le modifiche nei file di configurazione degli oggetti.
Linux
Il seguente file manifest è un semplice esempio di StatefulSet gestito da un servizio creato separatamente:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: STATEFULSET_NAME
spec:
selector:
matchLabels:
# Selects Pods with this label.
app: APP_NAME
# Headless Service for network identity.
serviceName: "SERVICE_NAME"
replicas: 3
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: APP_NAME
spec:
containers:
- name: CONTAINER_NAME
image: IMAGE
ports:
- containerPort: 80
name: PORT_NAME
volumeMounts:
- name: PVC_NAME
mountPath: MOUNT_PATH
volumeClaimTemplates:
- metadata:
name: PVC_NAME
annotations:
KEY: VALUE
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
Sostituisci quanto segue:
STATEFULSET_NAME: il nome dello StatefulSet, ad esempioweb.SERVICE_NAME: il nome del servizio, ad esempionginx.APP_NAME: il nome dell'applicazione eseguita nei pod, ad esempionginx.CONTAINER_NAME: il nome dei container nei pod, ad esempionginx.IMAGE: l'immagine container, ad esempioregistry.k8s.io/nginx-slim:0.8.PORT_NAME: il nome della porta aperta dallo StatefulSet, ad esempioweb.PVC_NAME: il nome dell'oggetto PersistentVolumeClaim, ad esempiowww.MOUNT_PATH: il percorso nel container in cui è montato lo spazio di archiviazione, ad esempio/usr/share/nginx/html.KEYeVALUE: una coppia chiave-valore di annotazione da applicare ai metadati PersistentVolumeClaim. Puoi utilizzare le annotazioni per collegare ai tuoi oggetti metadati non identificativi arbitrari che possono essere recuperati da client come strumenti e librerie. Per saperne di più, consulta Annotazioni.
In questo file, il campo kind specifica che deve essere creato un oggetto StatefulSet con le specifiche definite nel file. Questo StatefulSet di esempio produce tre pod replicati e apre la porta 80 per esporre lo StatefulSet a internet.
Windows
Quando utilizzi cluster con node pool Windows Server,
devi creare un oggetto StorageClass perché l'oggetto StorageClass predefinito utilizza ext4 come
tipo di file system, che funziona solo per i container Linux. Se utilizzi un disco permanente di Compute Engine, devi utilizzare NTFS come tipo di archiviazione file, come mostrato nell'esempio seguente:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
# Defines a name for this StorageClass.
name: STORAGECLASS_NAME
parameters:
# Specifies the type of Google Compute Engine persistent disk.
type: pd-standard
# Uses NTFS file system, which is crucial for Windows nodes
fstype: NTFS
# The provisioner for Google Compute Engine persistent disks.
provisioner: kubernetes.io/gce-pd
# Specifies that the PersistentVolume will be deleted if the PersistentVolumeClaim is deleted.
reclaimPolicy: Delete
# Delays volume binding until a Pod using the PVC is scheduled.
volumeBindingMode: WaitForFirstConsumer
Il seguente manifest di StatefulSet utilizza l'oggetto StorageClass definito sopra. Crea quattro coppie PersistentVolume e PersistentVolumeClaim per rappresentare quattro dischi permanenti di Compute Engine. Ogni pod nello StatefulSet utilizza un disco permanente.
Per assicurarti che i pod siano pianificati correttamente sui nodi Windows Server, devi aggiungere un selettore di nodi alla specifica del pod.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: STATEFULSET_NAME
spec:
replicas: 4
selector:
matchLabels:
# Selects Pods with this label.
app: APP_NAME
template:
metadata:
labels:
# Labels applied to the Pods created by the StatefulSet.
app: APP_NAME
name: CONTAINER_NAME
spec:
nodeSelector:
# Ensures Pods are scheduled on Windows nodes.
kubernetes.io/os: windows
containers:
- name: CONTAINER_NAME
image: IMAGE
ports:
- containerPort: 80
name: PORT_NAME
volumeMounts:
- name: PVC_NAME
mountPath: MOUNT_PATH
volumeClaimTemplates:
- metadata:
name: PVC_NAME
spec:
# Specifies the StorageClass to use, which is crucial for Windows nodes.
storageClassName: STORAGECLASS_NAME
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
Sostituisci quanto segue:
STATEFULSET_NAME: il nome dello StatefulSet, ad esempioweb-windows.APP_NAME: il nome dell'applicazione eseguita nei pod, ad esempioiis.CONTAINER_NAME: il nome dei container nei pod, ad esempioiis.IMAGE: l'immagine container, ad esempiomcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019.PORT_NAME: il nome della porta aperta dallo StatefulSet, ad esempiohttp.PVC_NAME: il nome dell'oggetto PersistentVolumeClaim, ad esempioiis-state.MOUNT_PATH: il percorso nel container in cui è montato lo spazio di archiviazione, ad esempioC:\mnt\state.STORAGECLASS_NAME: il nome dell'oggetto StorageClass, ad esempiomy-storage-class.
Per creare una risorsa StatefulSet, esegui il comando seguente sostituendo STATEFULSET_FILE con il nome del file manifest:
kubectl apply -f STATEFULSET_FILE
Puoi anche utilizzare kubectl apply -f DIRECTORY/ per creare
tutti gli oggetti (tranne quelli esistenti) definiti nei file di configurazione archiviati in una
directory.
Ispezione di uno StatefulSet
kubectl
Per ispezionare lo StatefulSet, esegui il comando seguente:
kubectl get statefulset STATEFULSET_NAME -o yaml
Questo comando mostra la configurazione live della risorsa StatefulSet in formato YAML.
Per elencare i pod creati dallo StatefulSet, esegui il comando seguente:
kubectl get pods -l app=APP_NAME
In questo comando, il flag -l indica a kubectl di recuperare tutti i pod etichettati per APP_NAME.
L'output è simile al seguente:
NAME READY STATUS RESTARTS AGE
pod-name 1/1 Running 0 1m
pod-name 1/1 Running 0 1m
Per ottenere informazioni dettagliate sullo StatefulSet, esegui il comando seguente:
kubectl describe statefulset STATEFULSET_NAME
Per ottenere informazioni su un pod specifico, esegui il comando seguente:
kubectl describe pod POD_NAME
Per elencare gli oggetti PersistentVolumeClaim creati, esegui il comando seguente:
kubectl get pvc
L'output è simile al seguente:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
STATEFULSET_NAME-PVC_NAME-0 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800002 1G RWO standard 9s
STATEFULSET_NAME-PVC_NAME-1 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800003 1G RWO standard 9s
STATEFULSET_NAME-PVC_NAME-2 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800004 1G RWO standard 9s
Per ottenere informazioni su un oggetto PersistentVolumeClaim specifico, esegui il comando seguente:
kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0
Per ottenere informazioni su un oggetto PersistentVolume specifico, esegui il comando seguente:
kubectl describe pv PV_NAME
Console
Per ispezionare uno StatefulSet:
Vai alla pagina Carichi di lavoro nella Google Cloud console.
Nell'elenco dei carichi di lavoro, fai clic sul nome dello StatefulSet che vuoi ispezionare.
Nella pagina Dettagli StatefulSet, esegui una delle seguenti operazioni:
- Fai clic sulla scheda Cronologia revisioni per visualizzare la cronologia delle revisioni dello StatefulSet.
- Fai clic sulla scheda Eventi per visualizzare tutti gli eventi correlati allo StatefulSet.
- Fai clic sulla scheda Log per visualizzare i log dei container per lo StatefulSet.
- Fai clic sulla scheda YAML per visualizzare, copiare o scaricare la configurazione YAML per lo StatefulSet.
Aggiornamento di uno StatefulSet
Esistono diversi modi per aggiornare gli StatefulSet. Il metodo dichiarativo comune è kubectl apply. Per aggiornare lo StatefulSet direttamente dalla shell o in un editor preferito, puoi utilizzare kubectl edit. Puoi anche utilizzare l'editor YAML
dal menu Carichi di lavoro GKE nella Google Cloud console.
Puoi eseguire il rollback degli aggiornamenti alla specifica dei pod per una risorsa StatefulSet, ad esempio l'immagine, l'utilizzo/le richieste di risorse o la configurazione.
kubectl apply
Puoi aggiornare lo StatefulSet applicando un file manifest nuovo o aggiornato. Questa operazione è utile per apportare varie modifiche allo StatefulSet, ad esempio durante il ridimensionamento o per specificare una nuova versione dell'applicazione.
Per aggiornare uno StatefulSet, esegui il comando seguente:
kubectl apply -f STATEFULSET_FILE
Sostituisci STATEFULSET_FILE con il file manifest aggiornato.
Il comando kubectl apply applica un file manifest a una risorsa. Se la risorsa specificata non esiste, viene creata dal comando.
Per ulteriori informazioni su kubectl apply, consulta la
kubectl documentazione di riferimento.
Console
Per modificare la configurazione live di uno StatefulSet:
Vai alla pagina Carichi di lavoro nella Google Cloud console.
Nell'elenco dei carichi di lavoro, fai clic sul nome dello StatefulSet che vuoi modificare.
Fai clic su edit Modifica.
Modifica la configurazione YAML come preferisci.
Fai clic su Salva.
Ispezione del rollout dell'aggiornamento
Per ispezionare il rollout dello StatefulSet, esegui il comando seguente:
kubectl rollout status statefulset STATEFULSET_NAME
Per visualizzare la cronologia del rollout dello StatefulSet, esegui il comando seguente:
kubectl rollout history statefulset STATEFULSET_NAME
Per annullare un rollout, esegui il comando seguente:
kubectl rollout undo statefulset STATEFULSET_NAME
Strategie di aggiornamento
Il campo updateStrategy di StatefulSet consente di configurare e disattivare gli aggiornamenti in sequenza automatici per container, etichette, richieste di risorse, limiti e annotazioni per i pod in uno StatefulSet.
Puoi scoprire di più sulle strategie di aggiornamento per gli StatefulSet nella documentazione di Kubernetes.
Ridimensionamento di uno StatefulSet
kubectl
Il comando kubectl scale può essere utilizzato in qualsiasi momento per ridimensionare lo StatefulSet.
Per ridimensionare manualmente uno StatefulSet, esegui il comando seguente:
kubectl scale statefulset STATEFULSET_NAME --replicas NUMBER_OF_REPLICAS
Sostituisci NUMBER_OF_REPLICAS con il numero di pod replicati che preferisci.
Console
Per ridimensionare uno StatefulSet:
Vai alla pagina Carichi di lavoro nella Google Cloud console.
Nell'elenco dei carichi di lavoro, fai clic sul nome dello StatefulSet che vuoi modificare.
Fai clic su list Azioni > Scala > Modifica repliche.
Inserisci il nuovo numero di repliche per lo StatefulSet.
Fai clic su Scala.
Eliminazione di uno StatefulSet
kubectl
Per eliminare uno StatefulSet, esegui il comando seguente:
kubectl delete statefulset STATEFULSET_NAME
Console
Per eliminare uno StatefulSet:
Vai alla pagina Carichi di lavoro nella Google Cloud console.
Nell'elenco dei carichi di lavoro, seleziona uno o più StatefulSet da eliminare.
Fai clic su delete Elimina.
Quando ti viene richiesto di confermare, fai clic su Elimina.
Passaggi successivi
- Scopri come eseguire il deployment di un cluster MySQL su GKE per l'alta affidabilità
- Scopri di più sul deployment di applicazioni stateless.
- Segui un tutorial sull'upgrade di un cluster che esegue un carico di lavoro stateful.