Setelah selesai deploy aplikasi di Kubernetes, pertanyaan selanjutnya bagaimana cara untuk mengakses kubernetes dari Internet. Kubernetes punya fitur yang bernama Ingress, yang digunakan untuk mengelola akses dari luar ke dalam cluster, baik untuk load balancing ataupun SSL termination.

– helm
– kubectl
– kubernetes 1.20+

Disini akan dibahas cara mengakses Elasticsearch dan Kibana dari luar Kubernetes atau bisa dibilang internet, agar bisa diakses oleh semua orang. Cara install Elasticsearch dan kibana, sudah pernah dibahas sebelumnya.

1. Nginx Ingress

nginx disini digunakan sebagai reverse proxy. ingress-nginx ini dikelola oleh komunitas kubernetes berbeda dengan ingress yang dikelola oleh Nginx Inc.

Tambahkan repo ingress-nginx dengan menjalankan

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
# update repo
helm repo update

install ingress-nginx dengan helm chart

helm install ingress-nginx ingress-nginx/ingress-nginx

Public IP yang akan didapat disini, bergantung dari tempat anda menginstall Kubernetes, baik GKE, AWS EKS dan lain sebagainya.
Lihat IP Public

kubectl --namespace default get services -w ingress-nginx-controller

Public IP ini yang akan digunakan di DNS.

public ip load balancer kubernetes

Dari contoh sebelumnya kita menggunakan dua services
1. elasticsearch port 9200
2. kibana port 5601
masing-masing domain menggunakan subdomain sesuai dengan nama servicenya. Maka buat deployment untuk ingress seperti dibawah ini nginx-ingress.yaml

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

deploy dengan

kubectl apply -f nginx-ingress.yaml

Cek status deployment

kubectl get ingress
# contoh output
nginx-ingress   <none>   elastic.cluster.jaranguda.com,kibana.cluster.jaranguda.com   172.104.xx.xx   80, 443   22h

2. Setting DNS

Karena kita menggunakan subdomain untuk tiap service yang ingin di expose ke Internet, maka kita harus membuat wildcard untuk dns, pada contoh diatas adalah

*.cluster.jaranguda.com IN A 172.104.xx.xx

setting dns wildcard

dns propagation (perubahan dns dikenali) ini bisa berlangsung sampai satu jam, tergantung dari DNS Provider yang anda gunakan. Disini saya menggunkaan Cloudflare, propagation berlangsung setelah kurang lebih 2 menit.

3. Setting SSL

Tahap ini opsional, disini kita tidak menggunakan cert-manager yang banyak digunakan oleh admin Kubernetes. Tetapi menggunakan

Generate wildcard SSL dengan acme.sh

acme.sh --issue -d cluster.jaranguda.com -d *.cluster.jaranguda.com --dns dns_cf

untuk mendapatkan tls.crt base64 dalam satu baris

# tls.key
cat  ~/.acme.sh/cluster.jaranguda.com/cluster.jaranguda.com.key | base64 -w0
# tls.crt
cat  ~/.acme.sh/cluster.jaranguda.com/fullchain.cer | base64 -w0

copy output dari perintah diatas, disesuaikan dengan data dibawah ini, ingat harus dalam satu baris
buat file jaranguda-ssl.yaml yang berisi

apiVersion: v1
kind: Secret
metadata:
  name: jaranguda-tls
  namespace: default
data:
  tls.crt: (base64 satu baris) 
  tls.key: (base64 satu baris)
type: kubernetes.io/tls

deploy dengan

kubectl apply -f jaranguda-ssl.yaml

terakhir ubah deployment ingress-nginx menjadi

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  tls:
  - hosts:
      - elastic.cluster.jaranguda.com
      - kibana.cluster.jaranguda.com
    secretName: jaranguda-tls
  rules:
  - host: elastic.cluster.jaranguda.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: elasticsearch
            port:
              number: 9200
  - host: kibana.cluster.jaranguda.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: kibana
            port:
              number: 5601

aplikasikan perubahan tersebut dengan

kubectl apply -f nginx-ingress.yaml

lalu akses salah satu domain
kibana kubernetes ssl

selain dari browser, bisa juga ditest dengan curl

curl -s -L  -I  http://kibana.cluster.jaranguda.com

http (port 80) otomatis diarahkan ke https (port 443)
http redirected to https

Leave a comment

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