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
Pada index name pattern masukkan ns-default, klik Next step
Time field pilih @timestamp
, yang sudah di inject di konfigurasi fluentd diatas
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
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