Cómo crear un StatefulSet en Kubernetes
Los StatefulSets contienen un conjunto de Pods con identidades únicas y persistentes y nombres de host estables. En un Statefulset se utiliza una plantilla de pods, que contiene una especificación para sus pods, los pods se crean utilizando esta especificación. Podemos desplegar aplicaciones stateful y aplicaciones clusterizadas utilizando Statefulsets en Kubernetes. Los StatefulSet pueden actualizarse realizando cambios en su especificación Pod, que incluye sus imágenes de contenedor y volúmenes.
Los StatefulSets pueden utilizarse cuando las aplicaciones requieren alguna de las siguientes propiedades.
- Identificadores de red estables y únicos.
- Almacenamiento estable y persistente.
- Despliegue y escalado ordenados y elegantes.
- Actualizaciones rodantes ordenadas y automatizadas.
Para un StatefulSet con N réplicas, cuando se despliegan Pods, se crean secuencialmente, en orden de {0..N-1}. Cuando se eliminan Pods, se terminan en orden inverso, de {N-1..0}.
Para saber más sobre Statefulset, haz clic aquí.
En este artículo, crearemos un Statefulset con réplicas de Pods Nginx. Realizaremos operaciones sobre los Pods para ver cómo se eliminan y se crean.
Requisitos previos
- Cluster Kubernetes con al menos 1 nodo trabajador.
Si quieres aprender a crear un Cluster Kubernetes, haz clic aquí. Esta guía te ayudará a crear un clúster Kubernetes con 1 Maestro y 2 Nodos en Instancias EC2 AWS Ubuntu 18l04.
Qué haremos
- Crear un Statefulset
Crear un Statefulset
Crea un archivo y añade en él la siguiente definición de Statefulset.
vim statefulset.yml
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 serviceName: "nginx" replicas: 3 template: metadata: labels: app: nginx spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: k8s.gcr.io/nginx-slim:0.8 ports: - containerPort: 80 name: web
En este ejemplo
- Se utiliza un Servicio Headless, llamado
nginx
, para controlar la red. - El StatefulSet, llamado web, tiene 3 réplicas del contenedor nginx que se lanzarán en Pods únicos.
- La Imagen nginx con la versión slim:0.8 se utiliza para desplegar Nginx.
Para crear un Statefulset, ejecuta los siguientes comandos.
kubectl get statefulset
kubectl create -f statefulset.yml
Ejecuta los 2 comandos siguientes para listar el Statefulset y el Servicio creados en el paso anterior.
kubectl get statefulset
kubectl get service
Obtén los pods utilizando el siguiente comando y comprueba que los pods tienen números como sufijo en el nombre del pod.
kubectl get pods
Para obtener los detalles completos del Statefulset, ejecuta los siguientes comandos.
kubectl get statefulset
kubectl describe statefulset web
Ahora, vamos a eliminar los pods y a ver cómo se conservan los nombres incluso después de crear nuevos pods.
Vamos a borrar 2 pods para ver qué nombres se asignarán a los nuevos pods tras su creación.
kubectl obtener pods
kubectl delete pods web-0 web-2
kubectl get pods
En la captura de pantalla anterior puedes ver que, incluso después de eliminar los pods, los pods recién creados reciben el mismo nombre.
Conclusión
En este artículo, hemos creado un Statefulset y hemos realizado operaciones sobre él para comprobar sus detalles. También hemos eliminado los pods para ver cómo se conserva el nombre del pod y se asigna el mismo a los pods recién creados después de eliminarlo.