web-dev-qa-db-ja.com

KubernetesログをAWS CloudWatchに送信する方法は?

DockerのAWS CloudWatch Logs

dockerでAWS CloudWatch Logsドライバーを設定するには、log-driver=awslogsおよびlog-opt、 例えば -

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

私の問題

各ポッドにいくつかのDockerコンテナが含まれるKubernetesクラスターでAWS CloudWatchログを使用したいと思います。各展開には個別のロググループがあり、各コンテナには個別のストリームがあります。 Kubernetes create/applyを介して、ドッキングコンテナにロギングパラメータを送信する方法が見つかりませんでした。

私の質問

log-driverおよびlog-optポッド/デプロイ内のDockerコンテナーへのパラメーター

私が試したもの

  • 各マシンのDockerデーモンに関連するパラメーターを設定します。可能ですが、この方法では、同じマシン上のすべてのコンテナが同じストリームを共有します-したがって、私の場合は無関係です。
  • RTFM for kubectl apply
  • 関連するREADME in kops の読み取り
  • 読み取り Kubernetes Logging Architecture
18
Adam Matan

私が理解していることから、KubernetesはDockerログドライバーよりクラスターレベルのログを好みます。

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 Logsに送信します。

log_group_name_keyおよびlog_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>
15
silverfox

Kubernateごとに、Kubernetesはログデータのネイティブストレージソリューションを提供しませんが、Kubernetesクラスターとkubernate cluster-level-logging-architectures に多くの既存のロギングソリューションを統合できます。

Kubernetesはロギングエージェントを指定しませんが、Kubernetesリリースには2つのオプションのロギングエージェントがパッケージ化されています。GoogleCloud Platformで使用するStackdriver LoggingとElasticsearchです。詳細については、専用のドキュメントを参照してください。どちらも、カスタム構成でfluentdをノード上のエージェントとして使用します。

KubernetesログをCloudWatchに送信するためのFluentdイメージ。これを使用して Deploy

4
Manish Jaiswal

Helmチャートを使用してFluentdをインストールできます。

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

これは: https://github.com/kubernetes/charts/tree/master/incubator/fluentd-cloudwatch

4
user2707671

Sliverfoxには素晴らしい答えがあります。独自のイメージを作成する必要はありません。また、fluentd公式dockerイメージ、fluent/fluentd-kubernetes-daemonset:cloudwatchを直接使用することもできます。コードは fluentd-kubernetes-daemonset github にあります。

デフォルトのfluent.confをconfigmapに置き換えることができます。以下のds.yamlのように、configmap.yamlに独自のfluent.confを記述します。完全なyamlファイルについては、作成した ds.yaml および configmap.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
3
CloudStax