Kali ini kita akan membahas cara untuk deploy Elasticsearch beserta Kibana di Kubernetes. Kali ini kita akan menggunakan DigitalOcean Kubernetes (DOKS), walaupun kita menggunakan DigitalOcean, anda tetap bisa menggunakannya di varian Kubernetes lainnya, mungkin yang perlu disesuaikan hanya dibagian LoadBalancer.

Spesifikasi

Kubernetes : 1.21
Elasticsearch : 7.16.2
Kibana : 7.16.2

Deploy Elasticsearch

Hal yang pertama akan kita lakukan adalah deploy elasticsearch, untuk itu kita harus membuat file YAML, disini akan kita namai elasticsearch.yaml. Bagian deployment adalah proses untuk deploy elasticsearch, dan services adalah agar elasticsearch bisa diakses menggunakan domain, contoh disini bisa diakses menggunakan elasticsearch, bila berada dalam satu namespace, kalo dari namespace yang berbeda gunakan elasticsearch.log

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: log
  name: elasticsearch
spec:
  selector:
    matchLabels:
      component: elasticsearch
  template:
    metadata:
      labels:
        component: elasticsearch
    spec:
      containers:
      - name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch:7.16.2
        env:
        - name: discovery.type
          value: single-node
        - name: xpack.license.self_generated.type
          value: basic
        - name: xpack.security.enabled
          value: "true"
        ports:
        - containerPort: 9200
          name: http
          protocol: TCP
        resources:
          limits:
            cpu: 500m
            memory: 4Gi
          requests:
            cpu: 500m
            memory: 1Gi
---
apiVersion: v1
kind: Service
metadata:
  namespace: log
  name: elasticsearch
  labels:
    service: elasticsearch
spec:
  type: ClusterIP
  selector:
    component: elasticsearch
  ports:
  - port: 9200
    targetPort: 9200

deploy elasticsearch

kubectl apply -f elasticsearch.yaml

Lihat pod dengan nama elasticsearch yang baru di deploy

kubectl get pods -n log
# output
NAME                             READY   STATUS    RESTARTS   AGE
elasticsearch-75c56f646d-7swl8   1/1     Running   0          1m
kibana-84657487dd-pggb8          1/1     Running   0          1m

Lalu, generate password agar elasticsearch lebih aman, karena menggunakan password random.

kubectl -n log exec -it elasticsearch-75c56f646d-5dk4q  -- bin/elasticsearch-setup-passwords auto -b
# output
Changed password for user apm_system
PASSWORD apm_system = 54QIqLvl7kdVhgpb1OUo
 
Changed password for user kibana_system
PASSWORD kibana_system = otrpineznPipsdk6k8xw
 
Changed password for user kibana
PASSWORD kibana = otrpineznPipsdk6k8xw
 
Changed password for user logstash_system
PASSWORD logstash_system = lB2MHUTNhDoylNFj3Op1
 
Changed password for user beats_system
PASSWORD beats_system = CtUD0oO5BFXeRbNqG2VB
 
Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = vRmbU9s3xqswCEtmYd7J
 
Changed password for user elastic
PASSWORD elastic = mjZofGkihs4tjJ7Mywgo

simpan password diatas, terutama untuk user elastic, karena ini yang akan kita setting di Kibana dan digunakan untuk login ke dashboard juga.

Tes Koneksi Elasticsearch

Untuk tes koneksi ke elasticsearch, kita akan menggunakan port-forward, fitur Kubernetes yang bisa mem-forward dari POD ke localhost, dengan begini kita bisa bebas melakukan testing.

kubectl port-forward service/elasticsearch 9200:9200 -n log

buka terminal baru, lalu testing dengan password yang digenerate diatas

curl elastic:PASSWORD@localhost:9200
# contoh
curl elastic:mjZofGkihs4tjJ7Mywgo@localhost:9200

portforward kubernetes

Deploy Kibana

Kibana merupakah Web UI yang digunakan untuk mengakses dan mengelola Elastic Search, karena di support langsung oleh Elastic, Kibana biasanya memiliki versi yang sama dengan Elastic Search.

Untuk deploy kibana, pertama kita buat YAML file yang berisi Deployment dan Service.

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: log
  name: kibana
spec:
  selector:
    matchLabels:
      run: kibana
  template:
    metadata:
      labels:
        run: kibana
    spec:
      containers:
      - name: kibana
        image: docker.elastic.co/kibana/kibana:7.16.2
        env:
        - name: ELASTICSEARCH_URL
          value: "elasticsearch"
        - name: XPACK_SECURITY_ENABLED
          value: "true"
        - name: ELASTICSEARCH_USERNAME
          value: "elastic"
        - name: ELASTICSEARCH_PASSWORD
          value: "mjZofGkihs4tjJ7Mywgo"
        ports:
        - containerPort: 5601
          name: http
          protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  namespace: log
  name: kibana
  labels:
    service: kibana
spec:
  type: ClusterIP
  selector:
    run: kibana
  ports:
  - port: 5601
    targetPort: 5601

deploy YAML file tersebut.

kubectl apply -f kibana.yaml

untuk mengakses kibana, kita akan melakukan port forward ke localhost, same seperti di Elasticsearch. Cara ini digunakan untuk memastikan semuanya berjalan dengan lancar, sebelum melakukan deployment lebih lanjut.

kubectl port-forward service/kibana 5601:5601 -n log

lalu buka http://localhost:5601 di browser
kibana di localhost
Gunakan user elastic dan password yang digenerate sebelumnya.

Deploy Ingress

Untuk deployment Ingress

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/cloud/deploy.yaml

Tunggu beberapa saat, lalu jalankan perintah dibawah ini untuk mendapatkan IP Public dari LoadBalancer.

kubectl get service ingress-nginx-controller --namespace=ingress-nginx

Setting DNS

Kita akan menggunakan subdomain per services, untuk itu kita harus set wildcard DNS, contoh recordnya

*.prd-sg.jaranguda IN A 132.12.xx.xx

setelah menambahkan DNS tersebut, bisa sampai 10 menit baru perubahan tersebut bisa dicek
Untuk setting dns/domain ini, akan atur oleh file nginx-ingress.yaml, buat isinya sebagai berikut

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  namespace: log
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: elastic.prd-sg.DOMAIN.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: elasticsearch
            port:
              number: 9200
  - host: kibana.prd-sg.DOMAIN.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: kibana
            port:
              number: 5601

deploy YAML file tersebut.

kubectl apply -f nginx-ingress.yaml

sekarang coba akses nama domain tersebut
akses kibana menggunakan subdomain

Dengan menggunakan Load Balancer (Public IP), kita bisa mengirim log ke Elasticsearch dari luar ataupaun dari dalam. Untuk mengakses elasticsearch dari dalam cluster cukup gunakan elasticsearch.log (formatnya menggunakan service.namespace)

ServiceInternalEksternal
Elastic Searchelasticsearch.log port 9200elastic.prd-sg.DOMAIN.com port 80
Kibanakibana.log port 5601kibana.prd-sg.DOMAIN.com port 80

Leave a comment

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