Implantações de Kubernetes x StatefulSets

110

Tenho pesquisado muito o Kubernetes e estou gostando muito do que vejo! Uma coisa que não consigo ter uma ideia clara é quais são as distinções exatas entre os recursos Deployment e StatefulSet e em quais cenários você usaria cada um (ou é geralmente preferido um em relação ao outro).

Qualquer experiência que as pessoas possam compartilhar seria incrível!

SS781
fonte

Respostas:

114

Implementações e ReplicationControllers destinam-se ao uso sem estado e são bastante leves. StatefulSets são usados ​​quando o estado deve ser persistido. Portanto, o último usa volumeClaimTemplates/ reivindica volumes persistentes para garantir que possam manter o estado durante as reinicializações do componente.

Portanto, se o seu aplicativo tiver estado ou se você quiser implantar armazenamento com estado no Kubernetes, use um StatefulSet.

Se seu aplicativo não tiver estado ou se o estado puder ser criado a partir de sistemas back-end durante o início, use Implementações.

Mais detalhes sobre a execução de aplicativos com estado podem ser encontrados na entrada do blog do kubernetes de 2016 sobre aplicativos com estado

pagão
fonte
16
Também posso conectar os pods de uma implantação com declarações de volume persistentes e estar seguro.
Torsten Bronger
9
@TorstenBronger Concordo - em que ponto estamos de volta à questão original de qual é o objetivo dos StatefulSets?
HDave
6
@HDave Com volumes persistentes dinâmicos e provedores de armazenamento em rápido desenvolvimento (como Portworx, OpenEBS), o problema de persistência de dados pode ser resolvido, mas a nomenclatura e a ordem de inicialização / atualização ainda são diferentes com StatefulSets, permitindo aplicativos que precisam de master / slave ou outra configuração para formar adequadamente um cluster. Embora eu concorde que talvez tudo isso possa ser agrupado em uma única deploymentconfiguração com uma especificação simples para definir 1 por nó (daemonset), réplicas ou ordenação com estado.
Mani Gandham,
4
É importante perceber que a "ordem de inicialização / atualização" diz respeito às réplicas de pod (ou seja, 1, 2, 3 ...) - não a pods diferentes (ou seja, web, srv, db, etc.). Dito de outra forma, não é uma substituição para as dependências docker-compose.
HDave
72
  • Implantação - você especifica um PersistentVolumeClaim que é compartilhado por todas as réplicas de pod. Em outras palavras, volume compartilhado.

    O armazenamento de apoio obviamente deve ter ReadWriteMany ou ReadOnlyMany accessMode se você tiver mais de um pod de réplica.

  • StatefulSet - você especifica um volumeClaimTemplates para que cada pod de réplica obtenha um PersistentVolumeClaim exclusivo associado a ele. Em outras palavras, nenhum volume compartilhado.

    Aqui, o armazenamento de apoio pode ter accessMode ReadWriteOnce .

    StatefulSet é útil para executar coisas em cluster, por exemplo, cluster Hadoop, cluster MySQL, onde cada nó tem seu próprio armazenamento.

Emmanuel Osimosu
fonte
23

TL; DR

A implantação é um recurso para implantar um aplicativo sem estado, se estiver usando um PVC, todas as réplicas estarão usando o mesmo volume e nenhuma terá seu próprio estado.

Statefulsets é usado para aplicativos com estado, cada réplica do pod terá seu próprio estado e usará seu próprio volume.

DaemonSet é um controlador que garante que o pod seja executado em todos os nós do cluster. Se um nó for adicionado / removido de um cluster, o DaemonSet adiciona / exclui automaticamente o pod.

Eu escrevi sobre as diferenças detalhadas entre implantações, StatefulSets e Daemonsets e como implantar um aplicativo de amostra usando estes recursos K8s: implantações vs StatefulSets vs DaemonSets .

Ali Kahoot
fonte
4
Para acompanhar seu comentário, parece-me que a diferença entre os dois é que um tem a capacidade de especificar o armazenamento específico do pod (e, assim, persistir o estado específico do pod), enquanto o outro não (e, portanto, só pode persistir o serviço em todo o estado). Nesse sentido, no nível de serviço, ambos podem ser vistos como com monitoração de estado. Mas no nível do pod, apenas Statefulsets têm estado.
scabbage
14

StatefulSet

Use 'StatefulSet' com aplicativos distribuídos com estado, que exigem que cada nó tenha um estado persistente . StatefulSet fornece a capacidade de configurar um número arbitrário de nós, para um aplicativo / componente com estado, por meio de uma configuração (réplicas = N).

Existem dois tipos de aplicativos distribuídos com estado: Master-Master e Master-Slave. Todos os nós em uma configuração Master-Master e nós Slave em uma configuração Master-Slave podem fazer uso de um StatefulSet.
Exemplos:
Master-Slave -> Datanodes (slaves) em um cluster Hadoop
Master-Master -> Nós de banco de dados (master-master) em um cluster Cassandra

Cada pod (réplica / nó) em um StatefulSet tem uma identidade de rede única e estável. Por exemplo, em um Cassandra StatefulSet com nome como 'cassandra' e número de nós de réplica como N, cada pod (nó) do Cassandra tem:

  • Índice ordinal para cada vagem: 0,1, .., N-1
  • ID de rede estável: cassandra-0, cassandra-1, .., cassandra-N-1
  • Um volume persistente separado para cada pod em relação a um modelo de declaração de volume, ou seja, um armazenamento separado para cada pod (nó)
  • Os pods são criados na ordem de 0 a N-1 e terminados na ordem reversa de N-1 a 0

Consulte: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

Desdobramento, desenvolvimento

A 'implantação', por outro lado, é adequada para aplicativos / serviços sem estado em que os nós não requerem nenhuma identidade especial. Um balanceador de carga pode alcançar qualquer nó que ele escolher. Todos os nós são iguais. Uma implantação é útil para criar qualquer número de nós arbitrários, por meio de uma configuração (réplicas = N).

Anurag
fonte
7

A diferença entre StatefulSet e implantação

StatefulSet é equivalente a uma implantação especial. Cada pod no StatefulSet tem um identificador de rede único e estável que pode ser usado para descobrir outros membros no cluster. Se o nome de StatefulSet for Kafka, o primeiro pod será chamado de Kafka-0, o segundo Kafka-1 e assim por diante; a sequência de início e parada da cópia do pod controlada pelo StatefulSet é controlada. Quando o enésimo pod é operado, os primeiros N-1 pods já estão em execução e prontos. Bom estado; o pod no StatefulSet usa um volume de armazenamento persistente estável, implementado por PV ou PVC. Ao excluir o pod, o volume de armazenamento associado ao StatefulSet não é excluído por padrão (para segurança de dados); o StatefulSet está vinculado ao volume do PV. Usado para armazenar dados de estado do pod e também usado em conjunto com serviços sem comando, declarado pertencer a esse serviço sem comando;

Adler.Liu
fonte