El Impresionante K8s Operator de Elasticsearch

cover

Intro: Porque Debería Usar ECK ?

En general, dentro de cualquier clúster de Kubernetes, la instalaciones mediante el uso de operators se han ido convirtiendo en el estándar para gestionar deployments y configuraciones de objetos custom (es decir objetos no contemplados en la API nativa de K8s) y también claro para automatizar sus ciclos de vida y operarlos en el día a día.

El esquema de funcionamiento de cualquier K8s Operator es prácticamente el mismo, se instalan Custom Resources Definitions (CRD) que básicamente nos permiten extender la API de Kubernetes dentro de nuestro cluster, y luego se levanta un Controller también personalizado que será el encargado de “operar” sobre estos recursos personalizados.

En el caso de Elastic Cloud on Kubernetes o “ECK”, este operador nos permite automatizar el proceso de gestión de un cluster de Elasticsearch con absolutamente todo su set de configuración y algunos otros objetos satélites miembros de su ecosistema (kibana, beats, autoscalers y más), por nombrar algunas de las otras ventajas concretas:

  • Gestión de múltiples instalaciones de Elasticsearch
  • Gestión de despliegues de Kibana y APM
  • Actualizaciones de versión sencillas, rápidas y masivas (en caso de múltiples clusters)
  • Automatización y control de la capacidad del clúster y escalado de recursos
  • Control de la configuración del clúster
  • Cambios de topología de clúster seguros (por ej incrementar data nodes sin downtimes)
  • Escalado dinámico de almacenamiento (siempre que tengamos un SC que lo soporte en nuestro k8s cluster)
  • Gestión de IndexTemplates, ILM, SLM y snapshot repos
  • Gestión de certificados TLS
  • Gestión de configuración de nodos y parámetros de cada nodo
  • Actualizaciones seguras de Keystores

Instalando CRDs y Operator

Hay que instalar los CRDs y el Operator, en ese orden, ya que el operator no arranca sin tener preconfigurados los CRDs, la versión de ECK que utilizamos a fecha de creación de este post es la 2.7.0 y las versiones de ES (Elasticsearch) desplegadas fueron la 8.5.0 y la 8.7.0 (latest), vamos a instalar ambas cosas con los comandos:

$ kubectl create -f https://download.elastic.co/downloads/eck/2.8.0/crds.yaml

$ kubectl apply -f https://download.elastic.co/downloads/eck/2.8.0/operator.yaml

NOTA: el deploy manual con kubectl es solo con fines de prueba y primeros pasos con ECK, para el uso de esto en Prod Envs se recomienda automatizar todo el proceso de instalación, el uso de ECK se adapta perfectamente al modelo Gitops, de hecho en producción lo he instalado en 2 empresas distintas, una instalación utilizando ArgoCD con Kustomize para deployar a GKE (Google Cloud K8s svc) y otra utilizando ArgoCD con Helm para deployar a EKS (AWS K8s svc), traten de seguir el camino Gitops siempre que puedan.

Objetos Custom Disponibles:

Si finalizan la instalacion correctamente, tendran la posibilidad de manejar estos nuevos objetos de API dentro de su cluster:

NAME                              SHORTNAMES               APIVERSION                                  NAMESPACED   KIND
agents                            agent                    agent.k8s.elastic.co/v1alpha1               true         Agent
apmservers                        apm                      apm.k8s.elastic.co/v1                       true         ApmServer
elasticsearchautoscalers          esa                      autoscaling.k8s.elastic.co/v1alpha1         true         ElasticsearchAutoscaler
beats                             beat                     beat.k8s.elastic.co/v1beta1                 true         Beat
elasticsearches                   es                       elasticsearch.k8s.elastic.co/v1             true         Elasticsearch
enterprisesearches                ent                      enterprisesearch.k8s.elastic.co/v1          true         EnterpriseSearch
kibanas                           kb                       kibana.k8s.elastic.co/v1                    true         Kibana
elasticmapsservers                ems                      maps.k8s.elastic.co/v1alpha1                true         ElasticMapsServer
stackconfigpolicies               scp                      stackconfigpolicy.k8s.elastic.co/v1alpha1   true         StackConfigPolicy

Probemos el Operator: Instalando Elasticsearch

El despliegue de un cluster de Elasticsearch usando ECK se realiza a través de la definición del CR (custom resource) Elasticsearch, este acepta todas las configuraciones permitidas en el clásico archivo de configuración elasticsearch.yml, aunque las configuraciones básicas están claras en la documentación oficial de Elastic, para las configuraciones avanzadas se requiere recurrir a pruebas y a usuarios de la comunidad para tener un poco más claro algunos errores que surgen al desplegar cosas distintas a la “quickstar” que nos muestra la doc oficial.

Probemos la potencia de este operator instalando un cluster de Elasticsearch con 3 nodos maestros y 3 nodos de datos agrupados por temperatura de datos:

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: eck-post
  namespace: elastic-system
spec:
  version: 8.7.0
  nodeSets:
  - name: master-nodes
    count: 3  
    config:
      node.store.allow_mmap: false
      node.roles: ["master"]
  - name: data-hot-nodes
    count: 1
    config:
      node.store.allow_mmap: false
      node.roles: ["data_hot", "data_content"]
  - name: data-warm-nodes
    count: 1     
    config:
      node.store.allow_mmap: false
      node.roles: ["data_warm", "data_content"]
  - name: data-cold-nodes
    count: 1
    config:
      node.store.allow_mmap: false
      node.roles: ["data_cold", "data_content"]

Full settings

Vamos con Kibana

El despliegue de la herramienta de visualización Kibana es bastante sencillo, y también bastante versátil en cuanto a su conexión con el clúster Elasticsearch destino:.

  • Pueden configurar Kibana para conectarse directamente a un clúster creado con ECK Operator en el mismo clúster K8s.
  • Pueden configurar Kibana para conectarse a un clúster desplegado con ECK Operator pero que esté en un clúster externo.
  • Puede configurar Kibana para conectarse a un clúster externo que no está desplegado con ECK Operator.

Vamos a instalar Kibana con el siguiente manifest, en donde simplemente vamos a referenciar a que cluster se tiene que conectar utilizando simplemente el nombre de nuestro CR creado previamente:

apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: eck-kibana
  namespace: elastic-system
spec:
  version: 8.4.0
  count: 1
  elasticsearchRef:
    name: eck-post
    namespace: elastic-system

Full Settings

Checkeando…

Al finalizar nuestro get pods debería tener esta facha:

magia

o sea por si no se dieron cuenta lo que acaba de pasar, levantamos EK (Elasticsearch y Kibana) con 6 nodos ES contemplando temperatura de datos, en DOS minutos, ECK sos un crack!!!

ahora armamos un ingress object apuntando al kibana y voilà:

ui

Stack Config Policy (SCP) - LO MEJOR DE USAR ECK

Stack Configuration Policies o (SCP) es un potente CR que concentra prácticamente todas o la mayoría de las configuraciones necesarias para operar nuestro cluster de Elasticsearch en el día a día y sus configuraciones a corto, mediano y largo plazo, algunas de las configuraciones son:

  • indexLifecyclePolicies (ILM)
  • indexTemplates
  • ingestPipelines
  • securityRoleMappings
  • snapshotLifecyclePolicies (SLM)

Los que alguna vez lidiaron con instalaciones, o incluso solamente con la operación de un cluster Elasticsearch saben que tener un objeto que concentre todas estas configuraciones es un gran tesoro, ya que se pueden olvidar de esas interminables gestiones por API a traves de terminal o del dev-tool de Kibana etc, les dejo un pequeño ejemplo de este hermoso CR:

apiVersion: stackconfigpolicy.k8s.elastic.co/v1alpha1
kind: StackConfigPolicy
metadata:
  name: post-scp
  namespace: elastic-system 
spec:
  resourceSelector:
    matchLabels:
      env: blogenv
  secureSettings:
  - secretName: "blog-secret"
  elasticsearch:
    clusterSettings:
      indices.recovery.max_bytes_per_sec: "100mb"
    snapshotRepositories:
      test-repo:
        type: gcs
        settings:
          bucket: gcs-blog
    snapshotLifecyclePolicies:
      test-slm:
        schedule: "0 1 2 3 4 ?"
        name: "<blog-snap-{now/d}>"
        repository: blog-repo
        config:
          indices: ["*"]
          ignore_unavailable: true
          include_global_state: false
        retention:
          expire_after: "7d"
          min_count: 1
          max_count: 20

Full Settings

Fuente

Material Extra: Curso “Devops en 5 Pasos” Disponible en Udemy

Temas:

  • Docker
  • Kubernetes
  • MultiCloud Orientado a Contenedores (AWS - Azure - GCP)
  • IaC (Terraform, Cloud Formation, ARM Templates, Cloud Resource Manager)
  • CI/CD Pipelines (GitlabCI, Azure Devops, CircleCI)

Descripción completa: Detalle y enlaces del curso

Redes:

Invitame un CaféInvitame un Café