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 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.

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.

Categorías
cloud elasticsearch

Elasticsearch Services en AWS

En este post vamos a comparar los servicios Elasticsearch como SaaS con los que contamos en AWS. Elasticsearch se ha convertido en una de las herramientas más ampliamente usadas para desplegar diferentes capacidades de búsqueda en aplicaciones empresariales.

Elasticsearch fue lanzado como implementación open source por Shay Banon en 2010. Fundó la compañía de búsqueda Elastic en 2015 para vender una versión comercial a través de licenciamiento. Elasticsearch implementa motores de búsqueda optimizados para búsquedas «full text search». Pero Elasticsearch no sólo almacena texto, sino también logs, métricas, lo que permite la analítica del dato, monitorización de aplicaciones y analítica de seguridad.

Elasticsearch puede descargarse de manera gratuita e instalarse en diferentes plataformas en modo servicio o también dentro de contenedores docker. En entornos empresariales existe la posibilidad de desplegar Elasticsearch en Elastic Cloud Enterprise, que se encarga de orquestar múltiples clusters de Elasticsearch on-premise. Otra opción consiste en desplegar Elasticsearch en Kubernetes, a través de un operador de kubernetes creado por Elastic. Para instalar Elasticsearch como servicio gestionado en AWS hay dos enfoques diferentes:

Un tercer enfoque «auto-gestionado» sería instalar el software open source sobre una instancia EC2. Este último requiere más recursos de gestión y más technical expertise.

Amazon ES vs Elastic Cloud

Amazon ES Service y Elastic Cloud ofrecen funcionalidades similares pero difieren en puntos clave. Todas las capacidades son compartidas, como el soporte de Kibana. Kibana es la herramienta que utilizamos para analizar los datos indexados en Elasticsearch. Ambos servicios soportan Beats y Logstash, lo que simplifica la indexación y transformación de los datos. Ambos proveen un fácil despliegue, escalabilidad y requieren menos intervención humana comparándolo con un despliegue manual on-premise o sobre instancias EC2.

Amazon ES Service ofrece una mayor integración con otros servicios AWS:

  • Kinesis Streams
  • Kinesis Firehose
  • CloudWatch Logs
  • Buckets S3
  • Funciones Lambda

Elastic Cloud incorpora herramientas para portar fácilmente desde otros proveedores cloud o desde infraestructura on-premise. Además soporta una variedad de nuevas capacidades que no tiene el servicio de Amazon. Entre ellas están:

  • Data rollups. Usa menos espacio de almacenamiento para resumir y almacenar datos históricos.
  • Elasticsearch SQL Provee nuevas herramientas para consulta a Elastic de la manera tradicional pero con la velocidad increíble de la herramienta.
  • Kibana Spaces. Facilita la creación y organización de dashboards por grupos de usuarios y funcionalidad.
  • Elastic Commercial Plugins. Quizá sea la gran diferencia. Elastic cloud ofrece Seguridad a nivel de acceso a los datos, Reporting, monitorización/alertas y Machine Learning para el entrenamiento y búsqueda de pautas y detección de anomalías. Amazon Elasticsearch Service está incorporando poco a poco su propia implementación de las anteriores funcionalidades basada en Opendistro for Elasticsearch y en muchos casos sólo para nuevos despliegues (ver documentación).
  • Canvas. Para la presentación de los datos.

Claves para elegir AWS ES o Elastic Cloud

  • Elastic Cloud ofrece más control a las organizaciones y requiere menos trabajo de mantenimiento.
  • Si habitualmente trabajas con los servicios de AWS (Kinesis, S3, lambda…), se recomienda utilizar el servicio Elasticsearch de AWS, ya que el mantenimiento y el coste será menor.
  • A favor de Elastic Cloud está el hecho de que incorpora plugins de seguridad, machine learning y alertas. Estas características no están aún incluidas en su totalidad en el servicio de Amazon. La propia Elastic ha creado documentación para indicar las diferencias entre ambos servicios.
  • Otro punto a tener en cuenta es evitar el efecto «vendor lock-in». Cuantos más servicios AWS se utilicen, más duro será salir de allí por razones económicas o técnicas.
  • Por último, organizaciones que utilicen Elasticsearch de manera intensa y como core de su negocio, que quieran el mayor control sobre sus cargas de trabajo, deberían estudiar su propio despliegue y su propia gestión de Elasticsearch.