Kubernetes - Surveillance

La surveillance est l'un des éléments clés de la gestion de grands clusters. Pour cela, nous disposons d'un certain nombre d'outils.

Surveillance avec Prometheus

C'est un système de surveillance et d'alerte. Il a été construit à SoundCloud et a été open source en 2012. Il gère très bien les données multidimensionnelles.

Prometheus a plusieurs composants pour participer à la surveillance -

  • Prometheus - C'est le composant principal qui supprime et stocke les données.

  • Prometheus node explore - Obtient les matrices au niveau de l'hôte et les expose à Prometheus.

  • Ranch-eye - est un haproxy et expose cAdvisor stats à Prométhée.

  • Grafana - Visualisation des données.

  • InfuxDB - Base de données de séries chronologiques spécifiquement utilisée pour stocker les données de l'éleveur.

  • Prom-ranch-exporter - C'est une simple application node.js, qui aide à interroger le serveur Rancher pour l'état de la pile de service.

Agent Docker Sematext

Il s'agit d'un agent de collecte de journaux, d'événements et de mesures modernes prenant en charge Docker. Il fonctionne comme un petit conteneur sur chaque hôte Docker et collecte des journaux, des métriques et des événements pour tous les nœuds et conteneurs de cluster. Il découvre tous les conteneurs (un pod peut contenir plusieurs conteneurs), y compris les conteneurs pour les services principaux de Kubernetes, si les services principaux sont déployés dans des conteneurs Docker. Après son déploiement, tous les journaux et métriques sont immédiatement disponibles prêts à l'emploi.

Déploiement d'agents sur des nœuds

Kubernetes fournit des DeamonSets qui garantissent l'ajout de pods au cluster.

Configuration de l'agent Docker SemaText

Il est configuré via des variables d'environnement.

  • Créez un compte gratuit sur apps.sematext.com , si vous n'en avez pas déjà un.

  • Créez une application SPM de type «Docker» pour obtenir le jeton d'application SPM. L'application SPM contiendra vos métriques de performances et événements Kubernetes.

  • Créez une application Logsene pour obtenir le jeton d'application Logsene. L'application Logsene conservera vos journaux Kubernetes.

  • Modifiez les valeurs de LOGSENE_TOKEN et SPM_TOKEN dans la définition DaemonSet comme indiqué ci-dessous.

    • Prenez le dernier modèle sematext-agent-daemonset.yml (texte brut brut) (également illustré ci-dessous).

    • Stockez-le quelque part sur le disque.

    • Remplacez les espaces réservés SPM_TOKEN et LOGSENE_TOKEN par vos jetons SPM et Logsene App.

Créer un objet 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

Exécuter le Docker de l'agent Sematext avec kubectl

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

Journal Kubernetes

Les journaux des conteneurs Kubernetes ne sont pas très différents des journaux des conteneurs Docker. Cependant, les utilisateurs de Kubernetes doivent afficher les journaux des pods déployés. Par conséquent, il est très utile de disposer d'informations spécifiques à Kubernetes pour la recherche dans les journaux, telles que -

  • Espace de noms Kubernetes
  • Nom du pod Kubernetes
  • Nom du conteneur Kubernetes
  • Nom de l'image Docker
  • UID Kubernetes

Utilisation d'ELK Stack et LogSpout

La pile ELK comprend Elasticsearch, Logstash et Kibana. Pour collecter et transmettre les journaux à la plate-forme de journalisation, nous utiliserons LogSpout (bien qu'il existe d'autres options telles que FluentD).

Le code suivant montre comment configurer le cluster ELK sur Kubernetes et créer un service pour 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

Création du contrôleur de réplication

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

Pour Kibana, nous fournissons l'URL Elasticsearch en tant que variable d'environnement.

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

L'interface utilisateur de Kibana sera accessible au port de conteneur 5601 et à la combinaison hôte / port de nœud correspondante. Lorsque vous commencez, il n'y aura aucune donnée dans Kibana (ce qui est attendu car vous n'avez poussé aucune donnée).