how to log kubernetes events to elasticsearch

0
435

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: