- クラウド技術
Fluent Bitを使用したEKSのログ転送方法について
- #Kubernetes
- #AWS

目次
目的
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