In questa pagina viene descritto l'utilizzo degli oggetti StatefulSet in Google Kubernetes Engine (GKE). Puoi anche scoprire come eseguire il deployment di un'applicazione stateful.
Perché utilizzare gli StatefulSet
Puoi utilizzare gli StatefulSet per eseguire il deployment di applicazioni stateful e di cluster in cui vengono salvati i dati nell'archiviazione permanente, come i dischi permanenti di Compute Engine. Gli StatefulSet sono adatti per il deployment di Kafka, MySQL, Redis, ZooKeeper e altre applicazioni che richiedono identità univoche e permanenti e nomi host stabili.
Gli StatefulSet rappresentano un insieme di pod con identità univoche e permanenti e nomi host stabili che GKE mantiene, indipendentemente da dove sono pianificati. Gli StatefulSet utilizzano un modello di pod, che contiene una specifica per i relativi pod. Le informazioni sullo stato e altri dati resilienti per un determinato pod StatefulSet vengono conservati in volumi permanenti associati a ogni pod nello StatefulSet. I pod StatefulSet possono essere riavviati in qualsiasi momento.
Per le applicazioni stateless, utilizza i deployment.
Indicizzazione dello StatefulSet
Gli StatefulSet utilizzano un indice ordinale per l'identità e l'ordine dei pod.
Per impostazione predefinita, il deployment dei pod StatefulSet viene eseguito in ordine sequenziale e vengono terminati in ordine ordinale. Ad esempio, uno StatefulSet denominato web
ha i relativi pod denominati web-0
, web-1
e web-2
. Quando le specifiche del pod web
vengono modificate, i relativi pod vengono arrestati e ricreati in modo ordinato, in questo esempio web-2
viene terminato per primo, poi web-1
e così via.
In alternativa, puoi specificare il campo podManagementPolicy: Parallel
in modo che un oggetto StatefulSet venga lanciato o termini tutti i suoi pod in parallelo, invece di attendere che i pod diventino in esecuzione e pronti o vengano terminati prima dell'avvio o della terminazione di un altro pod.
Pianifica il networking per gli StatefulSet
Gli StatefulSet offrono l'archiviazione permanente sotto forma di volume permanente e di un'identità di rete univoca (nome host). La seguente tabella include le avvertenze di cui gli operatori di applicazioni devono essere a conoscenza quando configurano uno StatefulSet:
Avvertenze sul networking | Descrizione | Best practice |
---|---|---|
Servizi GKE anziché indirizzi IP fissi |
Sebbene le repliche dei pod abbiano un indice ordinale univoco, supporti volumi per replica e identità di rete (nome host), gli indirizzi IP assegnati a una replica possono cambiare se un pod viene riprogrammato o rimosso da GKE. |
Per mitigare i problemi di networking, l'architettura deve utilizzare le risorse del servizio Kubernetes. Per saperne di più, vedi Tipi di servizi Kubernetes. |
Servizi headless |
Quando è inizializzato, uno StatefulSet viene associato a un servizio headless corrispondente. |
Assicurati che |
Rilevamento peer |
Le applicazioni stateful richiedono un numero minimo (quorum) di repliche per funzionare con la disponibilità completa. |
Poiché i pod possono arrestarsi in modo anomalo, essere ripianificati o rimossi, ogni replica in uno StatefulSet dovrebbe essere in grado di uscire e rientrare nel quorum. Le applicazioni che richiedono il peering dovrebbero avere la capacità di rilevare altri peer tramite i servizi headless in Kubernetes. |
Controllo di integrità basato su probe di idoneità e probe di attività |
La tua applicazione deve avere configurato correttamente i probe di idoneità, di attività e di avvio, ove applicabile. La selezione dei timeout per ciascun probe dipende dai requisiti della tua applicazione. |
Per i probe di idoneità, segui queste best practice per configurare la tua applicazione in modo che contrassegni l'idoneità quando è pronta a gestire il traffico:
|
Per scoprire di più sui probe, consulta Configura probe di attività, idoneità e avvio.
Creazione dell'esempio degli StatefulSet
Puoi creare uno StatefulSet utilizzando kubectl apply
.
Una volta creato, lo StatefulSet garantisce che il numero desiderato di pod sia in esecuzione e disponibile in ogni momento. Lo StatefulSet sostituisce automaticamente i pod che hanno esito negativo o vengono rimossi dai relativi nodi e associa automaticamente i nuovi pod alle risorse di archiviazione, alle richieste e ai limiti di risorse e ad altre configurazioni definite nella specifica dei pod dello StatefulSet.
Nell'esempio seguente è riportato un file manifest Service e StatefulSet:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # Label selector that determines which Pods belong to the StatefulSet
# Must match spec: template: metadata: labels
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx # Pod template's label selector
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
In questo esempio:
- Viene creato un oggetto Service denominato
nginx
, indicato dal campometadata: name
. Il servizio ha come target un'app chiamatanginx
, indicata dalabels: app: nginx
eselector: app: nginx
. Il servizio espone la porta 80 e la chiamaweb
. Questo servizio controlla il dominio di rete e il routing del traffico Internet all'applicazione containerizzata di cui è stato eseguito il deployment da StatefulSet. - Viene creato uno StatefulSet denominato
web
con tre pod replicati (replicas: 3
). - Il modello di pod (
spec: template
) indica che i suoi pod sono etichettatiapp: nginx
. - Le specifiche del pod (
template: spec
) indicano che i pod dello StatefulSet eseguono un container,nginx
, che esegue l'immaginenginx-slim
alla versione0.8
. L'immagine container è ospitata da Container Registry. - Le specifiche del pod utilizzano la porta
web
aperta dal servizio. template: spec: volumeMounts
specifica unmountPath
, denominatowww
.mountPath
è il percorso all'interno del container in cui deve essere montato un volume di archiviazione.- Lo StatefulSet esegue il provisioning di un oggetto PersistentVolumeClaim,
www
, con 1 GB di spazio di archiviazione di cui è stato eseguito il provisioning.
Per riassumere, la specifica pod contiene le seguenti istruzioni:
- Assegna l'etichetta
app: nginx
a ogni pod. - In ogni pod, esegui un container denominato
nginx
. - Esegui l'immagine
nginx-slim
alla versione0.8
. - Fai in modo che i pod utilizzino la porta
80
. - Salva i dati nel percorso di montaggio.
Per ulteriori informazioni sulle configurazioni StatefulSet, consulta la documentazione di riferimento sull'API StatefulSet.
Aggiornamento degli StatefulSet
Puoi aggiornare uno StatefulSet modificando la specifica dei pod, compresi i container e le immagini container. Puoi anche aggiornare le richieste, i limiti, le etichette e le annotazioni dell'oggetto. Per aggiornare uno StatefulSet, puoi utilizzare kubectl
, l'API Kubernetes o il menu dei carichi di lavoro GKE nella console Google Cloud.
Per decidere come gestire gli aggiornamenti, gli StatefulSet utilizzano una strategia di aggiornamento definita in
spec: updateStrategy
. Esistono due strategie, OnDelete
e RollingUpdate
:
OnDelete
non elimina e ricrea automaticamente i pod quando viene modificata la configurazione dell'oggetto. Devi eliminare manualmente i vecchi pod per far sì che il controller crei pod aggiornati.RollingUpdate
elimina e ricrea automaticamente i pod quando viene modificata la configurazione dell'oggetto. I nuovi pod devono essere in stato In esecuzione e Pronto prima che i loro predecessori vengano eliminati. Con questa strategia, la modifica della specifica del pod attiva automaticamente un'implementazione. Questa è la strategia di aggiornamento predefinita per gli StatefulSet.
Gli StatefulSet aggiornano i pod in ordine ordinale inverso. Puoi monitorare le implementazioni degli aggiornamenti eseguendo questo comando:
kubectl rollout status statefulset STATEFULSET_NAME
Esegui il partizionamento degli aggiornamenti in sequenza
Puoi partizionare gli aggiornamenti in sequenza. Il partizionamento è utile se vuoi aggiungere un aggiornamento graduale, implementare una versione canary o eseguire un'implementazione graduale.
Quando esegui il partizionamento di un aggiornamento, tutti i pod con un valore ordinale maggiore o uguale al valore della partizione vengono aggiornati quando aggiorni la specifica dei pod dello StatefulSet. I pod con un valore inferiore al valore di partizione non vengono aggiornati e, anche se vengono eliminati, vengono ricreati utilizzando la versione precedente della specifica. Se il valore della partizione è maggiore del numero di repliche, gli aggiornamenti non vengono propagati ai pod.
Passaggi successivi
- Scopri come eseguire il deployment di un'applicazione stateful.
- Scopri di più sul deployment di carichi di lavoro in GKE.
- Scopri di più sugli StatefulSet nella documentazione di Kubernetes.
- Scopri le nozioni di base su StatefulSet.
- Segui un tutorial sull'upgrade di un cluster che esegue un carico di lavoro stateful.