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.
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
En esta sección, crearás un Pod de lector y un Pod de escritor. En este instructivo, se usan implementaciones de Kubernetes para crear los Pods. Un Deployment es un objeto de la API de Kubernetes que te permite ejecutar varias réplicas de Pods que se distribuyen entre los nodos de un clúster.
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