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.
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
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.
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.
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.
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.
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
- …
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.
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.
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!