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.
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
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
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)