Kubernetes FluentBitによるコンテナログ収集の実装

Kubernetes環境におけるFluentBitを使用したコンテナログの収集方法

FluentBitで全コンテナの標準出力ログを収集する

  • FluentBitの設定マニフェストを作成する
---
# FluentBit設定ファイル
apiVersion: v1
kind: ConfigMap
metadata:
  name: log-collector-config
  namespace: log-system
  labels:
    app: fluent-bit
data:
  # サービス設定
  service.conf: |
    [SERVICE]
        Flush         5
        Log_Level     info
        Daemon        off
        Parsers_File  custom-parsers.conf
        HTTP_Server   On
        HTTP_Listen   0.0.0.0
        HTTP_Port     3030

    @INCLUDE input.conf
    @INCLUDE filter.conf
    @INCLUDE output.conf

  # 入力設定
  input.conf: |
    [INPUT]
        Name              tail
        Tag               kubernetes.*
        Path              /var/log/containers/*.log
        Parser            container
        DB                /var/log/fluent_kube.db
        Mem_Buf_Limit     10MB
        Skip_Long_Lines   On
        Refresh_Interval  15
        Rotate_Wait       30

  # フィルター設定
  filter.conf: |
    [FILTER]
        Name                kubernetes
        Match               kubernetes.*
        Kube_URL            https://kubernetes.default.svc:443
        Kube_CA_File        /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        Kube_Token_File     /var/run/secrets/kubernetes.io/serviceaccount/token
        Kube_Tag_Prefix     kubernetes.var.log.containers.
        Merge_Log           On
        Merge_Log_Key       processed_log
        K8S-Logging.Parser  On
        K8S-Logging.Exclude Off
        Labels              On
        Annotations         On

  # 出力設定
  output.conf: |
    [OUTPUT]
        Name            es
        Match           *
        Host            ${ES_HOST}
        Port            ${ES_PORT}
        HTTP_User       admin
        HTTP_Passwd     changeme
        Logstash_Prefix cluster-logs
        Logstash_DateFormat %Y.%m
        Logstash_Format On
        Replace_Dots    On
        Retry_Limit     False
        Include_Tag_Key On
        Tag_Key         log_tag

  # パーサー設定
  custom-parsers.conf: |
    [PARSER]
        Name        nginx_access
        Format      regex
        Regex       ^(?<remote_addr>[^ ]*) - (?<remote_user>[^ ]*) \[(?<time_local>[^\]]*)\] "(?<request>[^"]*)" (?<status>[^ ]*) (?<body_bytes_sent>[^ ]*)(?: "(?<http_referer>[^"]*)" "(?<http_user_agent>[^"]*)")?$
        Time_Key    time_local
        Time_Format %d/%b/%Y:%H:%M:%S %z

    [PARSER]
        Name        container
        Format      json
        Time_Key    time
        Time_Format %Y-%m-%dT%H:%M:%S.%L
        Time_Keep   On

    [PARSER]
        Name        cri
        Format      regex
        Regex       ^(?<timestamp>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<message>.*)$
        Time_Key    timestamp
        Time_Format %Y-%m-%dT%H:%M:%S.%L%z

---
# RBAC ClusterRole設定
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: log-reader-role
  namespace: log-system
rules:
- apiGroups: [""]
  resources:
  - namespaces
  - pods
  - nodes
  verbs: ["get", "list", "watch"]

---
# RBAC ClusterRoleBinding設定
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: log-reader-binding
  namespace: log-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: log-reader-role
subjects:
- kind: ServiceAccount
  name: fluent-bit-sa
  namespace: log-system

---
# ServiceAccount設定
apiVersion: v1
kind: ServiceAccount
metadata:
  name: fluent-bit-sa
  namespace: log-system

---
# DaemonSetデプロイ設定
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log-collector
  namespace: log-system
  labels:
    app: log-collector
    version: v2
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    matchLabels:
      app: log-collector
  template:
    metadata:
      labels:
        app: log-collector
        version: v2
        kubernetes.io/cluster-service: "true"
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "3030"
        prometheus.io/path: /api/v1/metrics/prometheus
    spec:
      containers:
      - name: fluent-bit
        image: fluent/fluent-bit:2.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3030
          name: http
          protocol: TCP
        env:
        - name: ES_HOST
          value: "elasticsearch.logging.svc.cluster.local"
        - name: ES_PORT
          value: "9200"
        resources:
          limits:
            memory: 300Mi
            cpu: 200m
          requests:
            cpu: 100m
            memory: 150Mi
        volumeMounts:
        - name: var-log
          mountPath: /var/log
          readOnly: true
        - name: var-container-logs
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: config-volume
          mountPath: /fluent-bit/etc/
      terminationGracePeriodSeconds: 30
      volumes:
      - name: var-log
        hostPath:
          path: /var/log
          type: Directory
      - name: var-container-logs
        hostPath:
          path: /var/lib/docker/containers
          type: Directory
      - name: config-volume
        configMap:
          name: log-collector-config
      serviceAccountName: fluent-bit-sa
      tolerations:
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      - operator: "Exists"
        effect: "NoExecute"
  • ネームスペースを作成する
$ kubectl create namespace log-system
namespace/log-system created
  • 設定を適用する
$ kubectl apply -f fluentbit-config.yaml
configmap/log-collector-config created
clusterrole.rbac.authorization.k8s.io/log-reader-role created
clusterrolebinding.rbac.authorization.k8s.io/log-reader-binding created
serviceaccount/fluent-bit-sa created
daemonset.apps/log-collector created
  • Podの状態を確認する
$ kubectl get pods -n log-system -o wide
NAME                  READY   STATUS    RESTARTS   AGE   IP              NODE
log-collector-abcde   1/1     Running   0          5m    10.244.1.45     worker-node-1
log-collector-fghij   1/1     Running   0          5m    10.244.2.67     worker-node-2
  • Elasticsearchでインデックスを確認する

インデックスパターン cluster-logs-* を作成し、ログデータが正しく収集されていることを確認する。KibanaのDiscover機能で、各コンテナからの標準出力ログがリアルタイムで表示される。

  • ログ収集の動作テスト

テスト用のPodをデプロイしてログ出力を検証:

$ kubectl run log-test --image=busybox --restart=Never -- nslookup kubernetes.default.svc.cluster.local

KibanaでこのPodのログが正しく収集・表示されていることを確認する。

タグ: Kubernetes FluentBit Elasticsearch logging Container

8月26日 16:54 投稿