statefulset kubernetes kubernetes-statefulset

kubernetes - ¿Por qué StatefulSets? ¿No puede un Pod sin estado usar volúmenes persistentes?



kubernetes statefulset (1)

Sí, una cápsula normal puede usar un volumen persistente. Sin embargo, a veces tiene múltiples pods que lógicamente forman un "grupo". Ejemplos de esto serían réplicas de bases de datos, hosts ZooKeeper, nodos Kafka, etc. En todos estos casos hay un montón de servidores y trabajan juntos y se comunican entre sí. Lo especial de ellos es que cada individuo en el grupo tiene una identidad. Por ejemplo, para un clúster de base de datos, uno es el maestro y dos son seguidores y cada uno de los seguidores se comunica con el maestro dejándole saber lo que tiene y no ha sincronizado. Entonces los seguidores saben que "db-x-0" es el maestro y el maestro sabe que "db-x-2" es un seguidor y tiene todos los datos hasta cierto punto, pero aún necesita datos más allá de eso.

En tales situaciones, necesita algunas cosas que no puede obtener fácilmente de un pod regular:

  1. Un nombre predecible: desea comenzar sus pods diciéndoles dónde encontrarse para que puedan formar un grupo, elegir un líder, etc., pero necesita saber sus nombres de antemano para hacerlo. Los nombres de pod normales son aleatorios, por lo que no puede conocerlos por adelantado.
  2. Una dirección estable / nombre DNS: desea que los nombres disponibles en el paso (1) permanezcan igual. Si un pod normal se reinicia (se vuelve a implementar, el host donde se estaba ejecutando muere, etc.) en otro host obtendrá un nuevo nombre y una nueva dirección IP.
  3. Un enlace persistente entre un individuo en el grupo y su volumen persistente: si el host donde se ejecutaba uno de los maestros de su base de datos muere, se moverá a un nuevo host, pero debería conectarse al mismo volumen persistente ya que hay un solo volumen que contiene los datos correctos para ese "individuo". Entonces, por ejemplo, si vuelve a implementar su grupo de 3 hosts de bases de datos, desea que el mismo individuo (por nombre DNS y dirección IP) obtenga el mismo volumen persistente, de modo que el maestro sigue siendo el maestro y aún tiene los mismos datos, replica1 obtiene su datos, etc.

StatefulSets resuelven estos problemas porque proporcionan (citando https://kubernetes.io/docs/concepts/abstraction/controllers/statefulsets/ ):

  1. Identificadores de red únicos y estables.
  2. Almacenamiento estable y persistente.
  3. Ordenado, despliegue elegante y escala.
  4. Ordenado, elegante borrado y terminación.

Realmente no hablé sobre (3) y (4), pero eso también puede ayudar con los clústeres, ya que puedes decirle al primero que se implemente para convertirse en el maestro y al siguiente encontrar el primero y tratarlo como maestro, etc.

Como algunos han notado, de hecho puede obtener algunos de los mismos beneficios al usar pods y servicios regulares, pero es mucho más trabajo. Por ejemplo, si desea 3 instancias de base de datos, puede crear manualmente 3 implementaciones y 3 servicios. Tenga en cuenta que debe crear manualmente 3 implementaciones ya que no puede tener un punto de servicio a un solo pod en una implementación. Luego, para escalar, crearía manualmente otra implementación y otro servicio. Esto funciona y era una práctica algo común antes de que apareciera PetSet / PersistentSet. Tenga en cuenta que le faltan algunos de los beneficios enumerados anteriormente (mapeo de volumen persistente y orden de inicio fijo, por ejemplo).

Estoy tratando de entender conjuntos con estado . ¿Cómo difiere su uso del uso de Pods "sin estado" con volúmenes persistentes? Es decir, suponiendo que un Pod "normal" pueda reclamar un almacenamiento persistente, ¿qué cosa obvia me estoy perdiendo que requiere esta nueva construcción (con inicio / parada ordenada, etc.)?