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
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
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
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)
Service | Internal | Eksternal |
---|---|---|
Elastic Search | elasticsearch.log port 9200 | elastic.prd-sg.DOMAIN.com port 80 |
Kibana | kibana.log port 5601 | kibana.prd-sg.DOMAIN.com port 80 |