Después de leer cierta documentación sobre los volúmenes persistentes en Kubernetes, me pregunto cuál sería la mejor configuración (hablando de almacenamiento) para ejecutar un clúster de ElasticSearch de alta disponibilidad. No estoy ejecutando la configuración típica de EFK (o ELK), pero estoy usando ElasticSearch como un motor de búsqueda de texto completo adecuado.
He leído la Documentación oficial de Elastic , pero me parece bastante carente de aclaración. Según "Kubernetes en acción", Capítulo 6:
Cuando una aplicación que se ejecuta en un pod necesita almacenar datos en el disco y tener esos mismos datos disponibles incluso cuando el pod se reprograma a otro nodo, no puede usar ninguno de los tipos de volumen que hemos mencionado hasta ahora. Debido a que estos datos deben ser accesibles desde cualquier nodo del clúster, deben almacenarse en algún tipo de almacenamiento conectado a la red (NAS).
Entonces, si no me equivoco, necesito un Volume y accedo a él a través de PersistentVolumes y PersistentVolumeClaim con políticas Retain .
Cuando miro los Volúmenes Oficiales , tengo la sensación de que uno debe definir el tipo de Volumen por sí mismo. Sin embargo, al mirar una guía de DigitalOcean , no parece que haya ninguna configuración de volumen allí. Elegí ese tutorial, pero hay docenas en Medium que hacen lo mismo.
Entonces: ¿cuál es la mejor configuración para un clúster de ElasticSearch? Por supuesto teniendo en cuenta para no perder ningún dato dentro de un índice, y poder agregar pods (Kubernetes) o nodos (ElasticSearch) que puedan acceder al índice.
Un buen patrón para implementar un clúster de ElasticSearch en kubernetes es definir un StatefulSets .
Debido a que StatefulSet replica más de un Pod, no puede simplemente hacer referencia a un reclamo de volumen persistente. En su lugar, debe agregar una
persistent volume claim templatea la definición de estado de StatefulSet.
Para que estos volúmenes persistentes replicados funcionen, debe crear un aprovisionamiento de volumen dinámico y StorageClass que permita crear volúmenes de almacenamiento a pedido.
En el tutorial de la guía de DigitalOcean , la plantilla de reclamo de volumen persistente es la siguiente:
volumeClaimTemplates: - metadata: name: data labels: app: elasticsearch spec: accessModes: [ "ReadWriteOnce" ] storageClassName: do-block-storage resources: requests: storage: 100Gi Aquí, StorageClass es do-block-storage . Puede reemplazarlo con su propia clase de almacenamiento
Pregunta muy interesante,
Debe pensar en un nodo de Elasticsearch en Kubernetes que sería equivalente a un Pod de Elasticsearch.
Y Kubernetes debe mantener la identidad de cada pod para adjuntarlo al reclamo de volumen persistente correcto en caso de una interrupción, aquí viene el StatefulSet
Un StatefulSet garantizará que el mismo PersistentVolumeClaim permanezca vinculado al mismo Pod durante su vida útil.
Un PersistentVolume (PV) es una abstracción de Kubernetes para el almacenamiento en el hardware proporcionado. Puede ser AWS EBS, DigitalOcean Volumes, etc.
Recomiendo echar un vistazo al gráfico oficial de Helm de Elasticsearch: https://github.com/elastic/helm-charts/tree/master/elasticsearch
También Operador de Elasticsearch: https://operatorhub.io/operator/elastic-cloud-eck