Setup Nginx Ingress + Cloudflare pada Kubernetes
Ingress Controller memungkinkan kita untuk mengatur dan mengendalikan traffic HTTP dan HTTPS dari luar kubernetes cluster dan merutekannya melalui Load Balancer menuju layanan (service) yang sesuai. Ingress Controller biasanya digunakan sebagai Global Load Balancer untuk semua ingress, artinya kita hanya membutuhkan satu Ingress Controller sebagai Load Balancer, tidak perlu membuat Load Balancer untuk setiap service karena dapat dilakukan dalam satu konfigurasi.
Cloudflare dalam tulisan ini adalah opsional, Anda dapat menggunakan domain manajemen lain. Namun perlu digaris bawahi, Cloudflare bukan hanya tempat untuk manajemen domain, lebih dari itu Cloudflare dapat digunakan sebagai top layer securities dengan layanan-layanan yang ditawarkan seperti mitigasi DDOS, rate limiting, bot management dan lain sebagainya. Cloudflare juga dapat digunakan sebagai Load Balancer dari beberapa kluster Kubernetes, misalnya dari traffic dari region A diarahkan ke kluster A dan traffic dari region B ke kluster B, yang akan coba saya tulis pada kesempatan lain. Selengkapnya tentang Cloudflare dapat dilihat di laman utama Cloudflare.
Dengan asumsi Anda telah memiliki Kubernetes Cluster, maka langkah-langkahnya adalah sebagai berikut:
Install Helm
Dalam tulisan kali ini kita akan memasang Nginx Ingress Controller sebagai Ingress Controller yang akan digunakan. Instalasi dilakukan dengan menggunakan Helm sebagai package manager untuk Kubernetes. Anda dapat memasang Helm melalui dokumentasi resminya di halaman instalasi.
Deploy Aplikasi
Siapkan aplikasi yang akan dideploy kedalam kluster.
deployment.yamlapiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
spec:
replicas: 3
selector:
matchLabels:
app: hello-world
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: hynra/helloworld:latest
ports:
- containerPort: 8080
env:
- name: MESSAGE
value: Hello kubernetes
Deploy kedalam kluster dengan command: kubectl -f apply deployment.yaml
Supaya deployment dapat ditemukan oleh layanan lain dalam kluster, buat sebuah service
service.yamlapiVersion: v1
kind: Service
metadata:
name: hello-world
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
selector:
app: hello-world
apply kedalam kluster: kubectl -f apply service.yaml
kemudian cek apakah service berhasil dibuat
kubectl get services
Pasang Nginx Ingress Controller
Langkah selanjutnya adalah memasang Nginx Ingress Controller menggunakan Helm. Pada tulisan kali ini saya memasangnya dengan release name nginx-ingress
dan set parameterpublishService
ke true
.
helm install stable/nginx-ingress --name nginx-ingress --set controller.publishService.enabled=true
Kemudian cek sevices: kubectl get services
pastikan salah satu output service terdapat nama nginx-ingress-controller
dengan tipe LoadBalancer
lengkap dengan eksternal IP, misal 113.49.10.124
. Eksternal IP tersebut yang digunakan sebagai IP load balancer yang harus diset pada domain manajemen. Jika kita akses langsung IP tersebut pada browser maka akan muncul page dengan teks:
default backend - 404
hal tersebut mengindikasikan bahwa load balancer merutekan trafik ke back-end service, namun jika traffic berasal dari source yang tidak dikenali maka akan dirutekan ke default backend.
Set domain ke Ingress
Buat record pada dashboard Cloudflare, arahkan nama domain atau subdomain yang ingin Anda gunakan untuk mengakses aplikasi yang sudah dideploy didalam kluster melalui IP load balancer tadi.
Disable pilihan proxy
jika kita ingin menggunakan sertifikat letsencrypt
dan tidak menggunakan layanan proxy
dari Cloudflare.
Setup Cert-Manager
Untuk memasang sertifikat TLS pada Ingress Anda supaya secure, maka harus dipasang terlebih dahulu sertifikat manajer.
- Buat namespace baru dengan nama cert-manager
kubectl create namespace cert-manager
- Pasang Jetsatck CRDs
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v0.8.0/cert-manager.yaml
- Tambahkan Jetstack ke repositori
helm repo add jetstack https://charts.jetstack.io
- Pasang
cert-manager
via Helm pada namespacecert-manager
yang telah kita buat tadi
helm install --name cert-manager --namespace cert-manager jetstack/cert-manager
Membuat sertifikat TLS
Kita baru saja memasang sertifikat manajer pada kluster, selanjutnya buat TLS sertifikat via Let’s Encrypt. Buat file konfigurasi untuk membuat ClusterIssuer
.
issuer.yaml apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: <email-anda>
privateKeySecretRef:
name: letsencrypt-prod
http01: {}
deploy: kubectl apply -f issuer.yaml
. Dalam konfigurasi tersebut ClusterIssuer
akan mengontak Let’s Encrypt untuk mengisukan sertifikat. Untuk melacak apakah sertifikat sudah berhasi diisukan atau belum, dapat menggunakan command:
kubectl describe certificate letsencrypt-prod
Expose aplikasi via Ingress
Langkah terakhir, buat konfigurasi dengan tipe Ingress
supaya aplikasi dapat diakses melalui domain yang telah dibuat pada langkah sebelumnya.
ingress.yamlapiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: dafault-ingress #nama Ingress
annotations:
kubernetes.io/ingress.class: nginx
certmanager.k8s.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- <domain-anda>
secretName: letsencrypt-prod
rules:
- host: <domain-anda>
http:
paths:
- backend:
serviceName: hello-world #nama service
servicePort: 80
Deploy:
kubectl apply -f ingress.yaml
Akses aplikasi Anda melalui browser, cek apakah sertifikat sudah terpasang atau belum. Jika valid, maka akan terdapat indikator bahwa sertifikat telah valid dan diisukan oleh Let’s Encrypt.
Menggunakan Sertifikat Cloudflare
Cloudflate by default sebenarnya mempunyai kemampuan untuk mengisukan sertifikat. Pada tahap-tahap sebelumnya kita menonaktifkan proxy
dari Cloudflare. Supaya sertifikat TLS yang digunakan adalah yang diisukan oleh Cloudflare dan aplikasi kita juga menggunakan proxy
dari Cloudflare, maka lakukan langkha berikut:
Anda cukup toggle pilihan proxy
pada dashboard, sehingga Proxy Status nya menjadi Proxied. Tunggu beberapa waktu, kemudian cek kembali aplikasi Anda melalui browser:
Lihat bagian Issued By, seharusnya dicantumkan bahwa pengisu sertifikat adalah CloudFlare.