Kubernetes? Logging logstash en AWS con elasticsearch

Con el tiempo trabajando en proyectos grandes y pequeños dedicados a la infraestructura en la nube y tratando de gestionar correctamente los servicios que ejecutamos, necesitamos enviar y visualizar de una forma u otra los logs de cada aplicación que tenemos instalada en el clúster.

Tradicionalmente los administradores de sistemas anteriores lo que hacían cuando había un error en dicho sistema era ingresar a dicha aplicación y buscar los logs, al poco tiempo de hacer un «grep» de dichos logs para ver cuál era el error, con buena suerte de gastar mucho tiempo para encontrar el error y poder solucionarlo.

Con la aparición de los nuevos roles de los equipos de TI, se ha dejado de trabajar con estos sistemas o procesos para trabajar automatizando cada sistema.

¿Qué quiere decir esto? Todo evoluciona – mejora y tienes que cambiar tu forma de trabajar

Con el paso del tiempo, el rol del desarrollador evolucionó y se creó un puesto llamado devOps que fusiona el mundo del desarrollo con el de la administración de sistemas de infraestructura.

De esta forma hemos aprendido a llevar a cabo y crear casos de éxito a nivel de infraestructura en Kubernetes.

Una vez que hayamos llegado a este punto, entraremos en el tema y explicaremos qué es elasticsearch.

¿Qué es Elasticsearch?

Es un motor de búsqueda y análisis. Es muy fácilmente escalable, se puede acceder desde una API. Podemos hacer búsquedas muy rápidas en muchos índices diferentes y filtrar por los datos que queramos.

Es posible implementarlo tanto en un servidor dedicado como en docker o kubernetes.

Un aspecto muy interesante es que se puede desplegar a través de la formación en la nube para que podamos desplegar esta compleja infraestructura mediante código en poco tiempo.

ElasticsearchDomain: 
    Type: AWS::Elasticsearch::Domain
    Properties:
      DomainName: !Sub "${ElasticsearchDomainName}"
      ElasticsearchVersion: "6.2"
      ElasticsearchClusterConfig: 
        InstanceCount: 1
        InstanceType: "m4.large.elasticsearch"
      EBSOptions: 
        EBSEnabled: true
        Iops: 0
        VolumeSize: 10
        VolumeType: "gp2"
      SnapshotOptions: 
        AutomatedSnapshotStartHour: 0

Deployment Link

Pensemos que hemos implementado elasticsearch y cognito en aws y ya está funcionando con la última versión disponible

Ahora sería el momento de que nuestro clúster de kubernetes implemente nuestra pila de registro, dicha pila está formada por logstash y esproxy.

Docker & Networking

Master en crear tus propias aplicaciones desde cero y entender el funcionamiento de docker

docker cristiancasis.com
Comprar Acceso de por vida

Kubernetes in AWS

Aprende todo lo necesario para enterder el funcionamiento y saber como desplegar aplicaciones

amazoneks cristiancasis.com
Comprar Acceso de por vida

Logstash y proxy deployment

Es necesario editar la implementación de es-proxy y agregar las credenciales correctas para que se autentique en cognito

   env:        
        - name: AWS_ACCESS_KEY_ID
          value: "xxxxxxxxxxxxxx"
        - name: AWS_SECRET_ACCESS_KEY
          value: "xxxxxxxxxxxxxxxxxx"
        - name: ENDPOINT
          value: "https://xxxxxxAWS_ELASTICSEARCHxxxxxxx"
        - name: PORT
          value: "443"

Otra opción podría ser crear un VAULT e introducir las credenciales aquí y más tarde introducir el vault en el deployment del es-proxy

Para aplicar esta configuración debemos crear un espacio de nombres y luego aplicar la configuración de los archivos.

$ kubectl create ns logging && kubectl apply -f . -n logging

Antes de aplicar esta configuración es necesario cambiar algunos valores que tenemos en la implementación de logstash:

  • Hosts valor: La ubicación de es-proxy (si está en el mismo espacio de nombres no es necesario indicarlo) =>
  • Index valor: Simplemente escriba el nombre del índice y el patrón
 output {
        elasticsearch {
            hosts => [ "es-proxy.logging:9200"]
            index => "EksCluster{+YYYY.MM.dd}" 
        }

Una vez creado todo esto deberíamos tener la implementación y los pods funcionando correctamente. Como hemos dicho antes, si desea agregar una capa de seguridad, habiendo creado algunas credenciales para la bóveda llamada logstash tendremos que inyectar el vault en el pod de implementación

    annotations:
        vault.hashicorp.com/agent-inject: "true"
        vault.hashicorp.com/agent-inject-status: update
        vault.hashicorp.com/agent-inject-secret-config: secret/logstash
        vault.hashicorp.com/agent-inject-template-config: |
          {{- with secret "secret/logstash" -}}
            export AWS_ACCESS_KEY_ID="{{ .Data.AWS_ACCESS_KEY_ID }}"
            export AWS_SECRET_ACCESS_KEY="{{ .Data.AWS_SECRET_ACCESS_KEY }}"
          {{- end }}
        vault.hashicorp.com/role: logstash

COMÓ DESPLEGAR ELASTICSEARCH EN KUBERNETES