K8S 7: Setup EFK Stack on EKS/GCP cluster (ElasticSearch, Fluentd, Kibana)

Xây dựng hệ thống logging EFK stack

Table of Contents

Yêu cầu

Đã cài đặt eksctl, kubectl

Cách làm

git clone https://github.com/hoangmnsd/kubernetes-series
cd kubernetes-series/efk-stack

1. Tạo cluster

1.1. eks

trên eks phải tạo cluster bằng file này cluster-efk.yaml

có thể đổi tên cluster, tạo thêm node, đổi type của node trong file đó, nhưng nên chọn 1 node có 4vCPU, >8GB (t2.xlarge), đã test trường hợp sử dụng t2.large (2 vCPU, 8 GB Mem) cũng ok

eksctl create cluster -f cluster-efk.yaml

1.2. gcp

trên gcp thì tạo cluster bằng console, mình đã chọn loại N1 standard 4 (4vCPU,15GB memory), chưa test loại khác

2. Tạo namespace

kubectl create -f kube-logging.yaml

3. Tạo service ElasticSearch

kubectl create -f elasticsearch_svc.yaml

4. Tạo statefulset ElasticSearch

có vài chỗ nên sửa trước khi tạo

cụ thể là xem file này elasticsearch_statefulset.yaml

nano elasticsearch_statefulset.yaml

■ sửa tên của cluster đang dùng, nếu bạn đang dùng cluster name khác thì nên sửa giá trị efk-stack

env:
          - name: cluster.name
            value: efk-stack

■ sửa namespace của volume mà mình sẽ sử dụng, ở đây mình dùng namespace “default”
■ sửa storageClass của volume mình sẽ sử dụng, ở đây mình dùng “gp2”:

  • nếu đang dùng cluster trên eks thì volume ở namespace “default” là “gp2”
  • nếu đang dùng cluster trên gcp thì volume ở namespace “default” là “standard”
  • nếu đang dùng cluster trên DigitalOcean thì volume ở namespace “default” là “do-block-storage”

■ sửa dung lượng của storage nếu đang muốn test thì dùng 5-10GB thôi cho tiết kiệm, ở đây mình dùng “10Gi”

volumeClaimTemplates:
  - metadata:
      name: data
      namespace: default
      labels:
        app: elasticsearch
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: gp2
      resources:
        requests:
          storage: 10Gi

Ngoài ra còn các thông số khác, xem kỹ để nếu muốn thay đổi
sửa xong hết thì mới tạo statefulset bằng command sau:

kubectl create -f elasticsearch_statefulset.yaml  

dùng command sau để kiểm tra pod đã tạo hết chưa

kubectl describe pod <POD_NAME>

Nếu bị lỗi pod has unbound immediate PersistentVolumeClaims thì cần phải fix, thử những command sau:

kubectl get storageclass --all-namespaces
kubectl get pvc --all-namespaces

Nếu có cái nào cứ ở trạng thái pending mãi thì nên xóa nó đi,

kubectl delete pvc <PVC_NAME> -n <NAME_SPACE>

rồi chạy lại các command

kubectl delete -f elasticsearch_statefulset.yaml
kubectl create -f elasticsearch_statefulset.yaml

Nếu tất cả pod elasticsearch đều lên Running nghĩa là ok

[ec2-user@ip-172-31-84-250 efk-stack]$ kubectl get pods -A
NAMESPACE      NAME                       READY   STATUS    RESTARTS   AGE
kube-logging   es-cluster-0               1/1     Running   0          2m6s
kube-logging   es-cluster-1               1/1     Running   0          85s
kube-logging   es-cluster-2               1/1     Running   0          43s
kube-system    aws-node-j28lc             1/1     Running   0          14m
kube-system    aws-node-n87zk             1/1     Running   0          14m
kube-system    coredns-8455f84f99-2cjf8   1/1     Running   0          20m
kube-system    coredns-8455f84f99-p7fv9   1/1     Running   0          20m
kube-system    kube-proxy-dm77l           1/1     Running   0          14m
kube-system    kube-proxy-nfqgn           1/1     Running   0          14m

4.1. (Optional) kiểm tra ElasticSearch bằng port-forward

4.1.a. Trên eks

kubectl port-forward es-cluster-0 9200:9200 --namespace=kube-logging --address 0.0.0.0

rồi trên trình duyệt vào http://<EC2-PUBLIC-IP>:9200 để check
Chú ý Mở Security Group cho port 9200
Nếu trả về 1 chuỗi JSON có chứa “You know, For Search” nghĩa là ok

4.1.b. Trên gcp

muốn check phải edit service thành NodePort rồi mới port-forward được

kubectl edit service <ELASTIC_SVC> -n kube-logging

muốn check NodePort đang sử dụng là port bao nhiêu thì:

kubectl describe svc <ELASTIC_SVC> -n kube-logging

edit xong thì port-forward:

kubectl port-forward -n kube-logging service/<ELASTICSEARCH_SVC> <NODEPORT>:9200 --address 0.0.0.0

Lấy external IP của Node

kubectl get nodes --output wide

rồi trên trình duyệt vào http://<EXTERNAL-IP>:<NODOE_PORT> để check
Chú ý Mở Firewall cho <NODE_PORT>:

gcloud compute firewall-rules create elasticsearch-node-port --allow tcp:<NODE_PORT>
# If rules exist you need to using `update` instead of `create`

Nếu trả về 1 chuỗi JSON có chứa “You know, For Search” nghĩa là ok

5. Tạo kibana

kubectl create -f kibana.yaml

5.1. kiểm tra Kibana bằng port-forward

5.1.a. Trên eks

kubectl port-forward <KIBANA_POD_NAME> 5601:5601 --namespace=kube-logging --address 0.0.0.0

rồi trên trình duyệt vào http://<EC2-PUBLIC-IP>:5601 để check
Chú ý Mở Security Group cho port 5601

5.1.b. Trên gcp

muốn check phải edit service thành NodePort rồi mới port-forward được

kubectl edit service <KIBANA_SVC> -n kube-logging

muốn check NodePort đang sử dụng là port bao nhiêu thì:

kubectl describe svc <KIBANA_SVC> -n kube-logging

edit xong thì port-forward:

kubectl port-forward -n kube-logging service/<KIBANA_SVC> <NODEPORT>:5601 --address 0.0.0.0

Lấy external IP của Node

kubectl get nodes --output wide

rồi trên trình duyệt vào http://<EXTERNAL-IP>:<NODOE_PORT> để check
Chú ý Mở Firewall cho port NodePort của Kibana service:

gcloud compute firewall-rules create kibana-node-port --allow tcp:<NODE_PORT>
# If rules exist you need to using `update` instead of `create`

6. Tạo DaemonSet fluentd

kubectl create -f fluentd.yaml

Check xem trạng thái các pods:

kubectl get pods -A

Nếu tất cả pod đều lên Running nghĩa là ok

7. Check hệ thống EFK hoạt động ra sao

Giờ có thể port-forward để vào lại link kibana xem log http://<EC2-PUBLIC-IP>:5601

kubectl port-forward <KIBANA_POD_NAME> 5601:5601 --namespace=kube-logging --address 0.0.0.0

select Discover

Enter logstash-* in the text box and click on Next step.

select @timestamp

back to Discover

tạo app Counter để test việc xuất logs

kubectl create -f counter.yaml

Nếu muốn filter log theo pod name tên là “counter”, thì trong tab Discover, điền vào khung search kubernetes.pod_name:counter

CREDIT

https://www.digitalocean.com/community/tutorials/how-to-set-up-an-elasticsearch-fluentd-and-kibana-efk-logging-stack-on-kubernetes https://jmartinezxp.gitlab.io/post/config-kubernetes-efk/ https://chris-vermeulen.com/how-to-monitor-distributed-logs-in-kubernetes-with-the-efk-stack-/ https://github.com/GoogleCloudPlatform/click-to-deploy/tree/master/k8s/elastic-gke-logging https://github.com/mjhea0/efk-kubernetes/blob/master/kubernetes/elastic.yaml https://mherman.org/blog/logging-in-kubernetes-with-elasticsearch-Kibana-fluentd/ https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch#storage

Thank You!

Your comment has been submitted. It will appear on this page shortly! OK

Yikes, Sorry!

Error occured. Couldn't submit your comment. Please try again. Thank You! OK

Leave a comment