Categorías
cloud elasticsearch kubernetes

Elastic Cloud on Kubernetes

Elastic Cloud on Kubernetes o ECK amplía la capacidad de orquestación de Kubernetes para desplegar, securizar y actualizar tu cluster de Elasticsearch. En este artíulo aprenderás a desplegar Elastic Cloud en un cluster de Kubernetes en Google Cloud. ECK está basado en el patrón kubernetes operator y además de Elasticsearch también soporta la configuración y administración de Kibana. Puedes desplegar sobre la distribución que tú elijas, incluidos Google Kubernetes Engine, Azure Kubernetes Service, Amazon Elastic Kubernetes Service y Openshift.

Las versiones soportadas por ECK son las siguientes:

  • kubectl 1.11 o superior
  • Kubernetes 1.12 o superior o Openshift 3.11 o superior
  • Elastic Stack 6.8 o superior, 7.1 o superior

Google Kubernetes Engine

Lo primero que necesitamos para desplegar a través de ECK es tener disponible un cluster de Kubernetes. Google Kubernetes Engine o GKE es el entorno gestionado de kubernetes de Google Cloud Platform.

Para crear un cluster de kubernetes en Google Cloud Platform tan solo tenemos que entrar en la consola (https://console.cloud.google.com) y una vez que nos hemos autenticado y estamos dentro, entrar en el menú de navegación y seleccionar Kubernetes Engine / Clusters. Una vez dentro pulsamos la opción «Crear clúster«.

Nos aparecerá un formulario para especificar las características de nuestro clúster. Lo primero es darle un nombre, por ejemplo cluster-eck y seleccionamos la zona, por ejemplo europe-west1-c o a europe-west1-b. La versión de kubernetes ya vimos que tenía que ser la 1.12 o superior, así que podemos dejar la que venga por defecto.

En grupo de nodos seleccionamos el tipo de nodo en cuanto a cpu y memoria. Podemos arrancar el clúster con el mínimo de memoria, pero si queremos un deployment de Elasticsearch con varios nodos para alta disponibilidad + un deployment de Kibana, necesitaremos al menos nodos de 7,5Gb.

Cómo se trata de un cluster para probar ECK seleccionamos la opción de clúster público en la categoría Redes.

Pulsamos crear y comenzará a desplegarse el clúster en nuestro proyecto de Google Cloud. Si lo deseamos podemos crear el clúster a través del SDK o de Cloud Shell a través del comando que te ofrece el propio proceso de creación.

Crear clúster desde SDK de Google Cloud
Creación del clúster de Kubernetes completada

Kubernetes Operator

Una vez que tenemos el cluster de kuberntes listo, necesitamos instalar las custom resource definitions y el operador de kubernetes con sus reglas RBAC. Para ello tenemos que tener instalado el cliente kubectl en el SDK de Google Cloud Shell, ya está instalado por defecto en Cloud Shell. Para shell en local ejecutar:

gcloud components install kubectl

Antes de operar el cluster con kubectl necesitamos obtener las credenciales con el siguiente comando y así generar la entrada correspondiente en kubeconfig. Debes modificar la zona y el nombre del proyecto por el que corresponda.

gcloud container clusters get-credentials cluster-eck --zone europe-west1-b --project miprimerproyecto

Fetching cluster endpoint and auth data.
kubeconfig entry generated for cluster-eck.

La instalación del operador de kubernetes se realizaría con el comando:

kubectl apply -f https://download.elastic.co/downloads/eck/1.0.1/all-in-one.yaml

El comando anterior crea en el clúster un namespace llamado elastic-system. Podemos ver los logs del operador con el siguiente comando:

kubectl -n elastic-system logs -f statefulset.apps/elastic-operator

Desplegar un cluster Elasticsearch

Para desplegar un cluster de Elasticsearch, debes aplicar la siguiente especificación. En ella verás que se especifica un único nodo. El nodo debe tener más de 2Gb de memoria o el pod no arrancará adecuadamente:

cat <<EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 7.6.1
  nodeSets:
  - name: default
    count: 1
    config:
      node.master: true
      node.data: true
      node.ingest: true
      node.store.allow_mmap: false
EOF

El operador automáticamente crea el clúster de Elasticsearch con la configuración deseada. Esto lleva algunos minutos hasta que el clúster está preparado para su uso. Puedes ver el estado con el siguiente comando:

kubectl get elasticsearch

NAME         HEALTH   NODES   VERSION   PHASE   AGE
quickstart   green    1       7.6.0     Ready   3m4s

Para acceder a Elasticsearch necesitamos obtener las credenciales de acceso. Un usuario predeterminado llamado elastic se crea automáticamente con la contraseña almacenada en un secreto de Kubernetes:

PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode)

Ahora podemos acceder al cluster a través del comando curl:

curl -u "elastic:$PASSWORD" -k "https://quickstart-es-http:9200"

{
  name: "quickstart-es-default-0",
  cluster_name: "quickstart",
  cluster_uuid: "I2jl0QQlT_GEbzFhNUXy2Q",
    version: {
    number: "7.6.0",
    build_flavor: "default",
    build_type: "docker",
    build_hash: "7f634e9f44834fbc12724506cc1da681b0c3b1e3",
    build_date: "2020-02-06T00:09:00.449973Z",
    build_snapshot: false,
    lucene_version: "8.4.0",
    minimum_wire_compatibility_version: "6.8.0",
    minimum_index_compatibility_version: "6.0.0-beta1"
    },
  tagline: "You Know, for Search"
}

Si tenemos SDK Shell en local, en vez de probarlo con un curl como en el párrafo anterior, podemos hacer forward del puerto y probar desde el navegador con el usuario «elastic» y la contraseña obtenida desde los secrets de kubernetes:

kubectl port-forward service/quickstart-es-http 9200

Desplegar Kibana

Para desplegar kibana debemos especificar la siguiente configuración. En ella debemos asociar kibana con el cluster de Elastic:

cat <<EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 7.6.1
  count: 1
  elasticsearchRef:
    name: quickstart
EOF

Puedes ver el estado con el siguiente comando:

kubectl get kibana

NAME         HEALTH   NODES   VERSION   AGE
quickstart   red              7.6.0     4s

Para acceder a kibana podemos ver el servicio creado para kibana:

kubectl get service quickstart-kb-http

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
quickstart-kb-http   ClusterIP   10.44.4.49   <none>        5601/TCP   3m57s

Usamos kubectl port-forward para acceder a Kibana desde el pc local:

kubectl port-forward service/quickstart-kb-http 5601

Abrimos en el navegador la url https://localhost:5601 y accederemos a la interfaz de kibana a la que podemos acceder con el usuario elastic y la password obtenida más arriba.

Si has llegado hasta aquí habrás sido capaz de desplegar Elastic cloud en un cluster de Kubernetes en Google Cloud. Se trata de un despliegue básico que puedes ir completando. Si modificas la especificación y aumentas el número de nodos, verás que el clúster irá añadiendo nodos de forma transparente. También puedes añadir nodos para master dedicados, subir de versión, etc. Desde luego se trata de un paso adelante para la orquestación de nuestros despliegues de Elasticsearch. IMPORTANTE: No olvides eliminar tus despliegues y cluster de kubernetes si no quieres incurrir en gastos innecesarios.