Distribuzioni Kubernetes vs StatefulSets


110

Ho studiato molto su Kubernetes e mi piace molto quello che vedo! Una cosa di cui non sono stato in grado di avere un'idea chiara è quali siano le distinzioni esatte tra le risorse Deployment e StatefulSet e in quali scenari useresti ciascuna (o è generalmente preferita rispetto all'altra).

Qualsiasi esperienza che le persone possono condividere sarebbe fantastica !!

Risposte:


114

Distribuzioni e ReplicationController sono pensati per l'utilizzo senza stato e sono piuttosto leggeri. Gli StatefulSet vengono utilizzati quando lo stato deve essere mantenuto. Pertanto, questi ultimi utilizzano volumeClaimTemplates/ attestano i volumi persistenti per garantire che possano mantenere lo stato durante i riavvii dei componenti.

Quindi, se la tua applicazione è con stato o se desideri distribuire l'archiviazione con stato su Kubernetes, utilizza uno StatefulSet.

Se la tua applicazione è senza stato o se lo stato può essere creato dai sistemi di backend durante l'avvio, usa Deployments.

Ulteriori dettagli sull'esecuzione di applicazioni con stato sono disponibili nel post del blog di kubernetes 2016 sulle applicazioni con stato


16
Posso anche connettere i pod di una distribuzione con attestazioni di volume persistenti ed essere al sicuro.
Torsten Bronger

9
@TorstenBronger Sono d'accordo: a quel punto siamo tornati alla domanda iniziale su qual è lo scopo di StatefulSets?
HDave il

6
@HDave Con volumi persistenti dinamici e provider di archiviazione in rapido sviluppo (come Portworx, OpenEBS), il problema della persistenza dei dati può essere risolto, ma la denominazione e l'ordine di avvio / aggiornamento sono ancora diversi con StatefulSets, consentendo app che necessitano di master / slave o altre configurazioni per formare correttamente un cluster. Anche se sono d'accordo sul fatto che forse tutto questo può essere piegato in una singola deploymentconfigurazione con una semplice specifica per impostare 1 per nodo (daemonset), repliche o ordinamento stateful.
Mani Gandham

4
È importante rendersi conto che "l'ordine di avvio / aggiornamento" riguarda le repliche dei pod (ad esempio 1, 2, 3 ...) - non diversi pod (ad esempio web, srv, db, ecc.). In altre parole, non sostituisce le dipendenze docker-compose.
HDave

72
  • Distribuzione: specifichi un PersistentVolumeClaim condiviso da tutte le repliche pod. In altre parole, volume condiviso.

    Lo storage di supporto deve ovviamente avere ReadWriteMany o ReadOnlyMany accessMode se hai più di un pod di replica.

  • StatefulSet: specifichi un volumeClaimTemplates in modo che ogni pod di replica ottenga un PersistentVolumeClaim univoco associato ad esso. In altre parole, nessun volume condiviso.

    Qui, l'archiviazione di backup può avere ReadWriteOnce accessMode.

    StatefulSet è utile per eseguire cose in cluster, ad esempio cluster Hadoop, cluster MySQL, dove ogni nodo ha il proprio spazio di archiviazione.


23

TL; DR

La distribuzione è una risorsa per distribuire un'applicazione senza stato, se si utilizza un PVC, tutte le repliche utilizzeranno lo stesso volume e nessuna di esse avrà il proprio stato.

Statefulsets viene utilizzato per le applicazioni stateful, ogni replica del pod avrà il proprio stato e utilizzerà il proprio volume.

DaemonSet è un controller che garantisce che il pod venga eseguito su tutti i nodi del cluster. Se un nodo viene aggiunto / rimosso da un cluster, DaemonSet aggiunge / elimina automaticamente il pod.

Ho scritto sulle differenze dettagliate tra Deployments, StatefulSets e Daemonsets e su come distribuire un'applicazione di esempio utilizzando questi K8 di risorse : Deployments vs StatefulSets vs DaemonSets .


4
Per dare seguito al tuo commento, mi sembra che la differenza tra i due sia che uno ha la capacità di specificare l'archiviazione specifica del pod (e quindi mantenere lo stato specifico del pod), mentre l'altro no (e quindi può solo persistere il servizio in tutto lo stato). In questo senso, a livello di servizio, entrambi possono essere visti come stateful. Ma a livello di pod, solo Statefulsets è stateful.
fodero

14

StatefulSet

Usa "StatefulSet" con le applicazioni distribuite con stato, che richiedono che ogni nodo abbia uno stato persistente . StatefulSet offre la possibilità di configurare un numero arbitrario di nodi, per un'applicazione / componente stateful, tramite una configurazione (replicas = N).

Esistono due tipi di applicazioni distribuite con stato: Master-Master e Master-Slave. Tutti i nodi in una configurazione Master-Master e i nodi Slave in una configurazione Master-Slave possono fare uso di uno StatefulSet.
Esempi:
Master-Slave -> Datanodes (slave) in un cluster Hadoop
Master-Master -> Nodi database (master-master) in un cluster Cassandra

Ogni pod (replica / nodo) in uno StatefulSet ha un'identità di rete univoca e stabile. Ad esempio in un Cassandra StatefulSet con il nome "cassandra" e il numero di nodi di replica come N, ogni pod Cassandra (nodo) ha:

  • Indice ordinale per ogni pod: 0,1, .., N-1
  • ID rete stabile: cassandra-0, cassandra-1, .., cassandra-N-1
  • Un volume persistente separato per ogni pod rispetto a un modello di richiesta di volume, ovvero una memoria separata per ogni pod (nodo)
  • I pod vengono creati nell'ordine da 0 a N-1 e terminati nell'ordine inverso da N-1 a 0

Fare riferimento a: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

Distribuzione

'Distribuzione' d'altra parte è adatto per apolidi applicazioni / servizi in cui i nodi non richiedono alcuna particolare identità. Un bilanciatore del carico può raggiungere qualsiasi nodo che sceglie. Tutti i nodi sono uguali. Una distribuzione è utile per creare un numero qualsiasi di nodi arbitrari, tramite una configurazione (replicas = N).


7

La differenza tra StatefulSet e deployment

StatefulSet equivale a una distribuzione speciale. Ogni pod in StatefulSet ha un identificatore di rete univoco e stabile che può essere utilizzato per scoprire altri membri nel cluster. Se il nome di StatefulSet è Kafka, il primo pod si chiama Kafka-0, il secondo Kafka-1 e così via; la sequenza di avvio e arresto della copia pod controllata da StatefulSet è controllata. Quando viene azionato l'ennesimo pod, i primi N-1 pod sono già in esecuzione e pronti. Buono stato; il pod in StatefulSet utilizza un volume di archiviazione persistente stabile, implementato da PV o PVC. Quando si elimina il pod, il volume di archiviazione associato allo StatefulSet non viene eliminato per impostazione predefinita (per la sicurezza dei dati); StatefulSet è vincolato al volume PV. Utilizzato per memorizzare i dati sullo stato del pod e anche in combinazione con servizi headless, dichiarati appartenenti a quel servizio headless;

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.