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
ReadWriteManycomo 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
volumeBindingModese configura comoImmediate, lo que permite que el aprovisionamiento del volumen comience de inmediato.tierse configura comostandardpara 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, configuratiercomoenterprise. Nota: La política de reclamo para PV creado de forma dinámica esDeletede forma predeterminada si no se configurareclaimPolicyenStorageClass.
Crea el recurso
StorageClass:kubectl create -f filestore-storageclass.yamlVerifica que se haya creado la clase de almacenamiento:
kubectl get scEl 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.yamlVerifica que se haya creado la clase de almacenamiento:
kubectl get scEl 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 listEl resultado es similar al siguiente, en el que el valor
STATEesREADY: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:28Observe la
INSTANCE_NAME, laLOCATION, laFILE_SHARE_NAMEy laIP_ADDRESSde 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_ADDRESSReemplaza 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.yamlCrea el PV
kubectl apply -f preprov-pv.yamlVerifica que el
STATUSdel PV esté configurado comoBound:kubectl get pvEl 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.yamlVerifica que se haya creado el PVC:
kubectl get pvcEl 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 92mVerifica que la instancia de Filestore que acabas de crear esté lista:
gcloud filestore instances listEl 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.yamlConsulta la lista de Pods para verificar que las réplicas de lector estén en ejecución:
kubectl get podsEl 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.yamlConsulta la lista de Pods para verificar que los Pods del escritor se estén ejecutando:
kubectl get podsEl 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
LoadBalancerllamadoreader-lb:kubectl create -f loadbalancer.yamlMira la implementación para ver que GKE asigna un
EXTERNAL-IPpara el servicioreader-lb:kubectl get svc --watchCuando
Serviceestá lista, la columnaEXTERNAL-IPmuestra 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 2d20hPresiona Ctrl+C para finalizar el proceso de observación.
Usa un navegador web para navegar al
EXTERNAL-IPasignado 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
writera cinco réplicas:kubectl scale deployment writer --replicas=5El resultado es similar a este:
deployment.extensions/writer scaledVerifica la cantidad de réplicas en ejecución:
kubectl get podsEl 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 4mUsa un navegador web para volver a navegar a
EXTERNAL-IPasignado 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 podsEl resultado es similar a este:
NAME READY STATUS RESTARTS AGE writer-5465d65b46-7hxv4 1/1 Running 0 20dToma 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/shConsulta el componente compartido en el archivo
indexData.html:cd /html cat indexData.htmlBorra el archivo
indexData.html:echo '' > indexData.htmlActualiza el navegador web que aloja la dirección
EXTERNAL-IPpara ver el cambio.Sal del entorno:
exit