Tips Konfigurasi Multiple Nginx Ingress Controller

Nginx Ingress Controller merupakan ingress controller yang paling saya andalkan. Selain sudah familiar dengan Nginx, proses instalasi dan konfigurasinya pun tidak terlalu sulit karena ketersediaan dokumentasi yang cukup lengkap. Banyak opsi proses instalasi yang bisa digunakan, baik dengan mengunduh manifest file-nya secara langsung atau pun menggunakan Helm. Ada kelebihan dan kekurangan untuk kedua metode instalasi tersebut, terutama apabila kebutuhan sistem mengharuskan kita menggunakan dua atau lebih ingress controller misalnya, untuk memisahkan trafik yang sifatnya public dan private, Rasanya menggunakan Helm chart sangat direkomendasikan demi menghindari typo apabila menduplikasikan file manifest-nya secara langsung.

Ada 3 opsi untuk menjalankan Nginx Ingress Controller:

Cluster-wide Ingress Controller (default) : Nginx Ingress Controller akan menangani & melayani trafik tiap ada permintaan pembuatan workload ingress di namespace & cluster mana pun.
Single-namespace Ingress Controller : Mode ini digunakan apabila menginginkan Nginx Ingress Controller tersedia untuk namespace yang spesifik. Caranya dengan menambahkan perintah -watch-namespace pada konfigurasi.
Ingress Controller for Specific Ingress Class : Mode ini mengharuskan penggunakan untuk memasukkan value ingress class yang dideklarasikan dan menyediakan ingress controller yang sesuai.

Untuk mengimplementasikan multiple Nginx Ingress Controller, mode konfigurasi pada opsi ketiga merupakan pilihan yang tepat karena menawarkan fleksibilitas kepada pengguna untuk memilih langsung mana tipe ingress controller yang dibutuhkan tanpa banyak mengubah konfigurasi. Awalnya saya mengira proses instalasi akan berlangsung cepat dan lancar menggunakan Helm. Namun, beberapa kendala saya temui. Kendala yang cukup memakan waktu lama adalah tidak berjalannya redirect HTTP ke HTTPS. Untuk cloud service yang digunakan adalah AWS dan mengharuskan penggunaan AWS NLB di mana alasan utamanya adalah classic load balancer AWS yang akan dihentikan layanannya pada 15 Agustus 2022.

Menurut dokumentasi pada laman ini penyebab tidak berjalannya proses redirect tersebut adalah dikarenakan annotation ssl-redirect dan force-ssl-redirect tidak berfungsi jika menggunakan AWS NLB. Maka, kita perlu membuat special port agar proses redirect HTTP ke HTTPS dapat berjalan. Berikut detailnya:

– Special port 8000
– Trafik port 80 AWS NLB akan diarahkan ke port 80 di container
– Trafik port 443 AWS NLB akan diarahkan ke port 8000 di container

Hingga konfigurasi value Helm chart menjadi seperti berikut:

controller:
  config:
    ssl-redirect: "false" # we use `special` port to control ssl redirection
    server-snippet: |
      listen 8000;
      if ( $server_port = 80 ) {
         return 308 https://$host$request_uri;
      }
  
  ingressClassResource:
    name: nginx-internal
    enabled: true
    default: false
    controllerValue: "k8s.io/ingress-nginx-internal"

  containerPort:
    http: 80
    https: 443
    special: 8000
  service:
    targetPorts:
      http: http
      https: special
    annotations:
      service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "tcp"
      service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
      service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "your-arn"
      service.beta.kubernetes.io/aws-load-balancer-type: "nlb"

Selanjutnya teman-teman bisa mendeklarasikan value yang berbeda pada parameter ingressClassResources dan parameter annotation service untuk membuat Ingress Controller lainnya. Jangan lupa untuk mengisi value yang sesuai pada ingressClassName saat membuat workload ingress ya 😀

Teman-teman ada yang memiliki kendala serupa atau yang berbeda saat implementasi multiple Nginx Ingress Controller? Boleh banget dibagikan pada kolom komentar, ya 🙂

Leave a comment