All Products
Search
Document Center

Container Service for Kubernetes:NGINX Ingress Tingkat Lanjut

Last Updated:Oct 24, 2026

Dalam kluster Kubernetes, NGINX Ingress adalah objek API yang menyediakan load balancing lapisan 7 untuk mengelola akses eksternal ke layanan. Anda dapat menggunakan NGINX Ingress untuk mengonfigurasi URL yang dapat diakses secara eksternal, aturan penulisan ulang, layanan HTTPS, dan rilis canary. Topik ini menjelaskan cara mengonfigurasi layanan routing yang aman, autentikasi TLS timbal balik, nama domain yang mendukung ekspresi reguler dan wildcard, serta cara mengajukan sertifikat HTTPS gratis.

Penting

Proyek open source Ingress-NGINX tidak akan lagi dipelihara setelah Maret 2026. Akibatnya, Container Service for Kubernetes juga akan menghentikan pemeliharaan untuk komponen controller NGINX Ingress. Harap perhatikan risiko yang terkait. Untuk informasi selengkapnya, lihat [Pengumuman Produk] Pengumuman tentang Penghentian Pemeliharaan untuk Komponen Controller NGINX Ingress.

Prasyarat

Konfigurasi

Metode konfigurasi controller NGINX Ingress di ACK sepenuhnya kompatibel dengan versi komunitas. Untuk daftar lengkap opsi konfigurasi, lihat Konfigurasi NGINX.

Metode konfigurasi berikut didukung:

  • Menggunakan anotasi: Anda dapat menambahkan anotasi ke file YAML dari NGINX Ingress. Anotasi ini hanya berlaku pada Ingress tertentu tersebut. Untuk informasi selengkapnya, lihat Anotasi.

  • Menggunakan ConfigMap: Anda dapat memodifikasi ConfigMap kube-system/nginx-configuration. Ini adalah konfigurasi global yang berlaku untuk semua NGINX Ingress. Untuk informasi selengkapnya, lihat ConfigMap.

  • Menggunakan templat NGINX kustom: Anda dapat menggunakan metode ini jika anotasi atau ConfigMap tidak memenuhi persyaratan khusus Anda untuk templat NGINX dari controller NGINX Ingress. Untuk informasi selengkapnya, lihat Templat NGINX kustom.

Mengonfigurasi pengalihan URL

Saat menggunakan controller NGINX Ingress, controller ini meneruskan permintaan berdasarkan path lengkap. Misalnya, permintaan ke /service1/api diteruskan ke path /service1/api pada pod backend. Jika path layanan backend Anda adalah /api, ketidakcocokan path akan terjadi yang mengakibatkan error 404. Untuk mengatasi masalah ini, Anda dapat menambahkan anotasi nginx.ingress.kubernetes.io/rewrite-target untuk menulis ulang path permintaan ke direktori yang benar.

Buat NGINX Ingress berdasarkan versi Kubernetes kluster Anda.

Kubernetes 1.19 dan yang lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: foo.bar.com
  namespace: default
  annotations:
    # Pengalihan URL.
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
    # Untuk versi controller Ingress 0.22.0 dan yang lebih baru, Anda harus mendefinisikan path menggunakan ekspresi reguler dan menggunakan grup tangkapan dalam anotasi rewrite-target.
      - path: /svc(/|$)(.*)
        backend:
          service: 
            name: web1-service
            port: 
              number: 80
        pathType: ImplementationSpecific

Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: foo.bar.com
  namespace: default
  annotations:
    # Pengalihan URL.
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      # Untuk versi controller Ingress 0.22.0 dan yang lebih baru, Anda harus mendefinisikan path menggunakan ekspresi reguler dan menggunakan grup tangkapan dalam anotasi rewrite-target.
      - path: /svc(/|$)(.*)
        backend:
          serviceName: web1-service
          servicePort: 80
  1. Akses layanan NGINX.

    1. Jalankan perintah berikut untuk mendapatkan ADDRESS.

      kubectl  get  ingress

      Output yang diharapkan:

      NAME           CLASS   HOSTS                ADDRESS          PORTS   AGE
      foo.bar.com    nginx   foo.bar.com        172.16.XX.XX       80      46m
    2. Jalankan perintah berikut. Ganti <ADDRESS> dengan alamat IP Ingress.

      curl -k -H "Host: foo.bar.com"  http://<ADDRESS>/svc/foo

      Output yang diharapkan:

      web1: /foo

Aturan penulisan ulang

Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/rewrite-target untuk konfigurasi penulisan ulang dasar. Untuk informasi selengkapnya, lihat Mengonfigurasi pengalihan URL.

Untuk kebutuhan penulisan ulang yang kompleks atau tingkat lanjut, Anda dapat menggunakan anotasi berikut:

  • nginx.ingress.kubernetes.io/server-snippet: Menambahkan konfigurasi kustom ke blok server.

  • nginx.ingress.kubernetes.io/configuration-snippet: Menambahkan konfigurasi kustom ke blok location.

Anotasi ini memberikan fleksibilitas bagi Anda untuk menyesuaikan konfigurasi NGINX untuk berbagai kasus penggunaan dengan menambahkan potongan kode kustom.

Berikut adalah contoh konfigurasi:

annotations:
     nginx.ingress.kubernetes.io/server-snippet: |
         rewrite ^/v4/(.*)/card/query http://foo.bar.com/v5/#!/card/query permanent;
     nginx.ingress.kubernetes.io/configuration-snippet: |
         rewrite ^/v6/(.*)/card/query http://foo.bar.com/v7/#!/card/query permanent;

Jalankan perintah berikut untuk melihat file konfigurasi NGINX di pod controller NGINX Ingress:

kubectl exec nginx-ingress-controller-xxxxx --namespace kube-system -- cat /etc/nginx/nginx.conf   # Ganti nama pod dengan nama yang sebenarnya dari lingkungan Anda.

File nginx.conf yang dihasilkan mencakup hal berikut:

# start server foo.bar.com
    server {
        server_name foo.bar.com ;
        listen 80;
        listen [::]:80;
        set $proxy_upstream_name "-";
    # Konfigurasi server-snippet.
        rewrite ^/v4/(.*)/card/query http://foo.bar.com/v5/#!/card/query permanent;
        ...
    # Konfigurasi configuration-snippet.
      rewrite ^/v6/(.*)/card/query http://foo.bar.com/v7/#!/card/query permanent;
      ...
    }
    # end server foo.bar.com

Anotasi snippet juga mendukung konfigurasi global. Untuk informasi selengkapnya, lihat server-snippet.

Untuk informasi selengkapnya tentang cara menggunakan direktif rewrite, lihat dokumentasi resmi NGINX untuk direktif ini.

Mengonfigurasi sertifikat HTTPS Ingress

Anda dapat mengonfigurasi sertifikat HTTPS untuk situs web secara langsung di resource Ingress.

  1. Siapkan sertifikat layanan Anda.

    Catatan

    Nama domain dalam sertifikat harus sesuai dengan host yang Anda tentukan di Ingress. Jika tidak, controller NGINX Ingress tidak dapat memuat sertifikat.

    1. Jalankan perintah berikut untuk menghasilkan file sertifikat bernama tls.crt dan file kunci privat bernama tls.key.

      openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=foo.bar.com/O=foo.bar.com"
    2. Jalankan perintah berikut untuk membuat Secret.

      Gunakan sertifikat dan kunci privat untuk membuat Kubernetes Secret bernama tls-test-ingress. Anda akan mereferensikan Secret ini saat membuat Ingress.

      kubectl create secret tls tls-test-ingress --key tls.key --cert tls.crt
  2. Deploy templat berikut untuk membuat resource Ingress. Bidang tls mereferensikan Secret yang Anda buat pada langkah sebelumnya.

    Kubernetes 1.19 dan yang lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: test-test-ingress
    spec:
      # Referensikan sertifikat TLS.
      tls:
      - hosts:
        - foo.bar.com # Nama domain yang terkait dengan sertifikat. 
        secretName: tls-test-ingress
      rules:
      - host: foo.bar.com
        http:
          paths:
          - path: /foo
            backend:
              service:
                name: web1-svc
                port:
                  number: 80
            pathType: ImplementationSpecific

    Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: test-test-ingress
    spec:
      # Referensikan sertifikat TLS.
      tls:
      - hosts:
        - foo.bar.com # Nama domain yang terkait dengan sertifikat.
        secretName: tls-test-ingress
      rules:
      - host: foo.bar.com
        http:
          paths:
          - path: /foo
            backend:
              serviceName: web1-svc
              servicePort: 80
  3. Konfigurasikan file hosts atau rekaman DNS Anda untuk mengakses layanan TLS.

    Anda dapat mengakses Layanan web1-svc di https://foo.bar.com/foo.

Mengonfigurasi autentikasi TLS timbal balik

Dalam beberapa skenario, Anda mungkin perlu mengonfigurasi autentikasi TLS timbal balik untuk meningkatkan keamanan. Controller NGINX Ingress memungkinkan Anda mengonfigurasi fitur ini menggunakan anotasi.

  1. Jalankan perintah berikut untuk membuat sertifikat certificate authority (CA) dengan tanda tangan sendiri:

    openssl req -x509 -sha256 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 356 -nodes -subj '/CN=Fern Cert Authority'

    Output yang diharapkan:

    Generating a 4096 bit RSA private key
    .............................................................................................................++
    .....................................................................................++
    writing new private key to 'ca.key'
  2. Buat sertifikat server.

    1. Jalankan perintah berikut untuk menghasilkan permintaan penandatanganan sertifikat (CSR) untuk sertifikat server:

      openssl req -new -newkey rsa:4096 -keyout server.key -out server.csr -nodes -subj '/CN=foo.bar.com'

      Output yang diharapkan:

      Generating a 4096 bit RSA private key
      ................................................................................................................................++
      .................................................................++
      writing new private key to 'server.key'
    2. Jalankan perintah berikut untuk menggunakan sertifikat root guna menandatangani CSR server dan menghasilkan sertifikat server:

      openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

      Output yang diharapkan:

      Signature ok
      subject=/CN=foo.bar.com
      Getting CA Private Key
  3. Buat sertifikat client.

    1. Hasilkan CSR untuk sertifikat client.

      openssl req -new -newkey rsa:4096 -keyout client.key -out client.csr -nodes -subj '/CN=Fern'

      Output yang diharapkan:

      Generating a 4096 bit RSA private key
      .......................................................................................................................................................................................++
      ..............................................++
      writing new private key to 'client.key'
      -----
    2. Jalankan perintah berikut untuk menggunakan sertifikat root guna menandatangani CSR client dan menghasilkan sertifikat client:

      openssl x509 -req -sha256 -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt

      Output yang diharapkan:

      Signature ok
      subject=/CN=Fern
      Getting CA Private Key
  4. Jalankan perintah berikut untuk memeriksa file sertifikat yang dibuat:

    ls

    Output yang diharapkan:

    ca.crt  ca.key  client.crt  client.csr  client.key  server.crt  server.csr  server.key
  5. Jalankan perintah berikut untuk membuat Secret untuk sertifikat CA:

    kubectl create secret generic ca-secret --from-file=ca.crt=ca.crt

    Output yang diharapkan:

    secret/ca-secret created
  6. Jalankan perintah berikut untuk membuat Secret untuk sertifikat server:

    kubectl create secret generic tls-secret --from-file=tls.crt=server.crt --from-file=tls.key=server.key

    Output yang diharapkan:

    secret/tls-secret created
  7. Deploy templat berikut untuk membuat NGINX Ingress sampel untuk pengujian.

    Kubernetes 1.19 dan yang lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
        nginx.ingress.kubernetes.io/auth-tls-secret: "default/ca-secret"
        nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
        nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"
      name: nginx-test
      namespace: default
    spec:
      rules:
      - host: foo.bar.com
        http:
          paths:
          - backend:
              service:
                name: http-svc
                port: 
                  number: 80
            path: /
            pathType: ImplementationSpecific
      tls:
      - hosts:
        - foo.bar.com
        secretName: tls-secret

    Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
        nginx.ingress.kubernetes.io/auth-tls-secret: "default/ca-secret"
        nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
        nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"
      name: nginx-test
      namespace: default
    spec:
      rules:
      - host: foo.bar.com
        http:
          paths:
          - backend:
              serviceName: http-svc
              servicePort: 80
            path: /
      tls:
      - hosts:
        - foo.bar.com
        secretName: tls-secret

    Output yang diharapkan:

    ingress.networking.k8s.io/nginx-test configured
  8. Jalankan perintah berikut untuk melihat alamat IP Ingress.

    kubectl get ing

    Alamat IP di kolom ADDRESS adalah alamat IP Ingress.

    NAME         HOSTS                    ADDRESS         PORTS     AGE
    nginx-test   foo.bar.com              39.102.XX.XX    80, 443   4h42m
  9. Jalankan perintah berikut untuk memperbarui file hosts Anda. Ganti alamat IP dengan alamat IP Ingress Anda yang sebenarnya.

    echo "39.102.XX.XX  foo.bar.com" | sudo tee -a /etc/hosts

    Verifikasi konfigurasi:

    • Akses layanan tanpa sertifikat client:

      curl --cacert ./ca.crt  https://foo.bar.com

      Output yang diharapkan:

      <html>
      <head><title>400 No required SSL certificate was sent</title></head>
      <body>
      <center><h1>400 Bad Request</h1></center>
      <center>No required SSL certificate was sent</center>
      <hr><center>nginx/1.19.0</center>
      </body>
      </html>
    • Akses layanan dengan sertifikat client:

      curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://foo.bar.com

      Output yang diharapkan:

      <!DOCTYPE html>
      <html>
      <head>
      <title>Selamat datang di nginx!</title>
      <style>
          body {
              width: 35em;
              margin: 0 auto;
              font-family: Tahoma, Verdana, Arial, sans-serif;
          }
      </style>
      </head>
      <body>
      <h1>Selamat datang di nginx!</h1>
      <p>Jika Anda melihat halaman ini, server web nginx berhasil diinstal dan
      berfungsi. Konfigurasi lebih lanjut diperlukan.</p>
      
      <p>Untuk dokumentasi dan dukungan online, silakan merujuk ke
      <a href="http://nginx.org/">nginx.org</a>.<br/>
      Dukungan komersial tersedia di
      <a href="http://nginx.com/">nginx.com</a>.</p>
      
      <p>Terima kasih telah menggunakan nginx.</p>
      </body>
      </html>

Meneruskan permintaan ke backend HTTPS

Secara default, controller NGINX Ingress menggunakan HTTP untuk meneruskan permintaan ke pod backend. Jika layanan backend Anda menggunakan HTTPS, Anda dapat menambahkan anotasi nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" untuk mengonfigurasi controller agar menggunakan HTTPS untuk koneksi backend.

Berikut adalah contoh konfigurasi NGINX Ingress:

Kubernetes 1.19 dan yang lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: backend-https
  annotations:
    # Catatan: Anda harus menentukan bahwa layanan backend menggunakan HTTPS.
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  tls:
  - hosts:
    - <YOUR-HOST-NAME>
    secretName: <YOUR-SECRET-CERT-NAME>
  rules:
  - host: <YOUR-HOST-NAME>
    http:
      paths:
      - path: /
        backend:
          service:
            name: <YOUR-SERVICE-NAME>
            port: 
              number: <YOUR-SERVICE-PORT>
        pathType: ImplementationSpecific

Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: backend-https
  annotations:
    # Catatan: Anda harus menentukan bahwa layanan backend menggunakan HTTPS.
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  tls:
  - hosts:
    - <YOUR-HOST-NAME>
    secretName: <YOUR-SECRET-CERT-NAME>
  rules:
  - host: <YOUR-HOST-NAME>
    http:
      paths:
      - path: /
        backend:
          serviceName: <YOUR-SERVICE-NAME>
          servicePort: <YOUR-SERVICE-PORT>

Menggunakan ekspresi reguler dalam nama domain

Secara default, resource Kubernetes Ingress tidak mendukung ekspresi reguler dalam hostname. Namun, Anda dapat mengaktifkan fitur ini menggunakan anotasi nginx.ingress.kubernetes.io/server-alias.

  1. Deploy templat berikut. Contoh ini menggunakan ekspresi reguler ~^www\.\d+\.example\.com.

    Kubernetes 1.19 dan yang lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-regex
      namespace: default
      annotations:
        nginx.ingress.kubernetes.io/server-alias: '~^www\.\d+\.example\.com$, abc.example.com'
    spec:
      rules:
      - host: foo.bar.com
        http:
          paths:
          - path: /foo
            backend:
              service:
                name: http-svc1
                port:
                  number: 80
            pathType: ImplementationSpecific

    Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress-regex
      namespace: default
      annotations:
        nginx.ingress.kubernetes.io/server-alias: '~^www\.\d+\.example\.com$, abc.example.com'
    spec:
      rules:
      - host: foo.bar.com
        http:
          paths:
          - path: /foo
            backend:
              serviceName: http-svc1
              servicePort: 80
  2. Periksa konfigurasi controller NGINX Ingress.

    1. Jalankan perintah berikut untuk melihat pod controller NGINX Ingress:

      kubectl get pods -n kube-system | grep nginx-ingress-controller

      Output yang diharapkan:

      nginx-ingress-controller-77cd987c4c-c****         1/1     Running   0          1h
      nginx-ingress-controller-77cd987c4c-x****         1/1     Running   0          1h
    2. Jalankan perintah berikut untuk melihat konfigurasi controller NGINX Ingress. Output menunjukkan bahwa bidang server_name telah diperbarui.

      kubectl exec -n kube-system nginx-ingress-controller-77cd987c4c-c**** cat /etc/nginx/nginx.conf | grep -C3 "foo.bar.com"

      Output yang diharapkan:

        # start server foo.bar.com
        server {
      --
        server {
          server_name foo.bar.com abc.example.com ~^www\.\d+\.example\.com$ ;
          listen 80  ;
          listen 443  ssl http2 ;
      --
      --
          }
        }
        # end server foo.bar.com
  3. Jalankan perintah berikut untuk mendapatkan alamat IP Ingress:

    kubectl get ing

    Output yang diharapkan:

    NAME            HOSTS         ADDRESS          PORTS     AGE
    ingress-regex   foo.bar.com   101.37.XX.XX     80        11s
  4. Jalankan perintah berikut untuk menguji akses layanan dengan aturan yang berbeda.

    Ganti <IP_ADDRESS> dengan alamat IP yang Anda peroleh pada langkah sebelumnya.

    • Jalankan perintah berikut untuk mengakses layanan menggunakan Host: foo.bar.com:

      curl -H "Host: foo.bar.com" <IP_ADDRESS>/foo

      Output yang diharapkan:

      /foo
    • Jalankan perintah berikut untuk mengakses layanan menggunakan Host: www.123.example.com:

      curl -H "Host: www.123.example.com" <IP_ADDRESS>/foo

      Output yang diharapkan:

      /foo
    • Jalankan perintah berikut untuk mengakses layanan menggunakan Host: www.321.example.com:

      curl -H "Host: www.321.example.com" <IP_ADDRESS>/foo

      Output yang diharapkan:

      /foo

Menggunakan nama domain wildcard

Resource NGINX Ingress dalam kluster Kubernetes mendukung nama domain wildcard. Misalnya, Anda dapat mengonfigurasi host seperti *.ingress-regex.com.

  1. Deploy templat berikut untuk membuat NGINX Ingress.

    Kubernetes 1.19 dan yang lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-regex
      namespace: default
    spec:
      rules:
      - host: *.ingress-regex.com
        http:
          paths:
          - path: /foo
            backend:
              service:
                name: http-svc1
                port:
                  number: 80
            pathType: ImplementationSpecific

    Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress-regex
      namespace: default
    spec:
      rules:
      - host: *.ingress-regex.com
        http:
          paths:
          - path: /foo
            backend:
              serviceName: http-svc1
              servicePort: 80
  2. Jalankan perintah berikut untuk memeriksa konfigurasi controller NGINX Ingress. Output menunjukkan bahwa bidang server_name telah diperbarui.

    kubectl exec -n kube-system <nginx-ingress-pod-name> cat /etc/nginx/nginx.conf | grep -C3 "*.ingress-regex.com"
    Catatan

    Ganti nginx-ingress-pod-name dengan nama pod controller NGINX Ingress Anda yang sebenarnya.

    Output yang diharapkan:

    # start server *.ingress-regex.com
      server {
        server_name *.ingress-regex.com ;
        listen 80;
        listen [::]:80;
    ...
      }
      # end server *.ingress-regex.com

    Output yang diharapkan untuk versi controller NGINX Ingress yang lebih baru:

    ## start server *.ingress-regex.com
      server {
        server_name ~^(?<subdomain>[\w-]+)\.ingress-regex\.com$ ;
        listen 80;
        listen [::]:80;
    ...
      }
      ## end server *.ingress-regex.com
  3. Jalankan perintah berikut untuk mendapatkan alamat IP Ingress:

    kubectl get ing

    Output yang diharapkan:

    NAME            HOSTS                 ADDRESS           PORTS     AGE
    ingress-regex   *.ingress-regex.com   101.37.XX.XX      80        11s
  4. Jalankan perintah berikut untuk menguji akses layanan dengan aturan yang berbeda.

    Ganti <IP_ADDRESS> dengan alamat IP yang Anda peroleh pada langkah sebelumnya.

    • Jalankan perintah berikut untuk mengakses layanan menggunakan Host: abc.ingress-regex.com:

      curl -H "Host: abc.ingress-regex.com" <IP_ADDRESS>/foo

      Output yang diharapkan:

      /foo
    • Jalankan perintah berikut untuk mengakses layanan menggunakan Host: 123.ingress-regex.com:

      curl -H "Host: 123.ingress-regex.com" <IP_ADDRESS>/foo

      Output yang diharapkan:

      /foo
    • Jalankan perintah berikut untuk mengakses layanan menggunakan Host: a1b1.ingress-regex.com:

      curl -H "Host: a1b1.ingress-regex.com" <IP_ADDRESS>/foo

      Output yang diharapkan:

      /foo

Rilis canary dengan anotasi

Anda dapat menerapkan rilis canary menggunakan anotasi. Untuk mengaktifkan fitur canary, Anda harus mengatur anotasi nginx.ingress.kubernetes.io/canary: "true". Kemudian, Anda dapat menggunakan anotasi yang berbeda untuk mengontrol traffic:

  • nginx.ingress.kubernetes.io/canary-weight: Menentukan persentase traffic (bilangan bulat dari 0 hingga 100) yang akan dirutekan ke layanan canary.

  • nginx.ingress.kubernetes.io/canary-by-header: Memisahkan traffic berdasarkan header permintaan. Jika nilai header yang dikonfigurasi adalah always, permintaan akan dirutekan ke layanan canary. Jika nilai header adalah never, permintaan tidak akan dirutekan ke layanan canary. Nilai header lainnya akan diabaikan, dan permintaan akan dirutekan ke layanan canary yang ditentukan oleh aturan lain berdasarkan prioritas canary.

  • nginx.ingress.kubernetes.io/canary-by-header-value dan nginx.ingress.kubernetes.io/canary-by-header: Ketika header dan header-value dalam permintaan sesuai dengan nilai yang ditentukan, traffic akan dirutekan ke layanan canary. Nilai header lainnya akan diabaikan, dan traffic akan dirutekan ke layanan canary yang ditentukan dalam aturan lain berdasarkan prioritas canary.

  • nginx.ingress.kubernetes.io/canary-by-cookie: Memisahkan traffic berdasarkan cookie. Jika nilai cookie yang ditentukan adalah always, traffic permintaan akan dirutekan ke layanan canary. Jika nilai cookie yang ditentukan adalah never, traffic permintaan tidak akan dirutekan ke layanan canary.

Contoh berikut menunjukkan cara mengonfigurasi beberapa anotasi ini. Untuk informasi selengkapnya, lihat Menggunakan controller NGINX Ingress untuk menerapkan rilis canary dan penyebaran biru-hijau.

  • Rilis canary berbasis bobot: Atur bobot layanan canary menjadi 20%.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-weight: "20"
  • Rilis canary berbasis header: Jika header permintaan adalah ack:always, permintaan akan dirutekan ke layanan canary. Jika header permintaan adalah ack:never, permintaan tidak akan dirutekan ke layanan canary. Untuk nilai header ack lainnya, traffic akan dirutekan ke layanan canary berdasarkan bobot canary.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-weight: "50"
        nginx.ingress.kubernetes.io/canary-by-header: "ack"
  • Rilis canary berbasis header (nilai header kustom): Jika header permintaan adalah ack:alibaba, permintaan akan dirutekan ke layanan canary. Untuk nilai header ack lainnya, traffic akan dirutekan ke layanan canary berdasarkan bobot canary.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-weight: "20"
        nginx.ingress.kubernetes.io/canary-by-header: "ack"
        nginx.ingress.kubernetes.io/canary-by-header-value: "alibaba"
  • Rilis canary berbasis cookie: Jika header tidak sesuai, dan cookie permintaan adalah hangzhou_region=always, permintaan akan dirutekan ke layanan canary.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-weight: "20"
        nginx.ingress.kubernetes.io/canary-by-header: "ack"
        nginx.ingress.kubernetes.io/canary-by-header-value: "alibaba"
        nginx.ingress.kubernetes.io/canary-by-cookie: "hangzhou_region"
Catatan
  • Rilis canary berbasis cookie hanya mendukung nilai always dan never. Fitur ini tidak mendukung nilai kustom.

  • Prioritas aturan canary adalah sebagai berikut (dari tertinggi ke terendah): berbasis header > berbasis cookie > berbasis bobot.

Sertifikat HTTPS gratis dengan cert-manager

cert-manager adalah alat manajemen sertifikat open source yang secara otomatis menyediakan dan memperpanjang sertifikat HTTPS dalam kluster Kubernetes. Contoh berikut menunjukkan cara menggunakan cert-manager untuk mengajukan sertifikat gratis dan mengaktifkan perpanjangan otomatis.

Penting

cert-manager adalah komponen open source dan tidak dikelola oleh ACK. Gunakan dengan hati-hati di lingkungan produksi. Untuk melakukan upgrade cert-manager, lihat Upgrading cert-manager.

  1. Jalankan perintah berikut untuk men-deploy cert-manager.

    kubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml
  2. Jalankan perintah berikut untuk memeriksa status pod.

    kubectl get pods -n cert-manager

    Output yang diharapkan:

    NAME                     READY   STATUS    RESTARTS   AGE
    cert-manager-1           1/1     Running   0          2m11s
    cert-manager-cainjector  1/1     Running   0          2m11s
    cert-manager-webhook     1/1     Running   0          2m10s
  3. Buat ClusterIssuer menggunakan templat berikut.

    apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
      name: letsencrypt-prod-http01
    spec:
      acme:
        server: https://acme-v02.api.letsencrypt.org/directory
        email: <your_email_n***@gmail.com>  # Ganti ini dengan alamat email Anda.
        privateKeySecretRef:
          name: letsencrypt-http01
        solvers:
        - http01: 
            ingress:
              class: nginx
  4. Jalankan perintah berikut untuk memeriksa status ClusterIssuer.

    kubectl get clusterissuer

    Output yang diharapkan:

    NAME                         READY   AGE
    letsencrypt-prod-http01      True    17s
  5. Buat objek resource Nginx Ingress.

    Kubernetes 1.19 dan yang lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-tls
      annotations:
        kubernetes.io/ingress.class: "nginx"
        cert-manager.io/cluster-issuer: "letsencrypt-prod-http01"
    spec:
      tls:
      - hosts:
        - <YOUR_DOMAIN_NAME>        # Ganti ini dengan nama domain Anda.
        secretName: ingress-tls   
      rules:
      - host: <YOUR_DOMAIN_NAME>    # Ganti ini dengan nama domain Anda.
        http:
          paths:
          - path: /
            backend:
              service:
                name: <YOUR_SERVICE_NAME>  # Ganti ini dengan nama layanan backend Anda.
                port: 
                  number: <YOUR_SERVICE_PORT>  # Ganti ini dengan port layanan Anda.
            pathType: ImplementationSpecific

    Kubernetes sebelum 1.19

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: ingress-tls
      annotations:
        kubernetes.io/ingress.class: "nginx"
        cert-manager.io/cluster-issuer: "letsencrypt-prod-http01"
    spec:
      tls:
      - hosts:
        - <YOUR_DOMAIN_NAME>        # Ganti ini dengan nama domain Anda.
        secretName: ingress-tls   
      rules:
      - host: <YOUR_DOMAIN_NAME>    # Ganti ini dengan nama domain Anda.
        http:
          paths:
          - path: /
            backend:
              serviceName: <YOUR_SERVICE_NAME>  # Ganti ini dengan nama layanan backend Anda.
              servicePort: <YOUR_SERVICE_PORT>  # Ganti ini dengan port layanan Anda.
    Catatan

    Nama domain yang Anda tentukan untuk <YOUR_DOMAIN_NAME> harus memenuhi kondisi berikut:

    • Panjang nama domain tidak boleh melebihi 64 karakter.

    • Nama domain wildcard tidak didukung.

    • Domain harus dapat diakses dari internet melalui HTTP.

  6. Jalankan perintah berikut untuk memeriksa status sertifikat:

    kubectl get cert

    Output yang diharapkan:

    NAME          READY   SECRET        AGE
    ingress-tls   True    ingress-tls   52m
    Catatan

    Jika status READY bukan True, Anda dapat menjalankan kubectl describe cert ingress-tls untuk melihat detail pemrosesan sertifikat.

  7. Jalankan perintah berikut untuk memeriksa Secret:

    kubectl get secret  ingress-tls

    Output yang diharapkan:

    NAME          TYPE                DATA   AGE
    ingress-tls   kubernetes.io/tls   2      2m
  8. Buka browser web Anda dan masukkan https://<YOUR_DOMAIN_NAME> untuk mengakses domain Anda.

Pengalihan HTTP ke HTTPS

Anda dapat memaksakan pengalihan traffic HTTP ke HTTPS dengan menambahkan anotasi nginx.ingress.kubernetes.io/ssl-redirect ke NGINX Ingress Anda. Berikut adalah contohnya:

Kubernetes 1.19 dan yang lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true" # Paksa pengalihan traffic HTTP ke HTTPS.

Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true" # Paksa pengalihan traffic HTTP ke HTTPS.