Antecedentes
Por naturaleza, los pods son efímeros. Esto significa que GKE destruye el estado y el valor almacenado en un pod cuando se borra, expulsa o reprograma.
Como operador de la aplicación, recomendamos mantener las cargas de trabajo con estado. Entre los ejemplos de cargas de trabajo, se incluyen las aplicaciones que procesan artículos de WordPress, las apps de mensajería y las apps que procesan operaciones de aprendizaje automático.
Si usas Filestore en GKE, puedes realizar las siguientes operaciones:
- Implementar cargas de trabajo con estado que sean escalables
- Habilitar varios pods para tener
ReadWriteMany
como suaccessMode
, de modo que varios pods puedan leer y escribir al mismo tiempo en el mismo almacenamiento - Configura GKE para activar volúmenes en varios pods de forma simultánea.
- Conserva el almacenamiento cuando se quitan los Pods.
- Habilita los Pods para compartir datos y escalar con facilidad.
Objetivos
Este instructivo es para operadores de aplicaciones y otros usuarios que desean configurar una carga de trabajo con estado escalable en GKE a través de PVC y NFS.En este instructivo se abarcan los siguientes pasos:
- Crear un clúster de GKE.
- Configura el almacenamiento de archivos administrados con Filestore a través de CSI.
- Crea un lector y un Pod de escritor.
- Expón y accede al pod de lector a un balanceador de cargas de servicio.
- Escala verticalmente el escritor.
- Accede a los datos desde el pod escritor.
Costos
En este instructivo, se usan los siguientes componentes facturables de Google Cloud:Usa la calculadora de precios para generar una estimación de los costos según el uso previsto.
Cuando finalices este instructivo, puedes borrar los recursos creados para evitar que se te siga facturando. Para obtener más información, consulta Cómo realizar una limpieza.
Para seguir la guía paso a paso sobre esta tarea de forma directa en la consola de Google Cloud, haz clic en Guiarme:
Antes de comenzar
Configura tu proyecto
- Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.
-
Enable the Compute Engine, GKE, and Filestore APIs.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.
-
Enable the Compute Engine, GKE, and Filestore APIs.
Establece valores predeterminados para Google Cloud CLI
En la consola de Google Cloud, inicia una instancia de Cloud Shell:
Abrir Cloud ShellDescarga el código fuente para esta app de ejemplo:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/databases/stateful-workload-filestore
Configura las variables de entorno predeterminadas:
gcloud config set project PROJECT_ID gcloud config set compute/region COMPUTE_REGION gcloud config set compute/zone COMPUTE_ZONE gcloud config set filestore/zone COMPUTE_ZONE gcloud config set filestore/region COMPUTE_REGION
Reemplaza los siguientes valores:
- PROJECT_ID: el ID del proyecto de Google Cloud
- COMPUTE_REGION: la región de Compute Engine
- COMPUTE_ZONE: la zona de Compute Engine
Cree un clúster de GKE
Crea un clúster de GKE llamado
stateful-cluster
:gcloud container clusters create-auto stateful-cluster --region COMPUTE_REGION
El resultado es similar al siguiente una vez que se crea el clúster:
gcloud container clusters describe stateful-cluster NAME: stateful-cluster LOCATION: northamerica-northeast2 MASTER_VERSION: 1.21.11-gke.1100 MASTER_IP: 34.130.255.70 MACHINE_TYPE: e2-medium NODE_VERSION: 1.21.11-gke.1100 NUM_NODES: 3 STATUS: RUNNING
En el ejemplo anterior,
STATUS
esRUNNING
parastateful-cluster
.
Configura el almacenamiento de archivos administrado con Filestore a través de CSI
GKE proporciona una forma de implementar y administrar automáticamente el controlador CSI de Kubernetes Filestore en tus clústeres.
El uso de CSI de Filestore te permite crear o borrar instancias de Filestore de forma dinámica y usarlas en cargas de trabajo de Kubernetes con una StorageClass
o una Deployment
.
Puedes crear una nueva instancia de Filestore si creas un PVC que aprovisione de forma dinámica una instancia de Filestore y el PV, o accede a instancias de Filestore aprovisionadas con anterioridad en cargas de trabajo de Kubernetes.
Instancia nueva
Crea una clase de almacenamiento
volumeBindingMode
se configura comoImmediate
, lo que permite que el aprovisionamiento del volumen comience de inmediato.tier
se configura comostandard
para un tiempo de creación de instancia de Filestore más rápido. Si necesitas más almacenamiento NFS disponible, instantáneas para copia de seguridad de datos, replicación de datos en varias zonas y otras funciones a nivel de empresa, configuratier
comoenterprise
. Nota: La política de reclamo para PV creado de forma dinámica esDelete
de forma predeterminada si no se configurareclaimPolicy
enStorageClass
.
Crea el recurso
StorageClass
:kubectl create -f filestore-storageclass.yaml
Verifica que se haya creado la clase de almacenamiento:
kubectl get sc
El resultado es similar a este:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE filestore-sc filestore.csi.storage.gke.io Delete Immediate true 94m
Instancia aprovisionada con anterioridad
Crea una clase de almacenamiento
Cuando volumeBindingMode
se establece en Immediate
, permite que el aprovisionamiento del volumen comience de inmediato.
Crea el recurso
StorageClass
:kubectl create -f preprov-storageclass.yaml
Verifica que se haya creado la clase de almacenamiento:
kubectl get sc
El resultado es similar a este:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE filestore-sc filestore.csi.storage.gke.io Delete Immediate true 94m
Crea un volumen persistente para la instancia de Filestore
Verifica que la instancia de Filestore preexistente esté lista:
gcloud filestore instances list
El resultado es similar al siguiente, en el que el valor
STATE
esREADY
:INSTANCE_NAME: stateful-filestore LOCATION: us-central1-a TIER: ENTERPRISE CAPACITY_GB: 1024 FILE_SHARE_NAME: statefulpath IP_ADDRESS: 10.109.38.98 STATE: READY CREATE_TIME: 2022-04-05T18:58:28
Observe la
INSTANCE_NAME
, laLOCATION
, laFILE_SHARE_NAME
y laIP_ADDRESS
de la instancia de Filestore.Propaga las variables de la consola de la instancia de Filestore:
INSTANCE_NAME=INSTANCE_NAME LOCATION=LOCATION FILE_SHARE_NAME=FILE_SHARE_NAME IP_ADDRESS=IP_ADDRESS
Reemplaza las variables de marcador de posición por las variables de consola que se obtuvieron antes del archivo
preprov-pv.yaml
:sed "s/<INSTANCE_NAME>/$INSTANCE_NAME/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yaml sed "s/<LOCATION>/$LOCATION/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yaml sed "s/<FILE_SHARE_NAME>/$FILE_SHARE_NAME/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yaml sed "s/<IP_ADDRESS>/$IP_ADDRESS/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yaml
Crea el PV
kubectl apply -f preprov-pv.yaml
Verifica que el
STATUS
del PV esté configurado comoBound
:kubectl get pv
El resultado es similar a este:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE fileserver 1Ti RWX Delete Bound default/fileserver filestore-sc 46m
Usa un objeto PersistentVolumeClaim para acceder al volumen
El siguiente manifiesto pvc.yaml
hace referencia al StorageClass
del controlador de CSI de Filestore llamado filestore-sc
.
Para que varios Pods lean y escriban en el volumen, accessMode
se establece en ReadWriteMany
.
Implementa el PVC:
kubectl create -f pvc.yaml
Verifica que se haya creado el PVC:
kubectl get pvc
El resultado es similar a este:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE fileserver Bound pvc-aadc7546-78dd-4f12-a909-7f02aaedf0c3 1Ti RWX filestore-sc 92m
Verifica que la instancia de Filestore que acabas de crear esté lista:
gcloud filestore instances list
El resultado es similar a este:
INSTANCE_NAME: pvc-5bc55493-9e58-4ca5-8cd2-0739e0a7b68c LOCATION: northamerica-northeast2-a TIER: STANDARD CAPACITY_GB: 1024 FILE_SHARE_NAME: vol1 IP_ADDRESS: 10.29.174.90 STATE: READY CREATE_TIME: 2022-06-24T18:29:19
Crea un lector y un pod escritor
Crea el Pod del lector
El Pod del lector leerá el archivo que escriben los Pods del escritor. Los Pods del lector verán a qué hora y qué réplica del Pod de escritor escribió en el archivo.
El Pod del lector leerá desde la ruta de acceso /usr/share/nginx/html
que se comparte entre todos los Pods.
Implementa el Pod del lector:
kubectl apply -f reader-fs.yaml
Consulta la lista de Pods para verificar que las réplicas de lector estén en ejecución:
kubectl get pods
El resultado es similar a este:
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 3m30s
Crea el Pod escritor
El Pod del escritor escribirá periódicamente en un archivo compartido al que pueden acceder otros Pods del escritor y del lector. El Pod del escritor registra su presencia y escribe su nombre de host en el archivo compartido.
La imagen que usa el Pod del escritor es una imagen personalizada de Alpine Linux, que se usa para utilidades y aplicaciones de producción. Incluye una secuencia de comandos indexInfo.html
que obtendrá los metadatos del escritor más reciente y mantendrá el recuento de todos los escritores únicos y las escrituras totales.
En este instructivo, el Pod del escritor escribe cada 30 segundos en la ruta de acceso /html/index.html
. Modifica el valor del número sleep
para que tenga una frecuencia de escritura diferente.
Implementa el Pod de escritor:
kubectl apply -f writer-fs.yaml
Consulta la lista de Pods para verificar que los Pods del escritor se estén ejecutando:
kubectl get pods
El resultado es similar a este:
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 3m30s writer-855565fbc6-8gh2k 1/1 Running 0 2m31s writer-855565fbc6-lls4r 1/1 Running 0 2m31s
Expón y accede a la carga de trabajo del lector en un balanceador de cargas de servicio
Para exponer una carga de trabajo fuera del clúster, crea un Service de tipo LoadBalancer
. Este tipo de servicio crea un balanceador de cargas externo con una dirección IP a la que se puede acceder a través de Internet.
Crea un Service de tipo
LoadBalancer
llamadoreader-lb
:kubectl create -f loadbalancer.yaml
Mira la implementación para ver que GKE asigna un
EXTERNAL-IP
para el servicioreader-lb
:kubectl get svc --watch
Cuando
Service
está lista, la columnaEXTERNAL-IP
muestra la dirección IP pública del balanceador de cargas:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.8.128.1 <none> 443/TCP 2d21h reader-lb LoadBalancer 10.8.131.79 34.71.232.122 80:32672/TCP 2d20h
Presiona Ctrl+C para finalizar el proceso de observación.
Usa un navegador web para navegar al
EXTERNAL-IP
asignado al balanceador de cargas. La página se actualiza cada 30 segundos. Cuantos más pods de escritores y menor frecuencia, mayor será la cantidad de entradas que se mostrarán.
Para ver más detalles sobre el servicio de balanceador de cargas, consulta loadbalancer.yaml
.
Escala el escritor
Debido a que el PV accessMode
se configuró como ReadWriteMany
, GKE puede escalar verticalmente la cantidad de Pods para que más Pods del escritor puedan escribir en este volumen compartido (o más lectores puedan leerlos).
Escala verticalmente
writer
a cinco réplicas:kubectl scale deployment writer --replicas=5
El resultado es similar a este:
deployment.extensions/writer scaled
Verifica la cantidad de réplicas en ejecución:
kubectl get pods
El resultado es similar a este:
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 11m writer-855565fbc6-8dfkj 1/1 Running 0 4m writer-855565fbc6-8gh2k 1/1 Running 0 10m writer-855565fbc6-gv5rs 1/1 Running 0 4m writer-855565fbc6-lls4r 1/1 Running 0 10m writer-855565fbc6-tqwxc 1/1 Running 0 4m
Usa un navegador web para volver a navegar a
EXTERNAL-IP
asignado al balanceador de cargas.
En este punto, configuraste y escalaste tu clúster para admitir cinco pods de escritor con estado. En el que varios Pods del escritor escriben en el mismo archivo de forma simultánea. Los Pods del lector también se pueden escalar con facilidad.
Accede a los datos desde el pod del escritor (opcional)
En esta sección, se muestra cómo usar una interfaz de línea de comandos para acceder a un pod de lector o escritor. Puedes ver el componente compartido en el que escribe el escritor y el lector lee.
Obtén el nombre del Pod del escritor:
kubectl get pods
El resultado es similar a este:
NAME READY STATUS RESTARTS AGE writer-5465d65b46-7hxv4 1/1 Running 0 20d
Toma nota del nombre de host de un Pod del escritor (ejemplo:
writer-5465d65b46-7hxv4
).Ejecuta el siguiente comando para acceder al Pod del escritor:
kubectl exec -it WRITER_HOSTNAME -- /bin/sh
Consulta el componente compartido en el archivo
indexData.html
:cd /html cat indexData.html
Borra el archivo
indexData.html
:echo '' > indexData.html
Actualiza el navegador web que aloja la dirección
EXTERNAL-IP
para ver el cambio.Sal del entorno:
exit
Realiza una limpieza
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra el proyecto
- En la consola de Google Cloud, ve a la página Administrar recursos.
- En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
- En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.
Borra los recursos individuales
Borra el Service del balanceador de cargas:
kubectl delete service reader-lb
Espera hasta que se borre el balanceador de cargas aprovisionado para el servicio de lector.
Verifica que la lista muestre
Listed 0 items
:gcloud compute forwarding-rules list
Borra las implementaciones
kubectl delete deployment writer kubectl delete deployment reader
Verifica que se borren los Pods y muestre
No resources found in default namespace.
kubectl get pods
Borra el PVC. Esto también borrará el PV y la instancia de Filestore debido a que la política de retención establecida en
delete
kubectl delete pvc fileserver
Borra el clúster de GKE:
gcloud container clusters delete stateful-cluster --zone=COMPUTE_ZONE
Esto borra los recursos que conforman el clúster de GKE, incluidos los Pods del lector y del escritor.
¿Qué sigue?
- Aprende a implementar Cloud SQL con GKE.
- Modos de acceso para PV y PVC
- Obtén más información de GKE y Filestore
- Más información del controlador de CSI de Filestore
- Cómo crear una instancia de Filestore
- Cómo acceder a instancias de Filestore desde clústeres de GKE
- Explora otros instructivos de Kubernetes Engine.
- Obtén más información de la exposición de apps a través de servicios en GKE Expón aplicaciones a través de servicios