Kubernetes - Monitoraggio

Il monitoraggio è uno dei componenti chiave per la gestione di grandi cluster. Per questo, abbiamo una serie di strumenti.

Monitoraggio con Prometeo

È un sistema di monitoraggio e allerta. È stato costruito su SoundCloud ed è stato reso open source nel 2012. Gestisce molto bene i dati multidimensionali.

Prometheus ha più componenti per partecipare al monitoraggio:

  • Prometheus - È il componente principale che elimina e archivia i dati.

  • Prometheus node explore - Ottiene le matrici a livello di host e le espone a Prometheus.

  • Ranch-eye - è un haproxy ed espone cAdvisor statistiche a Prometeo.

  • Grafana - Visualizzazione dei dati.

  • InfuxDB - Database di serie temporali utilizzato specificamente per memorizzare i dati dal rancher.

  • Prom-ranch-exporter - È una semplice applicazione node.js, che aiuta a interrogare il server Rancher per lo stato dello stack di servizio.

Sematext Docker Agent

Si tratta di un moderno agente di raccolta log, eventi e metriche compatibili con Docker. Funziona come un piccolo contenitore su ogni host Docker e raccoglie log, metriche ed eventi per tutti i nodi e contenitori del cluster. Rileva tutti i contenitori (un pod potrebbe contenere più contenitori) inclusi i contenitori per i servizi principali di Kubernetes, se i servizi principali vengono distribuiti nei contenitori Docker. Dopo la sua distribuzione, tutti i log e le metriche sono immediatamente disponibili fuori dagli schemi.

Distribuzione di agenti sui nodi

Kubernetes fornisce DeamonSet che assicura che i pod vengano aggiunti al cluster.

Configurazione dell'agente Docker SemaText

È configurato tramite variabili di ambiente.

  • Ottieni un account gratuito su apps.sematext.com , se non ne hai già uno.

  • Creare un'app SPM di tipo "Docker" per ottenere il token dell'app SPM. L'app SPM manterrà le metriche e gli eventi sulle prestazioni di Kubernetes.

  • Crea un'app Logsene per ottenere il token dell'app Logsene. L'app Logsene manterrà i tuoi log di Kubernetes.

  • Modificare i valori di LOGSENE_TOKEN e SPM_TOKEN nella definizione DaemonSet come mostrato di seguito.

    • Prendi l'ultimo modello sematext-agent-daemonset.yml (raw plain-text) (mostrato anche sotto).

    • Conservalo da qualche parte sul disco.

    • Sostituisci i segnaposto SPM_TOKEN e LOGSENE_TOKEN con i token dell'app SPM e Logsene.

Crea oggetto 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

Esecuzione di Sematext Agent Docker con kubectl

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

Registro di Kubernetes

I log dei contenitori Kubernetes non sono molto diversi dai log dei contenitori Docker. Tuttavia, gli utenti Kubernetes devono visualizzare i log per i pod distribuiti. Pertanto, è molto utile avere a disposizione informazioni specifiche di Kubernetes per la ricerca nei log, come:

  • Spazio dei nomi Kubernetes
  • Nome del pod Kubernetes
  • Nome del contenitore Kubernetes
  • Nome dell'immagine Docker
  • UID Kubernetes

Utilizzo di ELK Stack e LogSpout

Lo stack ELK include Elasticsearch, Logstash e Kibana. Per raccogliere e inoltrare i log alla piattaforma di registrazione, utilizzeremo LogSpout (sebbene ci siano altre opzioni come FluentD).

Il codice seguente mostra come configurare il cluster ELK su Kubernetes e creare un servizio per 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

Creazione del controller di replica

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

Per Kibana, forniamo l'URL Elasticsearch come variabile di ambiente.

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

L'interfaccia utente di Kibana sarà raggiungibile alla porta del contenitore 5601 e alla corrispondente combinazione host / porta del nodo. Quando inizi, non ci saranno dati in Kibana (che è previsto poiché non hai inviato alcun dato).