Fluent Bitを使用したEKSのログ転送方法について

目的

EKSにデプロイしたアプリケーションでエラーが発生してPodが落ちた場合に
ログ確認できなくなってしまうので、fluent-bitを使用しログをCloudWatchに
転送してPod消滅後もログを確認できるようにする。

前提

・EKSが作成済みであること
・kubectlコマンドが実行可能であること

以下、kubectlコマンドが実行可能な端末で作業する。

fluent-bitのname spaceを作成する。

kubectl create namespace amazon-cloudwatch

fluent-bitのconfigファイルを作成する。

作成ファイル:fluent-bit-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-cluster-info
  namespace: amazon-cloudwatch
data:
  cluster.name: 'kubernetes' # クラスター名
  http.server: 'On'
  http.port: '2020'
  read.head: 'Off'
  read.tail: 'On'
  logs.region: 'ap-northeast-1' # 作成するリージョン

※クラスター名、作成するリージョンは自分の環境に合わせて変更する

fluent-bitのconfigファイルをkubectlコマンドでデプロイする。

kubectl apply -f fluent-bit-config.yaml

fluent-bitのファイルを取得する。

https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit.yaml
※2021/11時点では上記ですが、URLが変更になっている可能性があります。

取得したfluent-bitファイルを編集する。

今回はアプリのログだけ取得できればいいので、nodeの情報等不要なログ転送部分は削除する

作成ファイル:fluent-bit.yaml

不要な部分削除は以下のようになる。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: fluent-bit
  namespace: amazon-cloudwatch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: fluent-bit-role
rules:
  - nonResourceURLs:
      - /metrics
    verbs:
      - get
  - apiGroups: [""]
    resources:
      - namespaces
      - pods
      - pods/logs
    verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: fluent-bit-role-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: fluent-bit-role
subjects:
  - kind: ServiceAccount
    name: fluent-bit
    namespace: amazon-cloudwatch
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-config
  namespace: amazon-cloudwatch
  labels:
    k8s-app: fluent-bit
data:
  fluent-bit.conf: |
    [SERVICE]
        Flush                     5
        Log_Level                 info
        Daemon                    off
        Parsers_File              parsers.conf
        HTTP_Server               ${HTTP_SERVER}
        HTTP_Listen               0.0.0.0
        HTTP_Port                 ${HTTP_PORT}
        storage.path              /var/fluent-bit/state/flb-storage/
        storage.sync              normal
        storage.checksum          off
        storage.backlog.mem_limit 5M
        
    @INCLUDE application-log.conf
  
  application-log.conf: |
    [INPUT]
        Name                tail
        Tag                 application.*
        Exclude_Path        /var/log/containers/cloudwatch-agent*, /var/log/containers/fluent-bit*, /var/log/containers/aws-node*, /var/log/containers/kube-proxy*
        Path                /var/log/containers/*.log
        Docker_Mode         On
        Docker_Mode_Flush   5
        Docker_Mode_Parser  container_firstline
        Parser              docker
        DB                  /var/fluent-bit/state/flb_container.db
        Mem_Buf_Limit       50MB
        Skip_Long_Lines     On
        Refresh_Interval    10
        Rotate_Wait         30
        storage.type        filesystem
        Read_from_Head      ${READ_FROM_HEAD}

    [FILTER]
        Name                kubernetes
        Match               application.*
        Kube_URL            https://kubernetes.default.svc:443
        Kube_Tag_Prefix     application.var.log.containers.
        Merge_Log           On
        Merge_Log_Key       log_processed
        K8S-Logging.Parser  On
        K8S-Logging.Exclude Off
        Labels              Off
        Annotations         Off

    [OUTPUT]
        Name                cloudwatch_logs
        Match               application.*
        region              ${AWS_REGION}
        log_group_name      /aws/containerinsights/${CLUSTER_NAME}/application
        log_stream_prefix   ${HOST_NAME}-
        auto_create_group   true
        extra_user_agent    container-insights

  parsers.conf: |
    [PARSER]
        Name                docker
        Format              json
        Time_Key            time
        Time_Format         %Y-%m-%dT%H:%M:%S.%LZ

    [PARSER]
        Name                syslog
        Format              regex
        Regex               ^(?

※resourcesのlimits、requestsの値も修正これは自分の環境に合わせて修正する必要あり。

fluent-bitファイルをkubectlコマンドでデプロイする。

kubectl apply -f fluent-bit.yaml

AWSコンソールでCloudWatchロググループが作成される。

作成されるロググループは「/aws/containerinsights/クラスター名/application」となる

今回の場合は以下
/aws/containerinsights/kubernetes/application

Smallitのサービス