amazon-web-services - prices - aws task pricing
¿Cómo enviar registros de Kubernetes a AWS CloudWatch? (4)
AWS CloudWatch Registra en Docker
La configuración de un controlador AWS CloudWatch Logs en la docker
se realiza con log-driver=awslogs
y log-opt
, por ejemplo:
#!/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
Mi problema
Me gustaría usar los registros de AWS CloudWatch en un clúster Kubernetes, donde cada pod contiene algunos contenedores Docker. Cada implementación tendría un grupo de registro independiente y cada contenedor tendría una secuencia separada. No pude encontrar una forma de enviar / apply
los parámetros de registro a los contenedores de la ventana acoplable mediante Kubernetes.
Mi pregunta
¿Cómo puedo enviar los parámetros log-driver
y log-opt
a un contenedor Docker en un pod / implementación?
Que he intentado
- Configuración de parámetros relevantes para el demonio Docker en cada máquina. Es posible, pero de esta manera todos los contenedores en la misma máquina compartirían el mismo flujo, por lo tanto irrelevante para mi caso.
- RTFM para
kubectl apply
- Leyendo el README relevante en
kops
- Leer
Kubernetes Logging Architecture
Por lo que entiendo, Kubernetes prefiere el registro a nivel de clúster al controlador de registro de Docker.
Podríamos usar fluentd para recopilar, transformar y enviar registros de contenedor a los registros de CloudWatch.
Todo lo que necesita es crear un DaemonSet fluido con ConfigMap y Secret. Los archivos se pueden encontrar en Github . Se ha probado con Kubernetes v1.7.5.
Los siguientes son algunos explicaciones.
En
Con DaemonSet, fluentd recopila todos los registros de contenedores de la carpeta de host /var/lib/docker/containers
.
Filtrar
fluent-plugin-kubernetes_metadata_filter plugin carga los metadatos del pod desde el servidor de API de Kubernetes.
El registro de registro sería así.
{
"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"
}
}
Haga algunas etiquetas con el record_transformer filtro Fluentd record_transformer .
{
"log": "...",
"stream": "stderr",
"docker": {
...
},
"kubernetes": {
...
},
"pod_name": "weave-net-4n4kc",
"container_name": "weave"
}
Afuera
fluent-plugin-cloudwatch-logs plugin enviado a AWS CloudWatch Logs.
Con la configuración log_group_name_key
y log_stream_name_key
, el grupo de registro y el nombre de la secuencia pueden ser cualquier campo del registro.
<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>
Puedes usar un gráfico de timón para instalar Fluentd:
$ helm install --name my-release incubator/fluentd-cloudwatch
Esto es de: https://github.com/kubernetes/charts/tree/master/incubator/fluentd-cloudwatch
Según kubernate, Kubernetes no proporciona una solución de almacenamiento nativa para los datos de registro, pero puede integrar muchas soluciones de registro existentes en su arquitectura de registro de cluster-level-logging-architectures Kubernetes y kubernate.
Kubernetes no especifica un agente de registro, pero dos agentes de registro opcionales están empaquetados con el lanzamiento de Kubernetes: Stackdriver Logging para su uso con Google Cloud Platform y Elasticsearch. Puede encontrar más información e instrucciones en los documentos dedicados. Ambos utilizan fluentd con configuración personalizada como agente en el nodo.
Fluentd imagen para enviar registros de Kubernetes a CloudWatch también, por lo que puede utilizar para Deploy ,
Sliverfox tiene una gran respuesta. No tienes que construir tu propia imagen. También se puede usar directamente la imagen oficial de la ventana acoplable fluentd, fluentd / kuentetes-daemonset: cloudwatch. El código está en fluentd-kubernetes-daemonset github .
Podría reemplazar el fluent.conf predeterminado con el mapa de configuración. Como a continuación en ds.yaml, y escriba su propio fluent.conf en configmap.yaml. Para obtener los archivos yaml completos, puede consultar los ejemplos ds.yaml y configmap.yaml que escribimos.
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