Fondo
Por naturaleza, los Pods son efímeros. Esto significa que GKE destruye el estado y el valor almacenados en un pod cuando se elimina, se expulsa o se vuelve a programar.
Como operador de aplicaciones, puede que quieras mantener cargas de trabajo con reconocimiento del estado. Algunos ejemplos de estas cargas de trabajo son las aplicaciones que procesan artículos de WordPress, las aplicaciones de mensajería y las aplicaciones que procesan operaciones de aprendizaje automático.
Si usas Filestore en GKE, puedes realizar las siguientes operaciones:
- Despliega cargas de trabajo con estado que sean escalables.
- Permite que varios pods tengan
ReadWriteManycomoaccessMode, de forma que varios pods puedan leer y escribir al mismo tiempo en el mismo almacenamiento. - Configura GKE para montar volúmenes en varios pods simultáneamente.
- Conserva el almacenamiento cuando se eliminen los pods.
- Permite que los pods compartan datos y se escalen fácilmente.
Configurar el almacenamiento de archivos gestionado con Filestore mediante CSI
GKE ofrece una forma de desplegar y gestionar automáticamente el controlador de CSI de Filestore para Kubernetes en tus clústeres.
Con el controlador de CSI para Filestore, puedes crear o eliminar instancias de Filestore de forma dinámica y usarlas en cargas de trabajo de Kubernetes con un StorageClass o un Deployment.
Puedes crear una instancia de Filestore creando un PVC que aprovisione dinámicamente una instancia de Filestore y el PV, o bien acceder a instancias de Filestore aprovisionadas previamente en cargas de trabajo de Kubernetes.
Nueva instancia
Crear la clase de almacenamiento
volumeBindingModese ha definido comoImmediate, lo que permite que el aprovisionamiento del volumen comience inmediatamente.tierse define comostandardpara que las instancias de Filestore se creen más rápido. Si necesitas un almacenamiento NFS con mayor disponibilidad, instantáneas para copias de seguridad de datos, replicación de datos en varias zonas y otras funciones de nivel empresarial, definetiercomoenterprise. Nota: La política de reclamación de los PV creados dinámicamente tiene el valor predeterminadoDeletesi no se definereclaimPolicyenStorageClass.
Crea el recurso
StorageClass:kubectl create -f filestore-storageclass.yamlVerifica que se haya creado la clase de almacenamiento:
kubectl get scEl resultado debería ser similar al siguiente:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE filestore-sc filestore.csi.storage.gke.io Delete Immediate true 94m
Instancia preaprovisionada
Crear la clase de almacenamiento
Si volumeBindingMode tiene el valor Immediate, el aprovisionamiento del volumen puede empezar inmediatamente.
Crea el recurso
StorageClass:kubectl create -f preprov-storageclass.yamlVerifica que se haya creado la clase de almacenamiento:
kubectl get scEl resultado debería ser similar al siguiente:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE filestore-sc filestore.csi.storage.gke.io Delete Immediate true 94m
Crear 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, donde el valor de
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:28Anota el
INSTANCE_NAME,LOCATION,FILE_SHARE_NAMEyIP_ADDRESSde la instancia de Filestore.Rellena 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_ADDRESSSustituye las variables de marcador de posición por las variables de consola obtenidas anteriormente en el 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.yamlComprueba que el valor de
STATUSde la PV seaBound:kubectl get pvEl resultado debería ser similar al siguiente:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE fileserver 1Ti RWX Delete Bound default/fileserver filestore-sc 46m
Usar un PersistentVolumeClaim para acceder al volumen
El siguiente manifiesto de pvc.yaml hace referencia al StorageClass del controlador CSI de Filestore llamado filestore-sc.
Para que varios pods puedan leer y escribir en el volumen, el valor de accessMode se define como ReadWriteMany.
Despliega el PVC:
kubectl create -f pvc.yamlVerifica que se haya creado el PVC:
kubectl get pvcEl resultado debería ser similar al siguiente:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE fileserver Bound pvc-aadc7546-78dd-4f12-a909-7f02aaedf0c3 1Ti RWX filestore-sc 92mComprueba que la instancia de Filestore recién creada esté lista:
gcloud filestore instances listEl resultado debería ser similar al siguiente:
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
Crear un pod de lectura y otro de escritura
En esta sección, crearás un pod de lectura y un pod de escritura. En este tutorial 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 distribuidas entre los nodos de un clúster.
Crear el Pod de lectura
El pod de lectura leerá el archivo que escriban los pods de escritura. Los pods de lectura verán a qué hora y qué réplica del pod de escritura ha escrito en el archivo.
El pod de lectura leerá de la ruta /usr/share/nginx/html, que se comparte entre todos los pods.
Implementa el pod de lector:
kubectl apply -f reader-fs.yamlComprueba que las réplicas de lectores se están ejecutando. Para ello, haz una consulta a la lista de pods:
kubectl get podsEl resultado debería ser similar al siguiente:
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 3m30s
Crea el Pod de redacción
El pod de escritura escribirá periódicamente en un archivo compartido al que podrán acceder otros pods de escritura y lectura. El pod de escritura registra su presencia escribiendo su nombre de host en el archivo compartido.
La imagen utilizada para 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 llevará la cuenta de todos los escritores únicos y las escrituras totales.
En este tutorial, el pod de escritura escribe cada 30 segundos en la ruta /html/index.html. Modifica el valor del número sleep
para que tenga una frecuencia de escritura diferente.
Despliega el pod de escritura:
kubectl apply -f writer-fs.yamlComprueba que los pods de escritura se están ejecutando. Para ello, haz una consulta a la lista de pods:
kubectl get podsEl resultado debería ser similar al siguiente:
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
Exponer y acceder a la carga de trabajo de lector a un balanceador de carga de servicio
Para exponer una carga de trabajo fuera del clúster, crea un servicio de tipo
LoadBalancer. Este tipo de servicio crea un balanceador de carga externo con una dirección IP accesible a través de Internet.
Crea un servicio de tipo
LoadBalancerllamadoreader-lb:kubectl create -f loadbalancer.yamlSupervisa la implementación para ver que GKE asigna un
EXTERNAL-IPal servicioreader-lb:kubectl get svc --watchCuando el
Serviceesté listo, la columnaEXTERNAL-IPmostrará la dirección IP pública del balanceador de carga: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 2d20hPulsa Ctrl+C para finalizar el proceso de monitorización.
Usa un navegador web para ir a la
EXTERNAL-IPasignada al balanceador de carga. La página se actualiza cada 30 segundos. Cuantos más escritores de pódcasts y menor sea la frecuencia, más entradas se mostrarán.
Para ver más detalles sobre el servicio de balanceador de carga, consulta loadbalancer.yaml.
Ampliar el escritor
Como el PV accessMode se ha definido como ReadWriteMany, GKE puede aumentar el número de pods para que más pods de escritura puedan escribir en este volumen compartido (o más lectores puedan leerlos).
Amplía
writera cinco réplicas:kubectl scale deployment writer --replicas=5El resultado debería ser similar al siguiente:
deployment.extensions/writer scaledVerifica el número de réplicas en ejecución:
kubectl get podsEl resultado debería ser similar al siguiente:
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 la
EXTERNAL-IPasignada al balanceador de carga.
En este punto, has configurado y escalado tu clúster para que admita cinco pods de escritura con estado. Cuando varios pods de escritura escriben en el mismo archivo simultáneamente. Los lectores de Pods también se pueden ampliar fácilmente.
Opcional: Acceder a los datos del Pod de escritura
En esta sección se muestra cómo usar una interfaz de línea de comandos para acceder a un pod de lectura o escritura. Puedes ver el componente compartido en el que escribe el escritor y del que lee el lector.
Obtén el nombre del pod de escritura:
kubectl get podsEl resultado debería ser similar al siguiente:
NAME READY STATUS RESTARTS AGE writer-5465d65b46-7hxv4 1/1 Running 0 20dAnota el nombre de host de un pod de escritor (por ejemplo,
writer-5465d65b46-7hxv4).Ejecuta el siguiente comando para acceder al pod de escritura:
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.Salir del entorno:
exit