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 con stato è un database o un archivio chiave-valore in cui i dati vengono salvati e recuperati da altre applicazioni.
L'archiviazione permanente può essere eseguita dinamicamente, in modo che i volumi sottostanti vengano creati su richiesta. In Kubernetes, configura il provisioning dinamico creando un StorageClass. In GKE, un oggetto StorageClass predefinito ti consente di eseguire il provisioning dinamico dei dischi permanenti di Compute Engine.
Kubernetes utilizza il controller StatefulSet 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 da dove è pianificato.
Le applicazioni stateful sono diverse dalle applicazioni stateless, in cui i dati del client non vengono salvati sul server tra le sessioni.
Scopri di più sull'archiviazione permanente nei cluster multizonali e regionali.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:
- Attiva l'API Google Kubernetes Engine. Attiva l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
installa e poi
inizializza gcloud CLI. Se hai già installato gcloud CLI, ottieni la versione più recente eseguendo
gcloud components update
.
- Assicurati che l'applicazione containerizzata sia archiviata in un registry delle immagini, ad esempio Artifact Registry.
Puoi seguire la guida introduttiva per attivare l'API GKE, creare un cluster e scoprire di più su GKE.
Richiesta di archiviazione permanente in uno StatefulSet
Le applicazioni possono richiedere spazio di archiviazione permanente con un PersistentVolumeClaim.
In genere, oltre a creare il pod, devi creare oggetti PersistentVolumeClaim. Tuttavia, gli oggetti StatefulSet includono un array volumeClaimTemplates
,
che genera automaticamente gli oggetti PersistentVolumeClaim. Ogni replica del StatefulSet riceve il proprio oggetto PersistentVolumeClaim.
Puoi anche utilizzare un disco esistente in un StatefulSet.
Creazione di un StatefulSet
Per creare una risorsa StatefulSet, utilizza il comando kubectl apply
.
Il comando kubectl apply
utilizza i file manifest per creare, aggiornare ed eliminare le risorse nel cluster. Si tratta di un metodo
declarativo
di configurazione degli oggetti. Questo metodo conserva le scritture effettuate sugli oggetti attivi senza
ricombinarle nei file di configurazione degli oggetti.
Linux
Il seguente file manifest è un semplice esempio di StatefulSet regolato da un servizio creato separatamente:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: STATEFULSET_NAME
spec:
selector:
matchLabels:
app: APP_NAME
serviceName: "SERVICE_NAME"
replicas: 3
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: APP_NAME
spec:
containers:
- name: CONTAINER_NAME
image: ...
ports:
- containerPort: 80
name: PORT_NAME
volumeMounts:
- name: PVC_NAME
mountPath: ...
volumeClaimTemplates:
- metadata:
name: PVC_NAME
annotations:
...
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
Sostituisci quanto segue:
STATEFULSET_NAME
: il nome dello StatefulSet.SERVICE_NAME
: il nome del servizio.APP_NAME
: il nome dell'applicazione in esecuzione nei pod.CONTAINER_NAME
: il nome dei container nei pod.PORT_NAME
: il nome della porta aperta dal StatefulSet.PVC_NAME
: il nome del PersistentVolumeClaim.
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 una classe di archiviazione perché quella predefinita utilizza ext4
come
tipo di file system, che funziona solo per i container Linux. Se utilizzi un
disco permanente Compute Engine, devi utilizzare NTFS
come tipo di archiviazione dei file
come mostrato nell'esempio seguente:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: STORAGECLASS_NAME
parameters:
type: pd-standard
fstype: NTFS
provisioner: kubernetes.io/gce-pd
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
Il seguente file manifest di StatefulSet utilizza la classe StorageClass definita sopra. Crea quattro coppie di PersistentVolume e PersistentVolumeClaim per rappresentare quattro dischi permanenti Compute Engine. Ogni pod nello StatefulSet consuma 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:
app: APP_NAME
template:
metadata:
labels:
app: APP_NAME
name: CONTAINER_NAME
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: CONTAINER_NAME
image: ...
ports:
- containerPort: 80
name: PORT_NAME
volumeMounts:
- name: PVC_NAME
mountPath: C:\mnt\state
volumeClaimTemplates:
- metadata:
name: PVC_NAME
spec:
storageClassName: STORAGECLASS_NAME
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
Sostituisci quanto segue:
APP_NAME
: il nome dell'applicazione in esecuzione nei pod.STATEFULSET_NAME
: il nome dello StatefulSet.CONTAINER_NAME
: il nome dei container nei pod.PORT_NAME
: il nome della porta aperta dal StatefulSet.PVC_NAME
: il nome del PersistentVolumeClaim.STORAGECLASS_NAME
: il nome della classe StorageClass.
Per creare una risorsa StatefulSet, esegui il seguente comando 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 un StatefulSet
kubectl
Per ispezionare lo StatefulSet, esegui il seguente comando:
kubectl get statefulset STATEFULSET_NAME -o yaml
Questo comando mostra la configurazione attiva della risorsa StatefulSet in formato YAML.
Per elencare i pod creati dallo StatefulSet, esegui il seguente comando:
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 seguente comando:
kubectl describe statefulset STATEFULSET_NAME
Per ottenere informazioni su un pod specifico, esegui il seguente comando:
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 informazioni su un determinato PersistentVolumeClaim, esegui il seguente comando:
kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0
Per ottenere informazioni su un PersistentVolume specifico, esegui il seguente comando:
kubectl describe pv PV_NAME
Console
Per ispezionare un StatefulSet:
Vai alla pagina Carichi di lavoro nella console Google Cloud.
Nell'elenco dei workload, fai clic sul nome del StatefulSet da ispezionare.
Nella pagina Dettagli set stateful, esegui una delle seguenti operazioni:
- Fai clic sulla scheda Cronologia delle revisioni per visualizzare la cronologia delle revisioni del StatefulSet.
- Fai clic sulla scheda Eventi per visualizzare tutti gli eventi relativi al StatefulSet.
- Fai clic sulla scheda Log per visualizzare i log del contenitore per lo StatefulSet.
- Fai clic sulla scheda YAML per visualizzare, copiare o scaricare il file YAML di configurazione per il StatefulSet.
Aggiornamento di un StatefulSet
Esistono diversi modi per aggiornare i StatefulSet. Il metodo comune e dichiarativo è kubectl apply
. Per aggiornare il 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 console Google Cloud.
Puoi implementare 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 il StatefulSet applicando un file manifest nuovo o aggiornato. Questo è utile per apportare varie modifiche al StatefulSet, ad esempio per eseguire lo scaling 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
documentazione di riferimento di kubectl
.
Console
Per modificare la configurazione in tempo reale di uno StatefulSet, segui questi passaggi:
Vai alla pagina Carichi di lavoro nella console Google Cloud.
Nell'elenco dei workload, fai clic sul nome del StatefulSet da modificare.
Fai clic su edit Modifica.
Modifica il file YAML di configurazione come preferisci.
Fai clic su Salva.
Ispezione dell'implementazione dell'aggiornamento
kubectl
Per controllare l'implementazione dello StatefulSet, esegui il seguente comando:
kubectl rollout status statefulset STATEFULSET_NAME
Per visualizzare la cronologia di implementazione dello StatefulSet, esegui il seguente comando:
kubectl rollout history statefulset STATEFULSET_NAME
Per annullare un'implementazione, esegui il seguente comando:
kubectl rollout undo statefulset STATEFULSET_NAME
Console
Per visualizzare la cronologia delle revisioni di uno StatefulSet, segui questi passaggi:
Vai alla pagina Carichi di lavoro nella console Google Cloud.
Nell'elenco dei workload, fai clic sul nome del StatefulSet da ispezionare.
Fai clic sulla scheda Cronologia delle revisioni.
Seleziona la revisione che ti interessa.
Aggiorna le strategie
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 un StatefulSet.
Puoi scoprire di più sulle strategie di aggiornamento per i StatefulSet nella documentazione di Kubernetes.
Scalabilità di un StatefulSet
kubectl
Il comando kubectl scale
può essere utilizzato in qualsiasi momento per scalare il StatefulSet.
Per eseguire la scalabilità manuale di uno StatefulSet, esegui il seguente comando:
kubectl scale statefulset STATEFULSET_NAME --replicas NUMBER_OF_REPLICAS
Sostituisci NUMBER_OF_REPLICAS
con il numero di pod replicati che preferisci.
Console
Per eseguire il ridimensionamento di uno StatefulSet:
Vai alla pagina Carichi di lavoro nella console Google Cloud.
Nell'elenco dei workload, fai clic sul nome del StatefulSet da modificare.
Fai clic su list Azioni > Scala > Modifica repliche.
Inserisci il nuovo numero di Repliche per il StatefulSet.
Fai clic su Scala.
Eliminazione di un StatefulSet
kubectl
Per eliminare uno StatefulSet, esegui il seguente comando:
kubectl delete statefulset STATEFULSET_NAME
Console
Per eliminare uno StatefulSet:
Vai alla pagina Carichi di lavoro nella console Google Cloud.
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 disponibilità
- Scopri di più sul deployment di applicazioni stateless.
- Segui un tutorial sull'upgrade di un cluster che esegue un carico di lavoro stateful.