Portal/Notes πŸ“
Cka

Ingress: Routing

Versi Bahasa Indonesia. Baca dalam Bahasa Inggris

Ingress mengekspos rute HTTP dan HTTPS dari luar cluster ke service-service di dalam cluster. Routing traffic dikendalikan oleh aturan yang didefinisikan pada resource Ingress.

Ingress - Kubernetes Official Docs

*Kubernetes Official Docs

Ingress menyediakan satu titik masuk (entry point) yang merutekan request ke service yang berbeda berdasarkan:

  • Hostnames (contoh: app.example.com)
  • Paths (contoh: /api, /web)
  • TLS Settings (untuk HTTPS)
  • Annotations (untuk perilaku tambahan seperti rewrite, redirect, dll.)

Ada banyak use case yang memanfaatkan ingress seperti TLS, Force HTTPS, Force Redirect, Basic Authentication, Rate Limiting, IP Whitelisting, dll. Tapi untuk sekarang kita fokus ke implementasi dasar untuk routing traffic.

Enable Minikube Ingress Addons

Untuk mengaktifkan ingress di minikube, kita perlu mengaktifkan addons terlebih dahulu.

➜ minikube addons enable ingress
πŸ’‘  ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
πŸ’‘  After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1"
    β–ͺ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.3
    β–ͺ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.3
    β–ͺ Using image registry.k8s.io/ingress-nginx/controller:v1.11.2
πŸ”Ž  Verifying ingress addon...
🌟  The 'ingress' addon is enabled

Untuk memvalidasi apakah ingress controller sudah berjalan, kita bisa gunakan kubectl get pods -n ingress-nginx. Mungkin perlu waktu hingga satu menit sebelum pod-pod ini terlihat.

➜ kubectl get pods -n ingress-nginx
NAME                                       READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-fmhdk       0/1     Completed   0          2m40s
ingress-nginx-admission-patch-zxmgn        0/1     Completed   0          2m40s
ingress-nginx-controller-bc57996ff-rz4wd   1/1     Running     0          2m40s

Create Ingress

Mari ekspos service simple-go kita ke luar menggunakan ingress yang kita definisikan di bawah. Buat file baru ingress.yaml dan masukkan definisi ingress di sana.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-ingress
spec:
  ingressClassName: nginx
  rules:
    - host: simple-go.mine
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: simple-go
                port:
                  number: 8080

Ini akan membuat object ingress dengan nama simple-ingress menggunakan nginx. Ada ingressClassName lain seperti Traefik, HAProxy, Istio, dll. Tapi dalam kasus ini kita akan pakai nginx.

Di bagian rules kita bisa mendefinisikan aturan untuk ingress ini. Sebuah aturan Ingress menentukan bagaimana traffic HTTP(S) yang masuk dirutekan di dalam cluster Kubernetes.

  • host: Menentukan domain mana yang harus cocok (opsional).
  • paths.path: Mendefinisikan path URL yang akan dirutekan.
  • paths.pathType: Tipe pencocokan path (detail lebih lanjut di bawah). Untuk daftar lengkap path type bisa baca lebih lanjut di Path Type Example.
  • backend.service.name: Nama service Kubernetes untuk menerima traffic.
  • backend.service.port.number: Port service untuk meneruskan traffic.

Jadi dalam definisi ingress kita, kita ingin mencocokkan semua traffic untuk domain simple-go.mine ke service dengan nama simple-go dan port 8080.

Ayo apply definisi ingress kita dan validasi apakah sudah terdaftar.

➜ kubectl apply -f ingress.yaml 
ingress.networking.k8s.io/simple-ingress created
➜ kubectl get ingress
NAME             CLASS   HOSTS            ADDRESS        PORTS   AGE
simple-ingress   nginx   simple-go.mine   192.168.49.2   80      15s

Test Ingress

Karena saya menggunakan MacOS (Minikube dengan Docker Driver), saya perlu melakukan tunneling terlebih dahulu menggunakan perintah minikube tunnel. Ini akan men-tunnel semua traffic localhost untuk port 80 dan 443 ke minikube.

➜ minikube tunnel
βœ…  Tunnel successfully started

πŸ“Œ  NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...

❗  The service/ingress simple-ingress requires privileged ports to be exposed: [80 443]
πŸ”‘  sudo permission will be asked for it.
πŸƒ  Starting tunnel for service simple-ingress.

Setelah tunneling berjalan, kita bisa mengaksesnya menggunakan perintah curl di bawah.

➜ curl --resolve "simple-go.mine:80:127.0.0.1" -i http://simple-go.mine
HTTP/1.1 200 OK
Date: Fri, 31 Jan 2025 03:37:49 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 65
Connection: keep-alive

[{"id":1,"content":"Hello!"},{"id":2,"content":"Good Morning!"}]

Kamu bisa coba mengubah path dan domain untuk melihat perubahannya.

References


Edit on GitHub

Last updated on

Ingress: Routing | Faisal Affan