Crear y depurar StatefulSets en Kubernetes
Cada pod en un StatefulSet de Kubernetes tiene un nombre de host único y estable, así como una identidad DNS completa. Esta identidad se conserva durante los reinicios y el escalado.
¿Qué son los StatefulSets en Kubernetes?
Los StatefulSets en Kubernetes son entidades especiales para gestionar aplicaciones que tienen requisitos especiales de datos persistentes e identidades fijas. Estos conjuntos garantizan que los pods con réplicas se inicien en un orden específico. Los StatefulSets asignan a cada pod de Kubernetes una identidad única y un acceso a almacenamiento persistente. Estas funciones son útiles para bases de datos que dependen de relaciones estables entre instancias y necesitan almacenar datos persistentes. Los StatefulSets representan así una solución eficaz para la orquestación y el funcionamiento de aplicaciones complejas en Kubernetes.
Si quieres orquestar clústeres con Kubernetes, IONOS tiene una solución a tu disposición: con la Cloud Empresarial, obtendrás la última tecnología de infraestructura como servicio (IaaS) y soluciones adaptadas a tu Proyecto individual. Esta arquitectura de vCPU es económica y con núcleos dedicados.
Cómo crear un StatefulSet en Kubernetes
En primer lugar, comenzamos definiendo un archivo de configuración YAML en el que especificamos las propiedades deseadas del StatefulSet y creamos el pod de Kubernetes. Tras la configuración, el StatefulSet monitoriza continuamente el estado del clúster y se asegura de que el número predefinido de pods está siempre en ejecución y disponible. En caso de fallo o retirada de un pod del nodo, el StatefulSet reconoce automáticamente la situación. En este caso, iniciará el despliegue de un nuevo pod con la misma identidad única. Este nuevo pod se conecta al almacenamiento persistente existente y recibe la configuración idéntica al pod original. Esto incluye también las solicitudes de recursos y los límites.
Esta gestión precisa de los pods y de su identidad es fundamental para que los clientes atendidos anteriormente por el pod no disponible puedan ser redirigidos al nuevo pod sin interrupción. El acceso al almacenamiento persistente garantiza que las operaciones sigan funcionando sin problemas.
Te mostramos un archivo YAML completo que ilustra los pasos para crear un StatefulSet en Kubernetes para Nginx:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx-statefulset
spec:
serviceName: nginx
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
- name: nginx-html
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: nginx-html
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
volumeClaimTemplates:
- metadata:
name: nginx-config
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
yamlEste documento YAML define un StatefulSet en Kubernetes para Nginx con tres réplicas. Utiliza un objeto de servicio llamado nginx y etiquetas para identificar correctamente los pods. Estos últimos utilizan la última imagen de Nginx y tienen dos volúmenes para los archivos de configuración y HTML. Los VolumeClaimTemplates aseguran el almacenamiento persistente para estos volúmenes con un tamaño de 1 gigabyte y permiten el acceso ReadWriteOnce.
Depuración de StatefulSets
La depuración de StatefulSets en Kubernetes requiere pasos específicos para verificar que los pods se inicializan correctamente y que es posible identificar y corregir errores si es necesario.
Paso 1: listado de los pods
Antes de empezar a depurar StatefulSets, debes comprobar el estado de los pods.
Abre la línea de comandos y utiliza el siguiente comando para listar todos los pods del conjunto de estados deseado:
kubectl get pods -l app=statefulset-label
shellOutput:
NAME READY STATUS RESTARTS AGE
nginx-statefulset-0 1/1 Running 0 2m
nginx-statefulset-1 1/1 Running 0 1m
nginx-statefulset-2 1/1 Running 0 1m
shellNAME
: cada pod recibe un nombre único basado en el esquema de nombres del StatefulSet y un número consecutivo.READY
: indica cuántos de los contenedores deseados están listos en el pod. En el ejemplo, cada pod tiene un contenedor, y1/1
significa que el contenedor está listo para su uso.STATUS
: indica el estado actual del pod.RESTARTS
: indica cuántas veces se ha reiniciado el contenedor del pod. Un valor de 0 significa que no ha habido reinicios hasta el momento.AGE
: indica el tiempo que lleva funcionando el pod.
Mensajes de estado que indican errores:
- Failed (fallo): uno o más contenedores del pod causaron un error que provocó el fallo del pod. Esto puede deberse a varias razones, como la falta de dependencias o problemas de configuración.
- Unknown (desconocido): no se ha podido determinar el estado del pod. Podría indicar un problema con la comunicación entre el clúster de Kubernetes y el pod. Esto incluye problemas de red, permisos faltantes u otros factores.
En ambos casos, es importante utilizar herramientas de diagnóstico precisas como la comprobación de pod logs o el comando kubectl describe pod
para obtener más detalles y determinar las causas de los errores.
Paso 2: depuración de pods individuales
Añadir anotaciones a un pod puede ser una útil herramienta de depuración para influir en el proceso de inicialización o desencadenar acciones especiales.
En primer lugar, debes identificar el nombre del pod que deseas depurar.
kubectl get pods
shellAnota el nombre del pod que quieres depurar.
Ahora introduce el siguiente comando en el terminal para definir la anotación para el pod seleccionado:
kubectl annotate pods [pod-name] pod.alpha.kubernetes.io/initialized="false" --overwrite
shellSustituye [pod-name]
por el nombre real del pod. Esta anotación establece el estado de inicialización a false
, lo que significa que el pod está marcado como no inicializado.
Revisa el pod para ver cómo afecta la anotación a su comportamiento. En concreto, puedes comprobar los eventos y registros del pod:
kubectl describe pod [pod-name]
kubectl logs [pod-name]
shellBusca eventos o salidas de registro que puedan causar problemas durante el proceso de inicialización. Cuando finalices la depuración y quieras restaurar el proceso de inicialización normal, vuelve a establecer la anotación en true
.
Paso 3: inicialización paso a paso
Si la depuración del pod utilizando las técnicas descritas anteriormente no tuvo éxito, esto podría indicar race conditions durante el proceso de bootstrap del StatefulSet. Para solucionar este problema, puedes especificar initialized="false"
en el manifiesto del StatefulSet de Kubernetes y, a continuación, crearlo con esta anotación en el clúster.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: [statefulset-name]
spec:
template:
metadata:
annotations:
pod.alpha.kubernetes.io/initialized: "false"
...
yamlAplica el manifiesto actualizado a tu cluster Kubernetes:
kubectl apply -f statefulset.yaml
shellInspecciona los pods e identifica cualquier fuente de error. Lleva a cabo las medidas de depuración necesarias basándote en los eventos y registros observados. Si es necesario, elimina los pods con kubectl delete statefulsets
o kubectl delete service
.
Una vez que hayas completado la depuración, podrás eliminar la anotación inicializada y actualizar el StatefulSet de Kubernetes en el clúster:
kubectl annotate pods [pod-name] pod.alpha.kubernetes.io/initialized="true" --overwrite
shellEste comando establece la anotación inicializada de un pod en true
y se asegura de que se sobrescriban los valores existentes. Una vez comprobado el primer pod, el StatefulSet inicializará automáticamente el siguiente pod. A continuación, puedes repetir los pasos de depuración para cada pod adicional del StatefulSet.
En este tutorial de Kubernetes encontrarás información detallada y práctica sobre la configuración de un clúster Kubernetes.