En esta página se explica cómo desplegar una aplicación con estado mediante Google Kubernetes Engine (GKE).
Información general
Las aplicaciones con estado guardan datos en almacenamiento en disco persistente para que los usen el servidor, los clientes y otras aplicaciones. Un ejemplo de aplicación con estado es una base de datos o un almacén de pares clave-valor en el que otras aplicaciones guardan y recuperan datos.
El almacenamiento persistente se puede aprovisionar de forma dinámica, de modo que los volúmenes subyacentes se creen bajo demanda. En Kubernetes, puedes configurar el aprovisionamiento dinámico creando un StorageClass. En GKE, una StorageClass predeterminada te permite aprovisionar dinámicamente discos persistentes de Compute Engine.
Kubernetes usa el controlador StatefulSet para desplegar aplicaciones con reconocimiento del estado como objetos StatefulSet. Los pods de los StatefulSets no son intercambiables: cada pod tiene un identificador único que se mantiene independientemente de dónde se programe.
Las aplicaciones con estado son diferentes de las aplicaciones sin estado, en las que los datos de los clientes no se guardan en el servidor entre sesiones.
Puedes consultar más información sobre el almacenamiento persistente en clústeres multizona y regionales.
Antes de empezar
Antes de empezar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando
gcloud components update
.
- Asegúrate de que tu aplicación en contenedores esté almacenada en un registro de imágenes, como Artifact Registry.
Puedes seguir la guía de inicio rápido para habilitar la API de GKE, crear un clúster y obtener más información sobre GKE.
Solicitar almacenamiento persistente en StatefulSet
Las aplicaciones pueden solicitar almacenamiento persistente con un PersistentVolumeClaim.
Normalmente, debes crear objetos PersistentVolumeClaim además de crear el pod. Sin embargo, los objetos StatefulSet incluyen una matriz volumeClaimTemplates
, que genera automáticamente los objetos PersistentVolumeClaim. Cada réplica de StatefulSet obtiene su propio objeto PersistentVolumeClaim.
También puedes usar un disco preexistente en un StatefulSet.
Crear un StatefulSet
Para crear un recurso StatefulSet, usa el comando kubectl apply
.
El comando kubectl apply
usa archivos de manifiesto para crear, actualizar y eliminar recursos en tu clúster. Se trata de un método declarativo de configuración de objetos. Este método conserva las escrituras realizadas en objetos activos sin combinar los cambios en los archivos de configuración de objetos.
Linux
El siguiente archivo de manifiesto es un ejemplo sencillo de un StatefulSet gestionado por un servicio que se ha creado por separado:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: STATEFULSET_NAME
spec:
selector:
matchLabels:
# Selects Pods with this label.
app: APP_NAME
# Headless Service for network identity.
serviceName: "SERVICE_NAME"
replicas: 3
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: APP_NAME
spec:
containers:
- name: CONTAINER_NAME
image: IMAGE
ports:
- containerPort: 80
name: PORT_NAME
volumeMounts:
- name: PVC_NAME
mountPath: MOUNT_PATH
volumeClaimTemplates:
- metadata:
name: PVC_NAME
annotations:
KEY: VALUE
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
Haz los cambios siguientes:
STATEFULSET_NAME
: el nombre de StatefulSet, por ejemplo,web
.SERVICE_NAME
: el nombre del servicio (por ejemplo,nginx
).APP_NAME
: el nombre de la aplicación que se ejecuta en los pods. Por ejemplo,nginx
.CONTAINER_NAME
: el nombre de los contenedores de los pods, por ejemplo,nginx
.IMAGE
: la imagen de tu contenedor, por ejemplo,registry.k8s.io/nginx-slim:0.8
.PORT_NAME
: el nombre del puerto abierto por StatefulSet, por ejemplo,web
.PVC_NAME
: el nombre de PersistentVolumeClaim, por ejemplo,www
.MOUNT_PATH
: la ruta del contenedor en la que se monta el almacenamiento. Por ejemplo,/usr/share/nginx/html
.KEY
yVALUE
: un par clave-valor de anotación que se aplica a los metadatos de PersistentVolumeClaim. Puedes usar anotaciones para adjuntar metadatos arbitrarios no identificativos a objetos que pueden recuperar clientes, como herramientas y bibliotecas. Para obtener más información, consulta Anotaciones.
En este archivo, el campo kind
especifica que se debe crear un objeto StatefulSet con las especificaciones definidas en el archivo. Este StatefulSet de ejemplo genera tres pods replicados y abre el puerto 80 para exponer el StatefulSet a Internet.
Windows
Cuando se usan clústeres con grupos de nodos de Windows Server, debes crear una StorageClass, ya que la StorageClass predeterminada usa ext4
como tipo de sistema de archivos, que solo funciona con contenedores Linux. Si usas un disco persistente de Compute Engine, debes usar NTFS
como tipo de almacenamiento de archivos, tal como se muestra en el siguiente ejemplo:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
# Defines a name for this StorageClass.
name: STORAGECLASS_NAME
parameters:
# Specifies the type of Google Compute Engine persistent disk.
type: pd-standard
# Uses NTFS file system, which is crucial for Windows nodes
fstype: NTFS
# The provisioner for Google Compute Engine persistent disks.
provisioner: kubernetes.io/gce-pd
# Specifies that the PersistentVolume will be deleted if the PersistentVolumeClaim is deleted.
reclaimPolicy: Delete
# Delays volume binding until a Pod using the PVC is scheduled.
volumeBindingMode: WaitForFirstConsumer
El siguiente manifiesto de StatefulSet usa la StorageClass definida anteriormente. Crea cuatro pares de PersistentVolume y PersistentVolumeClaim para representar cuatro discos persistentes de Compute Engine. Cada pod del StatefulSet consume un disco persistente.
Para asegurarse de que sus pods se programan correctamente en los nodos de Windows Server, debe añadir un selector de nodos a la especificación de su pod.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: STATEFULSET_NAME
spec:
replicas: 4
selector:
matchLabels:
# Selects Pods with this label.
app: APP_NAME
template:
metadata:
labels:
# Labels applied to the Pods created by the StatefulSet.
app: APP_NAME
name: CONTAINER_NAME
spec:
nodeSelector:
# Ensures Pods are scheduled on Windows nodes.
kubernetes.io/os: windows
containers:
- name: CONTAINER_NAME
image: IMAGE
ports:
- containerPort: 80
name: PORT_NAME
volumeMounts:
- name: PVC_NAME
mountPath: MOUNT_PATH
volumeClaimTemplates:
- metadata:
name: PVC_NAME
spec:
# Specifies the StorageClass to use, which is crucial for Windows nodes.
storageClassName: STORAGECLASS_NAME
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
Haz los cambios siguientes:
STATEFULSET_NAME
: el nombre de StatefulSet, por ejemplo,web-windows
.APP_NAME
: el nombre de la aplicación que se ejecuta en los pods. Por ejemplo,iis
.CONTAINER_NAME
: el nombre de los contenedores de los pods, por ejemplo,iis
.IMAGE
: la imagen de tu contenedor, por ejemplo,mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
.PORT_NAME
: el nombre del puerto abierto por StatefulSet, por ejemplo,http
.PVC_NAME
: el nombre de PersistentVolumeClaim, por ejemplo,iis-state
.MOUNT_PATH
: la ruta del contenedor en la que se monta el almacenamiento. Por ejemplo,C:\mnt\state
.STORAGECLASS_NAME
: el nombre de StorageClass (por ejemplo,my-storage-class
).
Para crear un recurso StatefulSet, ejecuta el siguiente comando y sustituye STATEFULSET_FILE
por el nombre del archivo de manifiesto:
kubectl apply -f STATEFULSET_FILE
También puedes usar kubectl apply -f DIRECTORY/
para crear todos los objetos (excepto los que ya existen) definidos en los archivos de configuración almacenados en un directorio.
Inspeccionar un objeto StatefulSet
kubectl
Si deseas inspeccionar StatefulSet, ejecuta el siguiente comando:
kubectl get statefulset STATEFULSET_NAME -o yaml
Este comando muestra la configuración activa del recurso StatefulSet en formato YAML.
Si quieres enumerar los pods creados por StatefulSet, ejecuta el siguiente comando:
kubectl get pods -l app=APP_NAME
En este comando, la marca -l
indica a kubectl
que obtenga todos los pods etiquetados
para APP_NAME
.
El resultado debería ser similar al siguiente:
NAME READY STATUS RESTARTS AGE
pod-name 1/1 Running 0 1m
pod-name 1/1 Running 0 1m
Si quieres obtener información detallada sobre StatefulSet, ejecuta el siguiente comando:
kubectl describe statefulset STATEFULSET_NAME
Para obtener información sobre un pod específico, ejecuta el siguiente comando:
kubectl describe pod POD_NAME
Para enumerar los objetos PersistentVolumeClaim que se han creado, ejecuta el siguiente comando:
kubectl get pvc
El resultado debería ser similar al siguiente:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
STATEFULSET_NAME-PVC_NAME-0 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800002 1G RWO standard 9s
STATEFULSET_NAME-PVC_NAME-1 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800003 1G RWO standard 9s
STATEFULSET_NAME-PVC_NAME-2 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800004 1G RWO standard 9s
Para obtener información sobre un PersistentVolumeClaim específico, ejecuta el siguiente comando:
kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0
Para obtener información sobre un PersistentVolume específico, ejecuta el siguiente comando:
kubectl describe pv PV_NAME
Consola
Si quieres inspeccionar un StatefulSet, lleva a cabo los siguientes pasos:
Ve a la página Cargas de trabajo de la Google Cloud consola.
En la lista de cargas de trabajo, haz clic en el nombre del StatefulSet que quieras inspeccionar.
En la página Detalles del conjunto con estado, haz lo siguiente:
- Haz clic en la pestaña Historial de revisiones para ver el historial de revisiones de StatefulSet.
- Haga clic en la pestaña Eventos para ver todos los eventos relacionados con el StatefulSet.
- Haz clic en la pestaña Registros para ver los registros del contenedor del StatefulSet.
- Haga clic en la pestaña YAML para ver, copiar o descargar el archivo YAML de configuración de StatefulSet.
Actualizar un StatefulSet
Hay varias formas de actualizar objetos StatefulSet. El método declarativo habitual
es kubectl apply
. Para actualizar el StatefulSet directamente desde tu shell o en un editor que prefieras, puedes usar kubectl edit
. También puedes usar el editor de YAML desde el menú Cargas de trabajo de GKE en la Google Cloud consola.
Puedes implementar actualizaciones en la especificación de los pods de un recurso StatefulSet, como su imagen, el uso o las solicitudes de recursos o la configuración.
kubectl apply
Puedes actualizar StatefulSet si aplicas un archivo de manifiesto nuevo o actualizado. Esto es útil para hacer varios cambios en tu StatefulSet, como al escalar o especificar una nueva versión de tu aplicación.
Si quieres actualizar un objeto StatefulSet, ejecuta el siguiente comando:
kubectl apply -f STATEFULSET_FILE
Sustituye STATEFULSET_FILE
por el archivo de manifiesto actualizado.
El comando kubectl apply
aplica un archivo de manifiesto a un recurso. Si el recurso especificado no existe, lo crea el comando.
Para obtener más información sobre kubectl apply
, consulta la documentación de referencia de kubectl
.
Consola
Si quieres editar la configuración activa de un objeto StatefulSet, sigue estos pasos:
Ve a la página Cargas de trabajo de la Google Cloud consola.
En la lista de cargas de trabajo, haga clic en el nombre del StatefulSet que quiera modificar.
Haz clic en edit Editar.
Cambia el archivo YAML de configuración como quieras.
Haz clic en Guardar.
Inspeccionar el despliegue de la actualización
Para inspeccionar el lanzamiento de StatefulSet, ejecuta el siguiente comando:
kubectl rollout status statefulset STATEFULSET_NAME
Para ver el historial de despliegue de StatefulSet, ejecuta el siguiente comando:
kubectl rollout history statefulset STATEFULSET_NAME
Para deshacer un lanzamiento, ejecuta el siguiente comando:
kubectl rollout undo statefulset STATEFULSET_NAME
Actualizar estrategias
El campo updateStrategy
de StatefulSet te permite configurar y inhabilitar las actualizaciones continuas automatizadas de contenedores, etiquetas, solicitudes de recursos, límites y anotaciones de los pods de un StatefulSet.
Puede consultar más información sobre las estrategias de actualización de StatefulSets en la documentación de Kubernetes.
Escalar un objeto StatefulSet
kubectl
El comando kubectl scale
se puede usar en cualquier momento para escalar tu StatefulSet.
Si quieres escalar manualmente un objeto StatefulSet, ejecuta el siguiente comando:
kubectl scale statefulset STATEFULSET_NAME --replicas NUMBER_OF_REPLICAS
Sustituye NUMBER_OF_REPLICAS
por el número de pods replicados que quieras.
Consola
Si quieres escalar un objeto StatefulSet, sigue estos pasos:
Ve a la página Cargas de trabajo de la Google Cloud consola.
En la lista de cargas de trabajo, haga clic en el nombre del StatefulSet que quiera modificar.
Haz clic en list Acciones > Escalar > Editar réplicas.
Introduce el nuevo número de Réplicas del StatefulSet.
Haz clic en Escalar.
Eliminar un objeto StatefulSet
kubectl
Si quieres eliminar un objeto StatefulSet, ejecuta el siguiente comando:
kubectl delete statefulset STATEFULSET_NAME
Consola
Si quieres eliminar un objeto StatefulSet, sigue estos pasos:
Ve a la página Cargas de trabajo de la Google Cloud consola.
En la lista de cargas de trabajo, selecciona uno o varios StatefulSets que quieras eliminar.
Haz clic en delete Eliminar.
Cuando se te pida que confirmes la acción, haz clic en Eliminar.
Siguientes pasos
- Consulta cómo desplegar un clúster de MySQL en GKE para conseguir una alta disponibilidad
- Más información sobre el despliegue de aplicaciones sin reconocimiento del estado
- Consulta un tutorial sobre cómo actualizar un clúster en el que se ejecuta una carga de trabajo con reconocimiento del estado.