14

AWS CloudWatch的日誌在泊塢

設定docker的AWS CloudWatch的日誌驅動器與log-driver=awslogslog-opt完成,例如 -如何將Kubernetes日誌發送到AWS CloudWatch?

#!/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 

我的問題

我想用AWS CloudWatch的日誌在Kubernetes羣集中,每個羣集包含幾個Docker容器。每個部署都有一個單獨的日誌組,每個容器都有一個單獨的流。我找不到通過Kubernetes create/apply將測井參數發送到碼頭集裝箱的方法。

我的問題

我怎麼能發送log-driverlog-opt參數泊塢窗容器中POD /部署?

有什麼我試圖

回答

9

據我瞭解,Kubernetes喜歡集羣層面記錄到日誌泊塢司機。

我們可以使用fluentd來收集,轉換和推送容器日誌到CloudWatch Logs。

您只需要用ConfigMap和Secret創建一個流暢的DaemonSet。文件可以在Github找到。它已經通過了Kubernetes v1.7.5的測試。

以下是一些解釋。

隨着DaemonSet,fluentd從主機文件夾/var/lib/docker/containers收取每個集裝箱日誌。

過濾

fluent-plugin-kubernetes_metadata_filter插件加載從Kubernetes API服務器吊艙的元數據。

日誌記錄會是這樣的。

{ 
    "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" 
    } 
} 

用Fluentd製作一些標籤record_transformer filter插件。

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

fluent-plugin-cloudwatch-logs插件發送到AWS CloudWatch的日誌。

隨着log_group_name_keylog_stream_name_key配置,日誌組和流名稱可以是記錄的任何字段。

<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> 
+0

將會對這種解決保持容器隔離?他們能夠閱讀彼此的日誌嗎? –

+0

是的,它們是相互隔離的。由於卷映射,只有流利的容器才能讀取所有容器的日誌(在主機上)。 – silverfox

4

按kubernate,Kubernetes提供了日誌數據沒有本地存儲解決方案,但你可以在許多現有的日誌解決方案集成到您的Kubernetes集羣和kubernate cluster-level-logging-architectures

Kubernetes未指定日誌記錄代理,但兩個可選日誌代理與Kubernetes版本打包在一起:Stackdriver Logging以與Google Cloud Platform和Elasticsearch結合使用。您可以在專用文檔中找到更多信息和說明。兩者均使用fluentd和自定義配置作爲節點上的代理。

Fluentd圖像發送Kubernetes日誌CloudWatch的,所以你可以用它來Deploy

2

sliverfox有一個偉大的答案。你不必建立你自己的形象。 Coulld也直接使用fluentd官方docker鏡像,fluent/fluentd-kubernetes-daemonset:cloudwatch。代碼在fluentd-kubernetes-daemonset github

你可以用configmap替換默認的fluent.conf。像下面的ds.yaml一樣,在configmap.yaml中編寫你自己的fluent.conf。對於完整的yaml文件,您可以參考我們編寫的示例ds.yamlconfigmap.yaml

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