Image by Valdas Miskinis from Pixabay

Wenn man einen Kubernetes Cluster aufbaut, kommt man irgendwann zu der Situation, das man gerne alle Logs von allen Containern an einem Ort haben möchte.

via GIPHY

Für diese Aufgabe gibt es verschiedene Möglichkeiten. Ich setze aber immer Graylog ein und das benötigt immer einen Elasticsearch Stack. Nun hat der mich aber vor 2 Herausforderungen gestellt:

  1. Zugriffsrechte im Datenordner haben nicht gepasst und dadurch konnte nichts geschrieben werden.
  2. vm.max_map_count war zu niedrig gesetzt

Für den Punkt 2 muss ich noch folgendes ergänzen: Das Kubernetes wurde auf m5.xlarge Instanzen auf AWS aufgesetzt. Das heißt, die Problematik könnte auch nur damit zu tun haben.

Die folgende Lösung hat mir dann aber letztendlich geholfen und hat mir beide Probleme gelöst:

InitContainers

InitContainers sind Container die vor dem Start des eigentlichen Hauptcontainers gestartet werden, - also bei der Initialisierung.

apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
  labels:
    ...
  name: graylog-elasticsearch
  namespace: graylog
spec:
  podManagementPolicy: Parallel
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    ...
  serviceName: graylog-elasticsearch
  template:
    metadata:
      ...
    spec:
      affinity:
        ...
      containers:
        ...
      initContainers:
      - name: init-sysctl
        image: busybox
        command:
        - sysctl
        - -w
        - vm.max_map_count=262144
        securityContext:
          privileged: true
      - name: fix-the-volume-permission
        image: busybox
        command:
        - sh
        - -c
        - chown -R 1000:1000 /usr/share/elasticsearch/data
        volumeMounts:
        - mountPath: /usr/share/elasticsearch/data
          name: elasticsearch-persistent-storage
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 10
  updateStrategy:
    type: OnDelete
  volumeClaimTemplates:
    ...

Der erst InitContainer hat als Image "busybox". Das ist ein kleines Betriebssystem, welches nur das Nötigste mitbringt. Der Container muss im "privileged" Mode ausgeführt werden. Das heißt, er darf Systemressourcen des Hostsystems ändern. Das sollte man natürlich nur mit Vorsicht machen.

via GIPHY

Der zweite InitContainer baut auch auf "busybox" auf und setzt mit den "chown" Befehl die Recht des Ordners "/usr/share/elasticsearch/data" um.

Nachdem die Container initialisiert sind, startet der Hauptcontainer und alles funktioniert wie erwartet.

Tags