En esta página, se explica cómo crear y administrar cargas de trabajo con estado dentro de un clúster de Kubernetes aislado de Google Distributed Cloud (GDC). Las cargas de trabajo con estado te permiten escalar la implementación de tu aplicación con almacenamiento persistente. El almacenamiento persistente proporciona a tu aplicación identidades coherentes y nombres de host estables, independientemente de dónde se programen sus cargas de trabajo.
Esta página está dirigida a los desarrolladores que forman parte del grupo de operadores de aplicaciones y que son responsables de crear cargas de trabajo de aplicaciones para su organización. Para obtener más información, consulta Audiences for GDC air-gapped documentation.
Antes de comenzar
Para ejecutar comandos en un clúster de Kubernetes, asegúrate de tener los siguientes recursos:
Ubica el nombre del clúster de Kubernetes o pregúntale al administrador de la plataforma cuál es el nombre del clúster.
Accede y genera el archivo kubeconfig para el clúster de Kubernetes si no tienes uno.
Usa la ruta de acceso de kubeconfig del clúster de Kubernetes para reemplazar
KUBERNETES_CLUSTER_KUBECONFIG
en estas instrucciones.
Para obtener los permisos necesarios para crear cargas de trabajo con estado, pídele al administrador de IAM de tu organización que te otorgue el rol de administrador de espacios de nombres (namespace-admin
) en el espacio de nombres de tu proyecto.
Crea un recurso StatefulSet
Crea un objeto StatefulSet
escribiendo un manifiesto de StatefulSet
y ejecutando kubectl apply
para crear el recurso. Para proporcionar una forma estable para que los clientes envíen solicitudes a los Pods de tu recurso StatefulSet
, también debes crear un objeto Service
.
El comando kubectl apply
usa archivos de manifiesto para crear, actualizar y borrar recursos en tu clúster de Kubernetes. Este es un método declarativo de configuración de objetos. Con este método, se retienen las escrituras realizadas en objetos activos sin combinar los cambios en los archivos de configuración del objeto.
Para crear un recurso StatefulSet
y Service
, ejecuta el siguiente comando:
kubectl --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG -n NAMESPACE \
apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
name: SERVICE_NAME
labels:
app: APP_NAME
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: APP_NAME
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: STATEFULSET_NAME
spec:
selector:
matchLabels:
app: APP_LABEL_NAME
serviceName: "SERVICE_NAME"
replicas: NUMBER_OF_REPLICAS
template:
metadata:
labels:
app: APP_LABEL_NAME
spec:
terminationGracePeriodSeconds: 10
containers:
- name: CONTAINER_NAME
image: CONTAINER_IMAGE
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: CONTAINER_STORAGE_VOLUME_PATH
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
EOF
Reemplaza lo siguiente:
KUBERNETES_CLUSTER_KUBECONFIG
: Es el archivo kubeconfig del clúster en el que implementas cargas de trabajo de contenedores.NAMESPACE
: Es el espacio de nombres del proyecto en el que se implementarán las cargas de trabajo de los contenedores.SERVICE_NAME
: el nombre del objetoService
. Asegúrate de que el objetoStatefulSet
también establezca el objetoService
en suserviceName
.APP_NAME
: Es el nombre de la aplicación que se ejecutará dentro de la implementación.APP_LABEL_NAME
: Es el selector de etiquetas que determina qué pods pertenecen al objetoStatefulSet
.STATEFULSET_NAME
: Es el nombre del objetoStatefulSet
.NUMBER_OF_REPLICAS
: Es la cantidad de objetosPod
replicados que administra la implementación.CONTAINER_NAME
: Es el nombre del contenedor.CONTAINER_IMAGE
por el nombre de la imagen de contenedor Debes incluir la ruta de acceso al registro de contenedores y la versión de la imagen, comoREGISTRY_PATH/nginx:1.23
.CONTAINER_STORAGE_VOLUME_PATH
: Es la ruta de acceso dentro del contenedor en la que se activa un volumen de almacenamiento.
Como ejemplo, el siguiente objeto StatefulSet
y el objeto Service
correspondiente crean cargas de trabajo de contenedor con estado:
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: REGISTRY_PATH/nginx:1.23
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
En este ejemplo:
- Se crea un objeto
Service
llamadonginx
, indicado por el campometadata: name
. El objetoService
se segmenta para una app llamadanginx
, indicada porlabels.app: nginx
yselector.app: nginx
. El objetoService
expone el puerto 80 y lo llamaweb
. Este objetoService
controla el dominio de red y enruta el tráfico de Internet a la aplicación en contenedores que implementa el objetoStatefulSet
. - Se crea un objeto
StatefulSet
llamadoweb
con tres objetosPod
replicados, como se establece en el camporeplicas: 3
. - La plantilla
Pod
, establecida por la sección.spec.template
, indica que sus objetosPod
tienen la etiquetaapp: nginx
. - La especificación
Pod
, establecida por la sección.template.spec
, indica que los pods deStatefulSet
ejecutan un contenedor,nginx
, que ejecuta la imagennginx
en la versión1.23
. - La especificación de
Pod
usa el puerto web que abrió el objetoService
. - La sección
.template.spec.volumeMounts
especifica un campomountPath
, que se denominawww
.mountPath
es la ruta de acceso en el contenedor en la que se activa un volumen de almacenamiento. - El objeto
StatefulSet
aprovisiona tres objetosPersistentVolumeClaim
, denominadosweb-www-0
,web-www-1
yweb-www-2
, con 1 GB de almacenamiento aprovisionado cada uno.
Una vez creado, el objeto StatefulSet
garantiza que la cantidad deseada de objetos Pod
esté en ejecución y disponible en todo momento. El objeto StatefulSet
reemplaza automáticamente los objetos Pod
que fallan o que son expulsados de sus nodos, y asocia nuevos objetos Pod
con los recursos de almacenamiento, las solicitudes y límites de recursos, y otras configuraciones definidas en la especificación del objeto Pod
del objeto StatefulSet
.
Solicita almacenamiento persistente en un recurso StatefulSet
El almacenamiento continuo se puede aprovisionar de forma dinámica para que los volúmenes subyacentes se creen a pedido. Las aplicaciones pueden solicitar almacenamiento persistente con un objeto PersistentVolumeClaim
.
Por lo general, debes crear objetos PersistentVolumeClaim
además de crear el objeto Pod
. Sin embargo, los objetos StatefulSet
incluyen un array volumeClaimTemplates
que genera los objetos PersistentVolumeClaim
. Cada réplica de StatefulSet
obtiene su propio objeto PersistentVolumeClaim
.
Para obtener más información, consulta Configura el almacenamiento de contenedores.