Elastic Cloud on Kubernetes o ECK amplía la capacidad de orquestación de Kubernetes para desplegar, securizar y actualizar tu clúster de Elasticsearch. En este artíulo aprenderás a desplegar Elastic Cloud en un clúster 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.
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.