halo sobat sekolahlinux, kali ini saya coba memberikan sedikit tutorial tentang bagaimana caranya log kubernetes event dikirim ke elasticsearch, ini berguna untuk kita tahu penyebab kenapa sebuah pod restart, misal dalam case saya pod ini restart karena OOM, log event pada dasarnya tidak akan dikirimkan jika kita hanya menggunakan fluentd atau fluentbit atau filebeat, kita memerlukan beberapa plugin tambahan, yaitu metricbeat dan juga kube-state-metric untuk dapat mengirimkan log events kubernetes ke elasticsearch, disini saya menggunakan helm metricbeat dari repo elastic dan juga helm kube-state-metric dari bitnami, yuk kita langsung saja untuk proses installasinya, pada tutorial kali ini saya menggunakan helm v3 ya teman-teman
install kube-state-metric
add helm repo bitnami untuk install kube-state-metric chart
helm repo add bitnami https://charts.bitnami.com/bitnami
selanjutnya inspect values kube-state-metric
helm inspect values bitnami/kube-state-metrics --version 1.1.3 > kube-state-metrics.yaml
lalu selanjutnya sesuaikan pengaturan kube-state-metrics.yaml sesuai dengan yg kalian inginkan, kalau di case saya, saya merubah service typenya yg sebelumnya ClusterIP menjadi NodePort, kurang lebih menjadi seperti dibawah part yang saya ubah
## kube-state-metrics Service ## service: ## Kubernetes service type and port number ## type: NodePort port: 8080 # clusterIP: None
dan jika sudah kita install kube-state-metrics dengan perintah dibawah, pada saat saya menginstall saya menggunakan versi latest, yaitu versi chart 1.1.3
helm install kube-state-metrics bitnami/kube-state-metrics -f kube-state-metrics.yaml --version 1.1.3 --namespace kube-system
install metricbeat
add helm repo elastic untuk install metricbeat chart
helm repo add elastic https://helm.elastic.co
selanjutnya inspect values metricbeat
helm inspect values elastic/metricbeat --version 7.10.1 > metricbeat.yaml
lalu selanjutnya sesuaikan pengaturan metricbeat.yaml di metricbeatconfig untuk daemonset menjadi seperti dibawah
metricbeatConfig: metricbeat.yml: | metricbeat.modules: - module: kubernetes metricsets: - container - node - pod - system - volume - event
dan pada bagian elastic endpointnya menjadi seperti dibawah
output.elasticsearch: hosts: "https://opendistro-production-opendistro-es-client-service:9200" username: "admin" password: "admin" ssl.verification_mode: "none"
lalu selanjutnya sesuaikan pengaturan metricbeat.yaml di metricbeatconfig untuk deployment menjadi seperti dibawah
metricbeatConfig: metricbeat.yml: | metricbeat.modules: - module: kubernetes enabled: true metricsets: - state_node - state_deployment - state_replicaset - state_pod - state_container - event period: 10s hosts: ["kube-state-metrics.kube-system:8080"] #hosts: ["metrics-server.kube-system:443"] - module: kubernetes enabled: true metricsets: - apiserver hosts: ["https://kubernetes.default"] bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token ssl.certificate_authorities: - /var/run/secrets/kubernetes.io/serviceaccount/ca.crt period: 30s
dan pada bagian elastic endpointnya menjadi seperti dibawah
output.elasticsearch: hosts: "https://opendistro-production-opendistro-es-client-service:9200" username: "admin" password: "admin" ssl.verification_mode: "none"
lalu pada bagian clusterRoleRules saya menambakan beberapa rules menjadi seperti dibawah ini
clusterRoleRules: - apiGroups: [""] resources: - nodes - namespaces - events - pods verbs: ["get", "list", "watch"] - apiGroups: ["extensions"] resources: - replicasets verbs: ["get", "list", "watch"] - apiGroups: ["apps"] resources: - statefulsets - deployments - replicasets verbs: ["get", "list", "watch"] - apiGroups: [""] resources: - nodes/stats verbs: ["get"] - apiGroups: - "" resources: - bindings - events - limitranges - namespaces/status - pods/log - pods/status - replicationcontrollers/status - resourcequotas - resourcequotas/status verbs: - get - list - watch - nonResourceURLs: - /metrics verbs: - get
dan jika sudah kita install metricbeat dengan perintah dibawah, pada saat saya menginstall saya menggunakan versi latest, yaitu versi chart 7.10.1
helm install metricbeat elastic/metricbeat -f metricbeat.yaml --version 7.10.1
Simulasi OOM Pod
selanjutnya kita coba buat sebuah simulasi oom Pod, manifestnya kurang lebih seperti dibawah oom.yaml
apiVersion: v1 kind: Pod metadata: name: percobaan spec: containers: - name: percobaan image: polinux/stress imagePullPolicy: IfNotPresent resources: requests: memory: "50Mi" limits: memory: "100Mi" command: ["stress"] args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"]
lalu apply manifest diatas
kubectl apply -f oom.yaml
maka pods statusnya akan seperti dibawah ini
NAME READY STATUS RESTARTS AGE percobaan 0/1 CrashLoopBackOff 5 4m27s
selanjutnya describe pods diatas dengan perintah dibawah
kubectl describe pods percobaan
lalu jika kita melakukan describe pada pod percobaan maka kurang lebih outputnya akan ada part seperti dibawah ini
State: Waiting Reason: CrashLoopBackOff Last State: Terminated Reason: OOMKilled Exit Code: 1
selanjutnya buka kibana dan kita mencari value OOMKilled sesuai dengan reason dari hasil describe diatas maka hasilnya akan seperti dibawah ini
nah sekian tutorial kali ini, semoga bermanfaat ya, jika ada yang kurang paham silahkan ditanyakan di kolom comment atau bisa ke linkedin saya
link referensi:
- https://www.elastic.co/guide/en/beats/metricbeat/current/metricbeat-metricset-kubernetes-apiserver.html
- https://medium.com/@andrew.kaczynski/kubernetes-events-how-to-keep-historical-data-of-your-cluster-835d685cc45
- https://www.elastic.co/guide/en/beats/metricbeat/current/metricbeat-module-kubernetes.html