5 steps to set up Fluent Bit DaemonSet to send container logs to CloudWatch Logs on Amazon EKS

มา set up Fluent Bit DaemonSet บน Amazon EKS cluster ให้รวบรวมและส่ง logs จาก containers ไปที่ CloudWatch Logs แบบไว ๆ กันครับ

Prerequisites

:dove: Let’s start!

1. Create a namespace

สร้าง namespace ชื่อ amazon-cloudwatch (ชื่อนี้เท่านั้น เพื่อให้สอดคล้องกับ Fluent Bit template ในข้อ 4.)

export NAMESPACE=amazon-cloudwatch
kubectl create ns $NAMESPACE

2. Configure an IAM role for a service account (IRSA)

สร้าง IAM role for a service account (IRSA) เพื่อให้ CloudWatchAgentServerPolicy permission กับ Fluent Bit (อย่าลืมเปลี่ยน <YOUR_CLUSTER> เป็นชื่อ cluster ของเรา)

export CLUSTER=<YOUR_CLUSTER>
export CLOUDWATCH_AGENT_SERVER_POLICY_ARN=$(aws iam list-policies --query 'Policies[?PolicyName==`CloudWatchAgentServerPolicy`].Arn' --output text)
eksctl create iamserviceaccount \
    --name fluent-bit \
    --namespace $NAMESPACE \
    --cluster $CLUSTER \
    --attach-policy-arn $CLOUDWATCH_AGENT_SERVER_POLICY_ARN \
    --approve \
    --override-existing-serviceaccounts

ตรวจสอบรายละเอียดของ service account ต้องมี role-arn

kubectl -n $NAMESPACE describe sa fluent-bit

Output

Name:                fluent-bit
Namespace:           amazon-cloudwatch
Labels:              app.kubernetes.io/managed-by=eksctl
Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::<YOUR_ACCOUNT_ID>:role/eksctl-<YOUR_CLUSTER>-addon-iamserviceaccount-a-Role1-ABCDEFGHIJKLM
Image pull secrets:  <none>
Mountable secrets:   fluent-bit-token-abc12
Tokens:              fluent-bit-token-abc12
Events:              <none>

3. Create a ConfigMap

สร้าง ConfigMap ชื่อ fluent-bit-cluster-info เพื่อตั้งค่าการทำงานของ Fluent Bit (อย่าลืมเปลี่ยน <YOUR_REGION> เป็น region ของ cluster)

export REGION=<YOUR_REGION>
export FLUENT_BIT_HTTP_PORT='2020'
export FLUENT_BIT_READ_FROM_HEAD='Off'
[[ ${FLUENT_BIT_READ_FROM_HEAD} = 'On' ]] && FLUENT_BIT_READ_FROM_TAIL='Off'|| FLUENT_BIT_READ_FROM_TAIL='On'
[[ -z ${FLUENT_BIT_HTTP_PORT} ]] && FLUENT_BIT_HTTP_SERVER='Off' || FLUENT_BIT_HTTP_SERVER='On'
kubectl -n $NAMESPACE create configmap fluent-bit-cluster-info \
--from-literal=cluster.name=${CLUSTER} \
--from-literal=http.server=${FLUENT_BIT_HTTP_SERVER} \
--from-literal=http.port=${FLUENT_BIT_HTTP_PORT} \
--from-literal=read.head=${FLUENT_BIT_READ_FROM_HEAD} \
--from-literal=read.tail=${FLUENT_BIT_READ_FROM_TAIL} \
--from-literal=logs.region=${REGION}

4. Download and deploy the Fluent Bit daemonset

kubectl -n $NAMESPACE apply -f 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

ตรวจสอบว่ามี pod ชื่อ fluent-bit-* เกิดขึ้น

kubectl -n $NAMESPACE get po

Output

NAME               READY   STATUS    RESTARTS   AGE
fluent-bit-a1b2c   1/1     Running   0          15s

5. Test

ตรวจสอบที่เมนู CloudWatch Log groups จะมี logs ของ cluster เพิ่มเข้ามา 3 groups ดังนี้

ซึ่งสามารถ ​search, filter, analyze logs ตามต้องการได้ที่เมนู Logs Insights

Clean up

# Fluent Bit stack
kubectl -n $NAMESPACE delete -f 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

# IRSA
eksctl delete iamserviceaccount --name fluent-bit --namespace $NAMESPACE --cluster $CLUSTER --wait

# Namespace
kubectl delete ns $NAMESPACE

References:

2 Likes

ดีงามมาก :heart:

1 Like