Kubernetes - monitoramento

O monitoramento é um dos principais componentes para o gerenciamento de grandes clusters. Para isso, temos uma série de ferramentas.

Monitorando com Prometheus

É um sistema de monitoramento e alerta. Ele foi construído no SoundCloud e teve o código aberto em 2012. Ele lida muito bem com os dados multidimensionais.

O Prometheus tem vários componentes para participar do monitoramento -

  • Prometheus - É o componente principal que retira e armazena dados.

  • Prometheus node explore - Obtém as matrizes de nível de host e as expõe ao Prometheus.

  • Ranch-eye - é um haproxy e expõe cAdvisor estatísticas para Prometheus.

  • Grafana - Visualização de dados.

  • InfuxDB - Banco de dados de série temporal usado especificamente para armazenar dados do fazendeiro.

  • Prom-ranch-exporter - É um aplicativo node.js simples, que ajuda a consultar o servidor Rancher sobre o status da pilha de serviço.

Agente Docker Sematext

É um agente moderno de métricas, eventos e coleta de logs que reconhece o Docker. Ele é executado como um pequeno contêiner em cada host Docker e coleta logs, métricas e eventos para todos os nós e contêineres do cluster. Ele descobre todos os contêineres (um pod pode conter vários contêineres), incluindo contêineres para serviços principais do Kubernetes, se os serviços principais forem implantados em contêineres Docker. Após sua implantação, todos os logs e métricas estão imediatamente disponíveis para uso.

Implantando agentes para nós

O Kubernetes fornece DeamonSets, o que garante que os pods sejam adicionados ao cluster.

Configurando o SemaText Docker Agent

Ele é configurado por meio de variáveis ​​de ambiente.

  • Obtenha uma conta gratuita em apps.sematext.com , se ainda não tiver uma.

  • Crie um aplicativo SPM do tipo “Docker” para obter o token de aplicativo SPM. O aplicativo SPM manterá suas métricas e eventos de desempenho do Kubernetes.

  • Crie um aplicativo Logsene para obter o token de aplicativo Logsene. O aplicativo Logsene manterá seus registros do Kubernetes.

  • Edite os valores de LOGSENE_TOKEN e SPM_TOKEN na definição do DaemonSet conforme mostrado abaixo.

    • Pegue o último template sematext-agent-daemonset.yml (texto puro bruto) (também mostrado abaixo).

    • Guarde-o em algum lugar do disco.

    • Substitua os espaços reservados SPM_TOKEN e LOGSENE_TOKEN por seus tokens de aplicativo SPM e Logsene.

Criar 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

Executando o Sematext Agent Docker com kubectl

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

Registro do Kubernetes

Os registros de contêineres do Kubernetes não são muito diferentes dos registros de contêineres do Docker. No entanto, os usuários do Kubernetes precisam visualizar os registros dos pods implantados. Portanto, é muito útil ter informações específicas do Kubernetes disponíveis para pesquisa de registro, como -

  • Namespace Kubernetes
  • Nome do pod Kubernetes
  • Nome do contêiner Kubernetes
  • Nome da imagem do Docker
  • UID do Kubernetes

Usando ELK Stack e LogSpout

A pilha ELK inclui Elasticsearch, Logstash e Kibana. Para coletar e encaminhar os logs para a plataforma de registro, usaremos o LogSpout (embora haja outras opções, como FluentD).

O código a seguir mostra como configurar o cluster ELK no Kubernetes e criar serviço 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

Criando Controlador de Replicação

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 Kibana

Para Kibana, fornecemos a URL Elasticsearch como uma variável de ambiente.

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

A IU do Kibana estará acessível na porta do contêiner 5601 e na combinação de host / porta de nó correspondente. Quando você começar, não haverá nenhum dado no Kibana (o que é esperado, pois você não enviou nenhum dado).