Semakin banyak microservice dan pod yang dikelola, tentunya semakin banyak log yang dihasilkan oleh Kubernetes itu sendiri. Ada berbagai macam cara untuk mengirim log, memilah milah log. Kubernetes sendiri mengenal yang namanya namespace, virtual cluster yang bisa digunakan untuk memisahkan aplikasi ataupun service, contoh namespace
– wordpress
– app
– data
– dan lain sebagainya

beberapa dependency yang harus sudah terinstall adalah
– kubectl
– helm
– kubernetes (di test di versi 1.20+)
– git

Salah satu keunggulan dari kube-fluentd-operator dari vmware ini, setiap ada perubahan konfigurasi fluentd, akan otomatis di reload.

Agar proses instalasi berjalan dengan lancar, anda harus memiliki akses read/write (baca/tulis) ke namespace kube-system.
Untuk memudahkan tutorial ini semua file akan diletakkan di ~/git/project/fluentd, buat folder tersebut

mkdir -p ~/git/project/fluentd

0. Install Elasticsearch dan Kibana

Tahap ini opsional bila anda sudah memiliki Elasticsearch dan kibana. Bila belum ada, ikuti cara install elasticsearch dan kibana di kubernetes.

1. Install fluend Operator

Cloning repository vmware/kube-fluentd-operator

cd ~/git/project/fluentd
git clone https://github.com/vmware/kube-fluentd-operator.git

lalu install di kubernetes dengan

cd ~/git/project/fluentd
helm install kfo ./kube-fluentd-operator/charts/log-router \
  --set rbac.create=true \
  --set image.tag=v1.15.2 \
  --set image.repository=vmware/kube-fluentd-operator

contoh output perintah diatas

NAME: kfo
LAST DEPLOYED: Tue Aug 17 13:33:17 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

2. Mengirim log ke Elasticsearch

Untuk tiap namespace perlu dibuat konfigurasi fluentd, agar lognya dikirim ke Elasticsearch.

Anggap kita sekarang menggunakan namespace default, kita akan membuat konfigurasi fluentd untuk namespace tersebut. Buat file fluent-default.conf yang berisi

<match **>
  @type elasticsearch
  host      elasticsearch.default
  scheme    http
  port      9200
  # bila menggunakan username/password hapus tanda pagar dibawah ini
  #user      elastic
  #password  SUPERPASSWORD
  index_name ns-default
  include_timestamp true
</match>

index_name ini digunakan untuk memisahkan index tiap namespace, nama index ini bisa diganti dengan apa saja.

Buat namespace baru

kubectl create namespace data

Konfigurasi ini akan dibuat menggunakan configmap kubernetes, sekarang kita buat configmap ini dengan perintah

kubectl create configmap fluentd-config --namespace default --from-file=fluent.conf=fluent-default.conf

satu lagi kita buat namespace data, lalu buat fluent-data.conf yang berisi

<match **>
  @type elasticsearch
  host      elasticsearch.default
  scheme    http
  port      9200
  # bila menggunakan username/password hapus tanda pagar dibawah ini
  #user      elastic
  #password  SUPERPASSWORD
  index_name ns-data
  include_timestamp true
</match>

yang berbeda disini hanya pada bagian index_name. Aplikasikan perubahan tersebut

kubectl create configmap fluentd-config --namespace data --from-file=fluent.conf=fluent-data.conf

testing pembuatan log dengan menjalankan

# untuk namespace default
kubectl run logtesting --namespace default  --image=fedora --restart=Never --command -- sh -c 'for i in $(seq 1 5); do echo "$(date) test log namespace default $i"; done'
# untuk namespace data
kubectl run logtesting --namespace data  --image=fedora --restart=Never --command -- sh -c 'for i in $(seq 1 5); do echo "$(date) test log namespace data $i"; done'

untuk melakukan perubahan configmap, gunakan perintah

kubectl edit configmap fluentd-config --namespace data

tapi untuk awal-awal lebih cepat dan mudah dengan delete configmap dan create yang baru, contoh

kubectl delete configmap fluentd-config -n data
kubectl create configmap fluentd-config --namespace data --from-file=fluent.conf=fluent-data.conf

3. Cek Log di Kibana

Buka kibana di menu Stack Management -> Index patterns -> Create index Patterns
dua index sudah dibuat di kibana
Pada index name pattern masukkan ns-default, klik Next step

Time field pilih @timestamp, yang sudah di inject di konfigurasi fluentd diatas
kubernetes kibana timestamp
akhiri dengan klk Create index pattern. Gunakan cara yang sama untuk index ns-data

Buka menu Discover, cari test seharusnya sudah muncul beberapa log yang dibuat
kubernetes log found test

4. Namespace kube-system

Khusus untuk namespace kube-system, konfigurasi fluentd memerlukan sedikit perubahan, kalo anda menggunakan format yang diatas untuk ns-data atau ns-default semua justru akan dilempar ke fluentd yang dibuat di kube-system, agar hal tersebut tidak terjadi buat fluent-kubesystem.conf dengan isi file sebagi berikut

<match systemd.** docker kube.kube-system.** k8s.**>
  @type elasticsearch
  host      elasticsearch.default
  scheme    http
  port      9200
  # bila menggunakan username/password hapus tanda pagar dibawah ini
  #user      elastic
  #password  SUPERPASSWORD
  index_name ns-kube-system
  include_timestamp true
</match>

lalu aplikasikan perubahan tersebut

kubectl create configmap fluentd-config --namespace kube-system --from-file=fluent.conf=fluent-kubesystem.conf

5. Cara Troubleshooting

Cara toubleshooting konfigurasi fluentd ini bisa menggunakan beberapa cara
1. Cek {HELMCHARTNAME}-log-router
Bila anda mengikuti cara diatas sepenuhnya, disini menggunakan helm chart kfo, jadi podnya diawali dengan kfo-log-router, cek pod dengan

kubectl get pod -A | grep kfo-log-router
# output
kube-system            kfo-log-router-jxgqp

lihat lognya live dengan perintah

kubectl logs kfo-log-router-jxgqp --all-containers=true --namespace kube-system -f

2. Cek Configmap yang di deploy
Gunakan perintah

kubectl get configmap fluentd-config --namespace default -o yaml
# contoh output
piVersion: v1
data:
  fluent.conf: |
    <match **>
      @type elasticsearch
      host      elasticsearch.default
      scheme    http
      port      9200
      #user      elastic
      #password  1uZbsd48R6O5rwfWTHBEKXi4
      index_name ns-default
      include_timestamp true
    </match>
kind: ConfigMap
metadata:
  creationTimestamp: "2021-08-17T07:33:02Z"
  name: fluentd-config
  namespace: default
  resourceVersion: "3359"
  uid: 93d8321c-47b5-4265-9757-ad00514c7866

sesuaikan namespacenya

Leave a comment

Your email address will not be published. Required fields are marked *