Kubernetes: supervisión

El monitoreo es uno de los componentes clave para administrar grandes clústeres. Para ello contamos con una serie de herramientas.

Monitoreo con Prometheus

Es un sistema de vigilancia y alerta. Fue construido en SoundCloud y fue de código abierto en 2012. Maneja muy bien los datos multidimensionales.

Prometheus tiene múltiples componentes para participar en el monitoreo:

  • Prometheus - Es el componente principal que elimina y almacena datos.

  • Prometheus node explore - Obtiene las matrices de nivel de host y las expone a Prometheus.

  • Ranch-eye - es un haproxy y expone cAdvisor estadísticas a Prometheus.

  • Grafana - Visualización de datos.

  • InfuxDB - Base de datos de series de tiempo utilizada específicamente para almacenar datos del ganadero.

  • Prom-ranch-exporter - Es una aplicación simple de node.js, que ayuda a consultar el servidor de Rancher para conocer el estado de la pila de servicio.

Agente de Docker de Sematext

Es un agente moderno de recopilación de registros, eventos y métricas compatible con Docker. Se ejecuta como un contenedor pequeño en cada host de Docker y recopila registros, métricas y eventos para todos los contenedores y nodos del clúster. Descubre todos los contenedores (un pod puede contener varios contenedores), incluidos los contenedores para los servicios centrales de Kubernetes, si los servicios centrales se implementan en contenedores Docker. Después de su implementación, todos los registros y métricas están disponibles de inmediato.

Implementación de agentes en nodos

Kubernetes proporciona DeamonSets, lo que garantiza que se agreguen pods al clúster.

Configuración del agente de Docker de SemaText

Se configura mediante variables de entorno.

  • Obtenga una cuenta gratuita en apps.sematext.com , si aún no tiene una.

  • Cree una aplicación de SPM de tipo "Docker" para obtener el token de la aplicación de SPM. La aplicación SPM contendrá su evento y métricas de rendimiento de Kubernetes.

  • Cree una aplicación Logsene para obtener el token de la aplicación Logsene. La aplicación Logsene mantendrá sus registros de Kubernetes.

  • Edite los valores de LOGSENE_TOKEN y SPM_TOKEN en la definición de DaemonSet como se muestra a continuación.

    • Tome la última plantilla sematext-agent-daemonset.yml (texto plano sin formato) (que también se muestra a continuación).

    • Guárdelo en algún lugar del disco.

    • Reemplace los marcadores de posición SPM_TOKEN y LOGSENE_TOKEN con sus tokens de la aplicación SPM y Logsene.

Crear objeto DaemonSet

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
   name: sematext-agent
spec:
   template:
      metadata:
         labels:
            app: sematext-agent
      spec:
         selector: {}
         dnsPolicy: "ClusterFirst"
         restartPolicy: "Always"
         containers:
         - name: sematext-agent
            image: sematext/sematext-agent-docker:latest
            imagePullPolicy: "Always"
            env:
            - name: SPM_TOKEN
               value: "REPLACE THIS WITH YOUR SPM TOKEN"
            - name: LOGSENE_TOKEN
               value: "REPLACE THIS WITH YOUR LOGSENE TOKEN"
            - name: KUBERNETES
               value: "1"
            volumeMounts:
               - mountPath: /var/run/docker.sock
                  name: docker-sock
               - mountPath: /etc/localtime
                  name: localtime
            volumes:
               - name: docker-sock
                  hostPath:
                     path: /var/run/docker.sock
               - name: localtime
                  hostPath:
                     path: /etc/localtime

Ejecución de Sematext Agent Docker con kubectl

$ kubectl create -f sematext-agent-daemonset.yml
daemonset "sematext-agent-daemonset" created

Registro de Kubernetes

Los registros de contenedores de Kubernetes no son muy diferentes de los registros de contenedores de Docker. Sin embargo, los usuarios de Kubernetes deben ver los registros de los pods implementados. Por lo tanto, es muy útil tener información específica de Kubernetes disponible para la búsqueda de registros, como:

  • Espacio de nombres de Kubernetes
  • Nombre del pod de Kubernetes
  • Nombre del contenedor de Kubernetes
  • Nombre de la imagen de Docker
  • UID de Kubernetes

Uso de ELK Stack y LogSpout

La pila ELK incluye Elasticsearch, Logstash y Kibana. Para recopilar y reenviar los registros a la plataforma de registro, usaremos LogSpout (aunque hay otras opciones como FluentD).

El siguiente código muestra cómo configurar el clúster ELK en Kubernetes y crear un servicio para ElasticSearch:

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

Creación de un controlador de replicación

apiVersion: v1
kind: ReplicationController
metadata:
   name: es
   namespace: elk
   labels:
      component: elasticsearch
spec:
   replicas: 1
   template:
      metadata:
         labels:
            component: elasticsearch
spec:
serviceAccount: elasticsearch
containers:
   - name: es
      securityContext:
      capabilities:
      add:
      - IPC_LOCK
   image: quay.io/pires/docker-elasticsearch-kubernetes:1.7.1-4
   env:
   - name: KUBERNETES_CA_CERTIFICATE_FILE
   value: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
   - name: NAMESPACE
   valueFrom:
      fieldRef:
         fieldPath: metadata.namespace
   - name: "CLUSTER_NAME"
      value: "myesdb"
   - name: "DISCOVERY_SERVICE"
      value: "elasticsearch"
   - name: NODE_MASTER
      value: "true"
   - name: NODE_DATA
      value: "true"
   - name: HTTP_ENABLE
      value: "true"
ports:
- containerPort: 9200
   name: http
   protocol: TCP
- containerPort: 9300
volumeMounts:
- mountPath: /data
   name: storage
volumes:
   - name: storage
      emptyDir: {}

URL de Kibana

Para Kibana, proporcionamos la URL de Elasticsearch como una variable de entorno.

- name: KIBANA_ES_URL
value: "http://elasticsearch.elk.svc.cluster.local:9200"
- name: KUBERNETES_TRUST_CERT
value: "true"

Se podrá acceder a la interfaz de usuario de Kibana en el puerto del contenedor 5601 y la combinación correspondiente de host / puerto de nodo. Cuando comience, no habrá ningún dato en Kibana (lo que se espera ya que no ha enviado ningún dato).