Afin d’exécuter les commandes de dépannage pour l’Agent de cluster, vous devez d’abord accéder au pod de l’Agent de cluster ou de l’Agent de nœud. Pour ce faire, utilisez la commande suivante :

kubectl exec -it <NOM_POD_AGENT_CLUSTER_DATADOG> bash

Agent de cluster Datadog

Pour afficher les métadonnées de cluster envoyées par l’Agent de cluster Datadog, accédez au pod via la commande exec puis exécutez :

datadog-cluster-agent metamap

Le résultat suivant devrait s’afficher :

root@datadog-cluster-agent-8568545574-x9tc9:/# datadog-cluster-agent metamap

===============
Metadata Mapper
===============

Node detected: gke-test-default-pool-068cb9c0-sf1w

  - Namespace: kube-system
      - Pod: kube-dns-788979dc8f-hzbj5
        Services: [kube-dns]
      - Pod: kube-state-metrics-5587867c9f-xllnm
        Services: [kube-state-metrics]
      - Pod: kubernetes-dashboard-598d75cb96-5khmj
        Services: [kubernetes-dashboard]

Node detected: gke-test-default-pool-068cb9c0-wntj

  - Namespace: default
      - Pod: datadog-cluster-agent-8568545574-x9tc9
        Services: [datadog-custom-metrics-server dca]

  - Namespace: kube-system
      - Pod: heapster-v1.5.2-6d59ff54cf-g7q4h
        Services: [heapster]
      - Pod: kube-dns-788979dc8f-q9qkt
        Services: [kube-dns]
      - Pod: l7-default-backend-5d5b9874d5-b2lts
        Services: [default-http-backend]
      - Pod: metrics-server-v0.2.1-7486f5bd67-v827f
        Services: [metrics-server]

Pour vérifier que l’Agent de cluster Datadog est interrogé, recherchez :

root@datadog-cluster-agent-8568545574-x9tc9:/# tail -f /var/log/datadog/cluster-agent.log
2018-06-11 09:37:20 UTC | DEBUG | (metadata.go:40 in GetPodMetadataNames) | CacheKey: agent/KubernetesMetadataMapping/ip-192-168-226-77.ec2.internal, with 1 services
2018-06-11 09:37:20 UTC | DEBUG | (metadata.go:40 in GetPodMetadataNames) | CacheKey: agent/KubernetesMetadataMapping/ip-192-168-226-77.ec2.internal, with 1 services

Si vous ne recueillez pas correctement les événements, assurez-vous de définir les variables d’environnement suivantes sur true :

  • Élection de leader : DD_LEADER_ELECTION
  • Collecte d’événements : DD_COLLECT_KUBERNETES_EVENTS

Ainsi que les verbes adéquats spécifiés dans les règles RBAC (en particulier, watch events).

Si vous les avez activés, vérifiez le statut d’élection du leader et le check kube_apiserver à l’aide de la commande suivante :

datadog-cluster-agent status

On obtient alors le résultat suivant :

root@datadog-cluster-agent-8568545574-x9tc9:/# datadog-cluster-agent status
[...]
  Leader Election
  ===============
    Leader Election Status:  Running
    Leader Name is: datadog-cluster-agent-8568545574-x9tc9
    Last Acquisition of the lease: Mon, 11 Jun 2018 06:38:53 UTC
    Renewed leadership: Mon, 11 Jun 2018 09:41:34 UTC
    Number of leader transitions: 2 transitions
[...]
  Running Checks
  ==============
    kubernetes_apiserver
    --------------------
      Total Runs: 736
      Metrics: 0, Total Metrics: 0
      Events: 0, Total Events: 100
      Service Checks: 3, Total Service Checks: 2193
[...]

Agent de nœud

Vous pouvez vérifier le statut de l’Agent de cluster Datadog en exécutant la commande status de l’Agent : datadog-agent status

Si l’Agent de cluster Datadog est activé et correctement configuré, vous devriez voir ce qui suit :

[...]
 =====================
 Datadog Cluster Agent
 =====================
   - Datadog Cluster Agent endpoint detected: https://XXX.XXX.XXX.XXX:5005
   Successfully Connected to the Datadog Cluster Agent.
   - Running: {Major:1 Minor:0 Pre:xxx Meta:xxx Commit:xxxxx}

Veillez à ce que le service de l’Agent de cluster soit créé avant les pods de l’Agent de manière à ce que le DNS soit disponible dans les variables d’environnement :

root@datadog-agent-9d5bl:/# env | grep DATADOG_CLUSTER_AGENT | sort
DATADOG_CLUSTER_AGENT_SERVICE_PORT=5005
DATADOG_CLUSTER_AGENT_SERVICE_HOST=10.100.202.234
DATADOG_CLUSTER_AGENT_PORT_5005_TCP_PORT=5005
DATADOG_CLUSTER_AGENT_PORT=tcp://10.100.202.234:5005
DATADOG_CLUSTER_AGENT_PORT_5005_TCP=tcp://10.100.202.234:5005
DATADOG_CLUSTER_AGENTPORT_5005_TCP_PROTO=tcp
DATADOG_CLUSTER_AGENT_PORT_5005_TCP_ADDR=10.100.202.234

root@datadog-agent-9d5bl:/# echo ${DD_CLUSTER_AGENT_AUTH_TOKEN}
DD_CLUSTER_AGENT_AUTH_TOKEN=1234****9

Vérifiez que l’Agent de nœud utilise l’Agent de cluster Datadog comme fournisseur de tags :

root@datadog-agent-9d5bl:/# cat /var/log/datadog/agent.log | grep "metadata-collector"
2018-06-11 06:59:02 UTC | INFO | (tagger.go:151 in tryCollectors) | kube-metadata-collector tag collector successfully started

Ou recherchez des logs d’erreur, par exemple :

2018-06-10 08:03:02 UTC | ERROR | Could not initialize the communication with the Datadog Cluster Agent, falling back to local service mapping: [...]

Serveur de métriques custom

Commandes status et flare de l’Agent de cluster

Si vous rencontrez des difficultés avec votre serveur de métriques custom :

  • Vérifiez que la couche agrégation et les certificats sont bien configurés.

  • Assurez-vous que les métriques utilisées pour l’autoscaling sont disponibles. Lorsque vous créez le HPA (Horizontal Pod Autoscaler), l’Agent de cluster Datadog analyse le manifeste et envoie une requête à Datadog pour tenter de récupérer la métrique. Si le nom de la métrique n’est pas correct ou que la métrique n’existe pas dans votre application Datadog, l’erreur suivante est générée :

    2018-07-03 13:47:56 UTC | ERROR | (datadogexternal.go:45 in queryDatadogExternal) | Returned series slice empty
    

Exécutez la commande datadog-cluster-agent status pour afficher le statut du fournisseur de métriques externes :

  Custom Metrics Provider
  =======================
  External Metrics
  ================
    ConfigMap name: datadog-hpa
    Number of external metrics detected: 2

Les erreurs liées au fournisseur de métriques externes s’affichent lorsque vous exécutez cette commande. Si vous souhaitez obtenir des informations plus détaillées, exécutez la commande flare : datadog-cluster-agent flare.

La commande flare génère un fichier zip contenant le fichier custom-metrics-provider.log. Son contenu ressemble à ceci :

  Custom Metrics Provider
  =======================
  External Metrics
  ================
    ConfigMap name: datadog-hpa
    Number of external metrics detected: 2

    hpa:
    - name: nginxext
    - namespace: default
    labels:
    - cluster: eks
    metricName: redis.key
    ts: 1532042322
    valid: false
    value: 0

    hpa:
    - name: nginxext
    - namespace: default
    labels:
    - dcos_version: 1.9.4
    metricName: docker.mem.limit
    ts: 1.532042322
    valid: true
    value: 268435456

Si le flag de la métrique Valid est défini sur false, la métrique n’est pas prise en compte dans le pipeline de l’Autoscaler de pods horizontaux.

Description du manifeste du HPA

Si le message suivant apparaît lors de la description du manifeste du HPA :

Conditions:
  Type           Status  Reason                   Message
  ----           ------  ------                   -------
  AbleToScale    True    SucceededGetScale        the HPA controller was able to get the target's current scale
  ScalingActive  False   FailedGetExternalMetric  the HPA was unable to compute the replica count: unable to get external metric default/nginx.net.request_per_s/&LabelSelector{MatchLabels:map[string]string{kube_container_name: nginx,},MatchExpressions:[],}: unable to fetch metrics from external metrics API: the server could not find the requested resource (get nginx.net.request_per_s.external.metrics.k8s.io)

Alors la configuration RBAC pour le HPA n’est probablement pas correcte. Assurez-vous que kubectl api-versions renvoie ceci :

autoscaling/v2beta1
[...]
external.metrics.k8s.io/v1beta1

Cette dernière ligne s’affiche si l’Agent de cluster Datadog est bien identifié en tant que fournisseur de métriques externes, et si le nom de service spécifié dans APIService pour le fournisseur de métriques externes est identique à celui du service qui expose l’Agent de cluster Datadog sur le port 443. Assurez-vous également que vous avez créé les règles RBAC à l’étape Enregistrer le fournisseur de métriques externes.

Si l’erreur suivante s’affiche lorsque vous inspectez le manifeste du HPA :

Warning  FailedComputeMetricsReplicas  3s (x2 over 33s)  horizontal-pod-autoscaler  failed to get nginx.net.request_per_s external metric: unable to get external metric default/nginx.net.request_per_s/&LabelSelector{MatchLabels:map[string]string{kube_container_name: nginx,},MatchExpressions:[],}: unable to fetch metrics from external metrics API: the server is currently unable to handle the request (get nginx.net.request_per_s.external.metrics.k8s.io)

Assurez-vous que l’Agent de cluster Datadog est en cours d’exécution et que le service qui expose le port 443 (dont le nom est enregistré dans APIService) est disponible.

Différences de valeurs dans Datadog et dans Kubernetes

Lorsque Kubernetes procède à l’autoscaling de vos ressources, la cible actuelle est pondérée en fonction du nombre de réplicas du déploiement mis à l’échelle. La valeur renvoyée par l’Agent de cluster Datadog est récupérée auprès de Datadog et doit être proportionnellement égale à la cible actuelle multipliée par le nombre de réplicas.

Exemple :

    hpa:
    - name: nginxext
    - namespace: default
    labels:
    - app: puppet
    - env: demo
    metricName: nginx.net.request_per_s
    ts: 1532042322
    valid: true
    value: 2472

L’Agent de cluster a récupéré la valeur 2472, mais le HPA indique :

NAMESPACE   NAME       REFERENCE          TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
default     nginxext   Deployment/nginx   824/9 (avg)   1         3         3          41m

En effet, 824 * 3 réplicas = 2472.

Remarque : par défaut, l’Agent de cluster Datadog traite les métriques définies dans les différents manifestes du HPA et récupère les valeurs auprès de Datadog toutes les 30 secondes. De même, Kubernetes interroge l’Agent de cluster Datadog toutes les 30 secondes par défaut. Ce processus étant effectué de manière asynchrone, la règle ci-dessus ne s’applique pas systématiquement, en particulier si la métrique varie. Les deux fréquences sont toutefois paramétrables afin de limiter les problèmes éventuels.

Pour aller plus loin