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
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
.
Comment envoyer le log-driver
et log-opt
paramètres d'un conteneur Docker dans un pod/déploiement?
kubectl apply
kops
Kubernetes Logging Architecture
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.
Avec DaemonSet, fluentd collecte tous les journaux de conteneur à partir du dossier Host /var/lib/docker/containers
.
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"
}
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>
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 ,
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
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