web-dev-qa-db-fra.com

Comment envoyer des journaux Kubernetes à AWS CloudWatch?

Journaux AWS CloudWatch dans Docker

La définition d'un pilote AWS CloudWatch Logs dans docker se fait avec log-driver=awslogs et log-opt, par exemple -

#!/bin/bash

docker run \
    --log-driver=awslogs \
    --log-opt awslogs-region=eu-central-1 \
    --log-opt awslogs-group=whatever-group \
    --log-opt awslogs-stream=whatever-stream \
    --log-opt awslogs-create-group=true \
    wernight/funbox \
        fortune

Mon problème

Je souhaite utiliser les journaux AWS CloudWatch dans un cluster Kubernetes, où chaque pod contient quelques conteneurs Docker. Chaque déploiement aurait un groupe de journaux distinct et chaque conteneur aurait un flux distinct. Je n'ai pas trouvé de moyen d'envoyer les paramètres de journalisation aux conteneurs Docker via Kubernetes create/apply.

Ma question

Comment envoyer le log-driver et log-opt paramètres d'un conteneur Docker dans un pod/déploiement?

Qu'est-ce que j'ai essayé

18
Adam Matan

D'après ce que je comprends, Kubernetes préfère la journalisation au niveau du cluster au pilote de journalisation Docker.

Nous pourrions utiliser fluentd pour collecter, transformer et pousser les journaux de conteneur vers CloudWatch Logs.

Tout ce dont vous avez besoin est de créer un DaemonSet fluide avec ConfigMap et Secret. Les fichiers peuvent être trouvés dans Github . Il a été testé avec Kubernetes v1.7.5.

Voici quelques explications.

Dans

Avec DaemonSet, fluentd collecte tous les journaux de conteneur à partir du dossier Host /var/lib/docker/containers.

Filtre

fluent-plugin-kubernetes_metadata_filter le plugin charge les métadonnées du pod depuis le serveur API Kubernetes.

L'enregistrement du journal serait comme ceci.

{
    "log": "INFO: 2017/10/02 06:44:13.214543 Discovered remote MAC 62:a1:3d:f6:eb:65 at 62:a1:3d:f6:eb:65(kube-235)\n",
    "stream": "stderr",
    "docker": {
        "container_id": "5b15e87886a7ca5f7ebc73a15aa9091c9c0f880ee2974515749e16710367462c"
    },
    "kubernetes": {
        "container_name": "weave",
        "namespace_name": "kube-system",
        "pod_name": "weave-net-4n4kc",
        "pod_id": "ac4bdfc1-9dc0-11e7-8b62-005056b549b6",
        "labels": {
            "controller-revision-hash": "2720543195",
            "name": "weave-net",
            "pod-template-generation": "1"
        },
        "Host": "kube-234",
        "master_url": "https://10.96.0.1:443/api"
    }
}

Faites quelques tags avec Fluentd record_transformer plugin de filtre.

{
    "log": "...",
    "stream": "stderr",
    "docker": {
        ...
    },
    "kubernetes": {
        ...
    },
    "pod_name": "weave-net-4n4kc",
    "container_name": "weave"
}

En dehors

fluent-plugin-cloudwatch-logs plugin envoyé à AWS CloudWatch Logs.

Avec log_group_name_key et log_stream_name_key la configuration, le groupe de journaux et le nom du flux peuvent être n'importe quel champ de l'enregistrement.

<match kubernetes.**>
  @type cloudwatch_logs
  log_group_name_key pod_name
  log_stream_name_key container_name
  auto_create_stream true
  put_log_events_retry_limit 20
</match>
15
silverfox

Selon kubernate, Kubernetes ne fournit aucune solution de stockage native pour les données de journal, mais vous pouvez intégrer de nombreuses solutions de journalisation existantes dans votre cluster Kubernetes et kubernate architectures de journalisation au niveau du cluster .

Kubernetes ne spécifie pas d'agent de journalisation, mais deux agents de journalisation facultatifs sont fournis avec la version de Kubernetes: Stackdriver Logging pour une utilisation avec Google Cloud Platform et Elasticsearch. Vous pouvez trouver plus d'informations et d'instructions dans les documents dédiés. Les deux utilisent fluentd avec une configuration personnalisée en tant qu'agent sur le nœud.

Image Fluentd pour envoyer également des journaux Kubernetes à CloudWatch, vous pouvez donc l'utiliser pour Déployer ,

4
Manish Jaiswal

Vous pouvez utiliser un graphique Helm pour installer Fluentd:

$ helm install --name my-release incubator/fluentd-cloudwatch

Cela vient de: https://github.com/kubernetes/charts/tree/master/incubator/fluentd-cloudwatch

4
user2707671

Sliverfox a une excellente réponse. Vous n'avez pas besoin de créer votre propre image. Pourrait également utiliser directement l'image docker officielle de fluentd, fluent/fluentd-kubernetes-daemonset: cloudwatch. Le code est activé fluentd-kubernetes-daemonset github .

Vous pouvez remplacer le fluent.conf par défaut par le configmap. Comme ci-dessous dans le ds.yaml, et écrivez votre propre fluent.conf dans configmap.yaml. Pour les fichiers yaml complets, vous pouvez vous référer aux exemples ds.yaml et configmap.yaml que nous avons écrits.

    volumeMounts:
    - name: varlog
      mountPath: /var/log
    - name: varlibdockercontainers
      mountPath: /var/lib/docker/containers
      readOnly: true
    - name: config-volume
      mountPath: /fluentd/etc/
  volumes:
  - name: varlog
    hostPath:
      path: /var/log
  - name: varlibdockercontainers
    hostPath:
      path: /var/lib/docker/containers
  - name: config-volume
    configMap:
      name: fluentd-cw-config
3
CloudStax