Kubernetes cluster datadog
CLOUD & MANAGED SERVICESAWSKUBERNETESDATADOG
16/01/2019 • Bregt Coenen

Hoe monitor ik mijn Kubernetes cluster met Datadog?

In de afgelopen maanden is Kubernetes een meer volwassen product geworden, en is het opzetten van een cluster een stuk eenvoudiger geworden. Vooral met de officiële release van Amazon Elastic Container Service for Kubernetes (EKS) op Amazon Web Services is nog een grote cloud-provider in staat om met een paar klikken een Kubernetes-cluster aan te bieden.

De complexiteit van het creëren van een Kubernetes cluster is drastisch afgenomen. Maar er zijn nog steeds wel uitdagende taken bij het opzetten van de resources binnen het cluster. De grootste uitdaging voor ons is altijd geweest om te zorgen voor betrouwbaar monitoren en loggen voor de componenten binnen het cluster. Sinds we gemigreerd zijn naar Datadog, zijn er dingen ten goede veranderd. In deze blogpost leren we je hoe je je Kubernetes cluster kunt monitoren met Datadog.

Instellen van Datadog monitoring en logging

Voor deze blogpost gaan we ervan uit dat je een actieve Kubernetes setup hebt en kubectl geconfigureerd hebt. Ons cloud team geeft de voorkeur aan de volgende Kubernetes setup:

  • Amazon Web Services (AWS) als cloudprovider
  • Amazon Elastic Container Service for Kubernetes (EKS), dat beheerde Kubernetes biedt
  • Terraform voor het automatiseren van het proces van het creëren van de vereiste resources binnen het AWS account
    • VPC en netwerkvereisten
    • EKS-cluster
    • Kubernetes worker-knooppunten
  • Datadog voor monitoring en logverzameling
  • en OpsGenie voor waarschuwingen- en incidentenbeheer.

datadog monitoring setup

Natuurlijk ben je vrij om je eigen tools te kiezen. Eén vereiste is echter dat je Datadog moet gebruiken (anders heeft deze hele blogpost niet veel zin). Als je nieuw bent bij Datadog, moet je een Datadog account aanmaken. Je kunt het 14 dagen gratis uitproberen door op hier te klikken en op de knop 'Aan de slag' te drukken. Vul het formulier in en log in op je nieuw aangemaakte organisatie. Tijd om wat hosts toe te voegen!

Kubernetes DaemonSet voor het aanmaken van Datadog agenten

datadog portal

Een Kubernetes DaemonSet zorgt ervoor dat een Docker container waarop de Datadog agent draait, wordt aangemaakt op elke worker node (host) die zich bij het Kubernetes cluster heeft aangesloten. Op deze manier kun je de resources voor alle actieve worker-knooppunten binnen het cluster monitoren. Het YAML bestand specificeert de configuratie voor alle Datadog componenten die we willen inschakelen:

Als je je afvraagt hoe het bestand eruit ziet, dit is het:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: datadog-agent
  namespace: tools
  labels:
    k8s-app: datadog-agent
spec:
  selector:
    matchLabels:
      name: datadog-agent
  template:
    metadata:
      labels:
        name: datadog-agent
    spec:
      #tolerations:
      #- key: node-role.kubernetes.io/master
      #  operator: Exists
      #  effect: NoSchedule
      serviceAccountName: datadog-agent
      containers:
      - image: datadog/agent:latest-jmx
        imagePullPolicy: Always
        name: datadog-agent
        ports:
        - containerPort: 8125
          # hostPort: 8125
          name: dogstatsdport
          protocol: UDP
        - containerPort: 8126
          # hostPort: 8126
          name: traceport
          protocol: TCP
        env:
        - name: DD_API_KEY
          valueFrom:
            secretKeyRef:
              name: datadog
              key: DATADOG_API_KEY
        - name: DD_COLLECT_KUBERNETES_EVENTS
          value: "true"
        - name: DD_LEADER_ELECTION
          value: "true"
        - name: KUBERNETES
          value: "yes"
        - name: DD_PROCESS_AGENT_ENABLED
          value: "true"
        - name: DD_LOGS_ENABLED
          value: "true"
        - name: DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL
          value: "true"
        - name: SD_BACKEND
          value: "docker"
        - name: SD_JMX_ENABLE
          value: "yes"
        - name: DD_KUBERNETES_KUBELET_HOST
          valueFrom:
            fieldRef:
              fieldPath: status.hostIP
        resources:
          requests:
            memory: "400Mi"
            cpu: "200m"
          limits:
            memory: "400Mi"
            cpu: "200m"
        volumeMounts:
        - name: dockersocket
          mountPath: /var/run/docker.sock
        - name: procdir
          mountPath: /host/proc
          readOnly: true
        - name: sys-fs
          mountPath: /host/sys
          readOnly: true
        - name: root-fs
          mountPath: /rootfs
          readOnly: true
        - name: cgroups
          mountPath: /host/sys/fs/cgroup
          readOnly: true
        - name: pointerdir
          mountPath: /opt/datadog-agent/run
        - name: dd-agent-config
          mountPath: /conf.d
        - name: datadog-yaml
          mountPath: /etc/datadog-agent/datadog.yaml
          subPath: datadog.yaml
        livenessProbe:
          exec:
            command:
            - ./probe.sh
          initialDelaySeconds: 60
          periodSeconds: 5
          failureThreshold: 3
          successThreshold: 1
          timeoutSeconds: 3
      volumes:
      - hostPath:
          path: /var/run/docker.sock
        name: dockersocket
      - hostPath:
          path: /proc
        name: procdir
      - hostPath:
          path: /sys/fs/cgroup
        name: cgroups
      - hostPath:
          path: /opt/datadog-agent/run
        name: pointerdir
      - name: sys-fs
        hostPath:
          path: /sys
      - name: root-fs
        hostPath:
          path: /
      - name: datadog-yaml
        configMap:
          name: dd-agent-config
          items:
          - key: datadog-yaml
            path: datadog.yaml

Als geheel ziet het dossier er wat overweldigend uit, dus laten we inzoomen op enkele aspecten.

#tolerations:
#- key: node-role.Kubernetes.io/master
#  operator: Exists
#  effect: NoSchedule

Aangezien we EKS gebruiken, wordt het hoofdvlak onderhouden door AWS. Daarom willen we niet dat Datadog agent pods draaien op de master knooppunten. Haal het commentaar weg als je je master knooppunten wilt monitoren, bijvoorbeeld als je Kops draait.

containers:
- image: Datadog/agent:latest-JMX
  imagePullPolicy: Always
  name: Datadog-agent

Wij gebruiken de JMX-enabled versie van de Datadog agent image, die nodig is voor Kafka en Zookeeper integraties. Als je JMX niet nodig hebt, zou je Datadog/agent:latest moeten gebruiken, aangezien deze image minder resource-intensief is.

We specificeren "imagePullPolicy: Always", zodat we zeker weten dat bij het opstarten, de afbeelding met het label "latest" weer wordt opgehaald. In andere gevallen, wanneer een nieuwe "latest" versie beschikbaar is, zal deze niet opgehaald worden omdat we reeds een image met de tag "latest" beschikbaar hebben op het knooppunt.

env:
- name: DD_API_KEY
  valueFrom:
    secretKeyRef:
      name: Datadog
      key: Datadog_API_KEY

We gebruiken SealedSecrets, die de Datadog API Sleutel opslaat. Het stelt ook de omgevingsvariabele in op de waarde van het Geheim. Als je niet weet hoe je een API Sleutel van Datadog kunt krijgen, dat kun je hier doen. Voer een bruikbare naam in en druk op de "API aanmaken" knop.

- name: DD_LOGS_ENABLED
  value: "true"

Dit zorgt ervoor dat de Datadog logs agent is ingeschakeld.

- name: SD_BACKEND
  value: "Docker"
- name: SD_JMX_ENABLE
  value: "yes"

Dit maakt autodiscovery en JMX mogelijk. Dat is nodig om te zorgen dat onze Zookeeper en Kafka integratie werkt, omdat het JMX zal gebruiken om gegevens te verzamelen. Voor meer informatie over autodiscovery kun je de Datadog docs hier lezen.

resources:
  requests:
    memory: "400Mi"
    cpu: "200m"
  limits:
    memory: "400Mi"
    cpu: "200m"

Na het inschakelen van JMX neemt het geheugengebruik van de container drastisch toe. Als je niet de JMX versie van de afbeelding gebruikt, zou de helft van deze limieten in orde moeten zijn.

        - name: Datadog-yaml
          mountPath: /etc/Datadog-agent/Datadog.yaml
          subPath: Datadog.yaml
…
      - name: Datadog-yaml
        configMap:
          name: dd-agent-config
          items:
          - key: Datadog-yaml
            path: Datadog.yaml

Om een aangepaste configuratie toe te voegen, moeten we het standaard Datadog.yaml configuratiebestand overschrijven. De ConfigMap heeft de volgende inhoud:

apiVersion: v1
kind: ConfigMap
metadata:
  name: datadogtoken
  namespace: tools
data:
  event.tokenKey: "0"
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: dd-agent-config
  namespace: tools
data:
  datadog-yaml: |-
    check_runners: 1
    listeners:
      - name: kubelet
    config_providers:
      - name: kubelet
        polling: true
    tags: tst, kubelet, kubernetes, worker, env:tst, environment:tst, application:kubernetes, location:aws

De eerste ConfigMap met de naam Datadogtoken is nodig om een persistente toestand te hebben wanneer een nieuwe leider wordt gekozen. De inhoud van de dd-agent-config ConfigMap wordt gebruikt om het Datadog.yaml configuratiebestand aan te maken. We specificeren en voegen enkele extra tags toe aan de door de agent verzamelde resources, wat nuttig is om later filters te maken.

livenessProbe:
  exec:
    command:
    - ./probe.sh
  initialDelaySeconds: 60
  periodSeconds: 5
  failureThreshold: 3
  successThreshold: 1
  timeoutSeconds: 3

Wanneer we een Kubernetes cluster hebben met veel knooppunten, hebben we gezien dat containers vast komen te zitten in een CrashLoopBackOff status. Het is daarom een goed idee om een meer geavanceerde gezondheidscontrole uit te voeren om te zien of je containers daadwerkelijk zijn opgestart. Zorg ervoor dat de health checks na 60 minuten beginnen met peilen, dat lijkt de beste waarde te zijn.

Zodra je alle benodigde configuraties in je ConfigMap en DaemonSet bestanden hebt verzameld, kun je de resources aanmaken met je Kubernetes CLI.

kubectl create -f ConfigMap.yaml
kubectl create -f DaemonSet.yaml

Na een paar seconden zou je logs en statistieken moeten gaan zien in de Datadog GUI.

Kijk eens naar de verzamelde gegevens

Datadog heeft een reeks krachtige bewakingsfuncties. De host map geeft een visualisatie van je knooppunten over de AWS beschikbaarheidszones. De kleuren in de kaart geven het relatieve CPU-gebruik voor elk knooppunt weer, waarbij groen een laag niveau van CPU-gebruik weergeeft en oranje een drukkere CPU.

AWS availability zones

Elk knooppunt is zichtbaar in de infrastructuurlijst. Door één van de knooppunten te selecteren worden de details ervan zichtbaar. Je kunt containers bewaken in de containerweergave. Je kunt meer details zien (b.v. grafieken die een trend visualiseren) door een specifieke container te selecteren. Ten slotte kunnen processen afzonderlijk worden gevolgd vanuit de proceslijst, waarbij trends zichtbaar zijn voor elk proces. Dankzij deze verfijnde weergaveniveaus kunnen problemen snel worden opgespoord, wat over het algemeen tot snellere responstijden leidt.

infrastructure list

Alle data is beschikbaar om mooie dashboards te maken en goede monitors om te waarschuwen bij storingen. Het aanmaken van deze monitors kan worden gescript, waardoor het vrij eenvoudig wordt om extra accounts en opstellingen op te zetten. Het is dus niet moeilijk te zien waarom Datadog onmisbaar is in onze oplossingen...

Logging met Datadogs Logs

Datadog Logs is iets minder volwassen dan het monitoring gedeelte, maar het is nog steeds een van onze favoriete logging oplossingen. Het is relatief goedkoop en dezelfde agent kan worden gebruikt voor zowel monitoring als logging.

Monitors - die worden gebruikt om waarschuwingen te activeren - kunnen worden aangemaakt op basis van de loggegevens en loggegevens kunnen ook worden gevisualiseerd in dashboards. Je kunt de logs bekijken door naar hier te navigeren en ze te filteren op container, namespace of pod naam. Het is ook mogelijk om je logs te filteren op label, die je kunt toevoegen aan je Deployment, StatefulSet, etc.

docker monitors

Instellen van extra Datadog integraties

Zoals je hebt gemerkt, levert Datadog standaard al een heleboel gegevens. Extra metriekverzameling en dashboards kunnen echter gemakkelijk worden toegevoegd door integraties toe te voegen. Datadog beweert dat zij meer dan 200 integraties hebben die je kunt inschakelen.

Hier is een lijst van integraties die we gewoonlijk inschakelen op onze clusters:

  • AWS
  • Docker
  • Kubernetes
  • Kafka
  • Zookeeper
  • ElasticSearch
  • OpsGenie

Het installeren van integraties is meestal een zeer eenvoudig proces. Sommige kunnen met één klik worden ingeschakeld, andere vereisen wat extra configuratie. Laten we eens dieper ingaan op het opzetten van enkele van de bovenstaande integraties.

AWS Integratie

Setup

Deze integratie moet zowel aan de kant van Datadog als aan de kant van AWS worden geconfigureerd. Eerst moeten we in AWS een IAM Policy en een AssumeRolePolicy aanmaken om toegang van Datadog tot ons AWS account mogelijk te maken.

AssumeRolePolicy
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::464622532012:root"
  },
  "Action": "sts:AssumeRole",
  "Condition": {
    "StringEquals": {
      "sts:ExternalId": "${var.Datadog_aws_external_id}"
    }
  }
}

De inhoud voor het IAM-beleid is hier te vinden. Koppel beide Beleidsregels aan een IAM Rol met de naam DatadogAWSIntegrationRole. Ga naar de instellingen van je Datadog account en druk op de „+Available" knop onder de AWS integratie. Ga naar het configuratie tabblad, vervang de variabele ${var.Datadog_aws_external_id} in de bovenstaande beleidsregel door de waarde van AWS External ID.

AWS Accounts

Voeg het AWS accountnummer toe, en gebruik voor de rol DatadogAWSIntegrationRole zoals hierboven aangemaakt. Optioneel kunt je tags toevoegen die zullen worden toegevoegd aan alle metrieken verzameld door deze integratie. Beperk aan de linkerkant de selectie tot de AWS-diensten die je gebruikt. Sla tenslotte de integratie op en je AWS integratie (en integratie voor de ingeschakelde AWS Services) zal worden getoond onder "Geïnstalleerd".

Integratie in actie

Wanneer je naar je dashboardlijst gaat, zie je een aantal nieuwe interessante dashboards met nieuwe metrieken die je kunt gebruiken om nieuwe monitors mee te maken, zoals:

  • Database (RDS) geheugengebruik, belasting, CPU, schijfgebruik, verbindingen
  • Aantal beschikbare VPN-tunnels voor een VPN-verbinding
  • Aantal gezonde hosts achter een loadbalancer

dashboards in datadog dashboard list

Docker Integratie

Het inschakelen van de Docker integratie is zo eenvoudig als het drukken op de '+Available' knop. Een "Docker - Overzicht" dashboard is beschikbaar zodra je de integratie inschakelt.

docker integration

Kubernetes integratie

Net zoals de Docker integratie hierboven, is het inschakelen van de Kubernetes integratie eenvoudig met een druk op de „+Available" knop. Een "Kubernetes - Overview" overzicht dashboard is beschikbaar zodra je de integratie inschakelt.

kubernetes integration datadog

Als je alle data voor deze integratie wilt, moet je ervoor zorgen dat kube-state-metrics draait binnen je Kubernetes cluster. Meer informatie hier.

Takeaway

Het doel van dit artikel was om je te laten zien hoe Datadog je meest onmisbare tool kan worden in je monitoring en logging infrastructuur. De installatie is vrij eenvoudig en er kan heel veel informatie worden verzameld en effectief gevisualiseerd.

Als je een goede set monitors kunt maken zodat Datadog waarschuwt in geval van degradatie of verhoogde foutpercentages, kunnen de meeste incidenten worden opgelost nog voordat het echte problemen worden. U kunt de creatie van deze monitors scripten met behulp van de Datadog API, waardoor de setup-tijd van je monitoring en waarschuwingsframework drastisch wordt verkort.

Wilt je meer informatie, of kun je wat hulp gebruiken bij het opzetten van je eigen EKS cluster met Datadog monitoring? Aarzel niet om contact met ons op te nemen!

Bregt Coenen