Setup Nginx Ingress + Cloudflare pada Kubernetes

4 min readSep 21, 2019

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.

Setup domain

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 namespace cert-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
Cek sertifikat

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:

Set Cloudflare Proxy

Anda cukup toggle pilihan proxy pada dashboard, sehingga Proxy Status nya menjadi Proxied. Tunggu beberapa waktu, kemudian cek kembali aplikasi Anda melalui browser:

Cek sertifikat

Lihat bagian Issued By, seharusnya dicantumkan bahwa pengisu sertifikat adalah CloudFlare.

--

--

No responses yet