Antes de comenzar

Para poder montar el cluster Elasticsearch, tenemos que tener instalado Minikube (el cual nos servirá para poder trabajar con k8s de manera local), también debemos instalar kubectl (herramienta de consola para manipular k8s). Para una correcta instalación es recomendable que lean la documentación oficial de Kubernetes, es muy completa; de todas maneras en breve estaremos subiendo la guía “Arrancando con Kubernetes” para los que quieran introducirse al mundo de la orquestación de contenedores desde cero y no sepan por donde comenzar.

Aclaracion importante: lo que vamos a mostrar en este post, pueden encontrarlo en las docs oficiales de K8s, Elasticsearch etc. esto es simplemente el resultado de “Googlear” con ganas un buen rato, no es nada del otro mundo, pero a veces es bueno tener la info en un solo lugar que invertir largas horas buscando documentacion (experiencia propia). Bien, vamos a trabajar con el stack ELK (Elasticsearch-Logstash-Kibana) un stack bastante completo a la hora de hablar de procesamiento de logs, metricas, alertas y monitoreo de aplicaciones e infraestructura en general.

Iniciemos el Minikube

Una vez que tenemos las herramientas antes mencionadas en nuestro equipo (en mi caso estoy realizando esta instalación sobre un Debian 9), vamos a iniciar Minikube, indicando también que vamos a iniciar la máquina usando kvm de hypervisor.

minikube start --vm-driver=kvm2 

startminikube

Aclaracion: en la imagen se muestra que minikube levanta automaticamente, sin embargo, si es la primera vez que ejecutan el start, primero se descargará la iso de la maquina al igual que kubeadm y kubelet, pero el resultado será el mismo.  

Si disponemos de algún vm manager, podemos ver que se generó y se encendió una vm llamada minikube.  

minikubestarted

De todas maneras, para manipular nuestro kubernetes local, vamos a utilizar kubectl que no es otra cosa que un manager de k8s en consola.   En primer lugar, le decimos a kubectl que va a trabajar con minikube.

kubectl config use-context minikube

Ahora podemos consultar las direcciones de nuestro k8s.

kubectl cluster-info

Y verificar que nuestro minikube se encuentra corriendo.

kubectl get nodes

 

kubectlinfo  

Kubernetes en el Browser

Minikube incluye una serie de complementos que podemos utilizar, entre ellos, tenemos la posibilidad de levantar una consola web de administracion de nuestro cluster.

Primero verificamos si lo tenemos activado, debemos corroborar que el elemento dashboard este enabled.

minikube addons list 

minikubeaddons

 

si no esta activo dicho complemento, podemos activarlo con el siguiente comando.

minikube addons enable dashboard

Ahora con la siguiente instruccion minikube nos abrirá la consola web de k8s, en nuestro browser por default.

minikube addons open dashboard

k8sbrowser

 

Levantemos ElasticSearch

Una vez que tenemos instalado y corriendo nuestro cluster k8s, vamos a deployar Elasticsearch en su interior, vamos a hacerlo en su ultima version, la 6.4.0 (en el momento en que se escribió esta entrada), sin embargo, pueden verificar en la doc oficial de ElasticSearch o en DockerHub y elegir la imagen docker que mas se acople a lo que estan queriendo monitorear.

Ejecutemos ahora la siguiente instruccion kubectl para hacer el deploy del contenedor Elasticsearch en nuestro entorno k8s, publicandolo en el puerto 9200.

kubectl run elasticsearch --image=docker.elastic.co/elasticsearch/elasticsearch:6.4.0 --env="discovery.type=single-node" --port=9200

Listamos los deployments con:

kubectl get deployments

Podemos tambien listar los pods y verificar el estado de creacion del contenedor con:

kubectl get pods --watch

creatingsployelastic

Tambien podemos verificar dicho estado, desde nuestra consola web:

deployelasticweb

En este punto ya tendremos nuestro Elasticsearch corriendo.

statuswebelasticok

 

Exponiendo el Cluster

Vamos a tirarle un expose a nuestro deployment Elasticsearch para poder accederlo desde fuera de la red de k8s, lo haremos con el siguiente comando.

kubetcl expose deployment elasticsearch --type=LoadBalancer

Y luego, a iniciar el servicio en nuestro browser por default.

minikube service elasticsearch

servicewebelastic

¡Excelente! En este momento, ya tenemos un cluster ElasticSearch corriendo en Kubernetes.  

Ahora Vamos por Kibana

Vamos a crear el deployment de Kibana apuntando a nuestro cluster Elasticsearch

kubectl run kibana --image=docker.elastic.co/kibana/kibana:6.4.0 --env="ELASTICSEARCH_URL=http://elasticsearch:9200" --env="XPACK_SECURITY_ENABLED=false" --port=5601

Ahora vamos a poder visualizar ambos deployments, tanto desde kubectl como desde la consola web de K8s.

deploykibana

deploywebkibana

Ahora al igual que hicimos con Elasticsearch, vamos a tirarle un expose al deployment que creamos anteriormente.

kubectl expose deployment kibana --type=LoadBalancer 

Finalmente abrimos nuestra consola Kibana en el browser

minikube service kibana

kibanaconsolaweb

Automatizando el Deployment

Ahora un poco de la magía de usar K8s, no tendremos necesidad de estar deployando a mano cada vez que tengamos algun problema con nuestros pods, gracias a la arquitectura de k8s podemos capturar todo el trabajo que hemos hecho hasta el momento, en un simple archivo de texto, veamos como lo hacemos:

Vamos a crear la siguiente estructura para Elasticsearch, uno para el deployment y otro para el servicio:

treeelasticsearch

Con el siguiente contenido respectivamente:

Deployment:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: elasticsearch
spec:
  selector:
    matchLabels:
      component: elasticsearch
  template:
    metadata:
      labels:
	component: elasticsearch
    spec:
      containers:
      - name: elasticsearch
	image: docker.elastic.co/elasticsearch/elasticsearch:6.4.0
	env:
	- name: discovery.type
	  value: single-node
	ports:
	- containerPort: 9200
	  name: http
	  protocol: TCP 

Service

apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
  labels:
    component: elasticsearch
spec:
  type: LoadBalancer
  selector:
    component: elasticsearch
  ports:
  - name: http
    port: 9200
    protocol: TCP

Antes de continuar, vamos a borrar el deployment que hicimos a mano, para que no tengamos problemas a la hora de levantarlo nuevamente:

kubectl delete deployment elasticsearch
kubectl delete service elasticsearch

deleteelasticsearch

Ahora levantamos ambos archivos, con la siguiente instruccion de kubectl:

kubectl create -f .

Así de sencillo, es genial, con el parametro -f le estamos diciento a kubectl que vamos a crear un deployment (con su respectivo servicio) a partir de un archivo (file) y con el “punto” le estamos diciendo que todos los archivos necesarios para el deployment se encuentran en el directorio actual.

createelastic

Ahora hacemos lo mismo con Kibana

Borramos el deployment y el servicio anteriormente creado:

deletekibana

Creamos los archivos:

kibanatree

Deployment

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: kibana
spec:
  selector:
    matchLabels:
      run: kibana
  template:
    metadata:
      labels:
	run: kibana
    spec:
      containers:
      - name: kibana
	image: docker.elastic.co/kibana/kibana:6.4.0
	env:
	- name: ELASTICSEARCH_URL
	  value: http://elasticsearch:9200
	#~ - name: XPACK_SECURITY_ENABLED
	  #~ value: "false"
	ports:
	- containerPort: 5601
	  name: http
	  protocol: TCP

Service

apiVersion: v1
kind: Service
metadata:
  name: kibana
  labels:
    run: kibana
spec:
  type: LoadBalancer
  selector:
    run: kibana
  ports:
  - name: http
    port: 5601
    protocol: TCP

Levantamos el Pod:

deploykibanacreate

Ahora que tenemos los deployments seteados en los archivos podemos facilmente bajar y/o levantar nuestros pods de Elasticsearch y Kibana con:

kubectl delete -f . 

Y con:

kubectl create -f .

Respectivamente.

Proximamente en un siguiente post, veremos guias rapidas de instalacion de Minikube, Kubectl, y Helm. y Por otro lado, trataremos de incluir guias sobre deployments de K8s en nubes publicas.Invitame un CaféInvitame un Café