全部产品
Search
文档中心

Container Service for Kubernetes:Konfigurasi Nginx Ingress lanjutan

更新时间:Jan 22, 2026

Dalam kluster Kubernetes, Nginx Ingress menyediakan Load balancing lapisan 7 dan mengelola akses eksternal ke layanan. Anda dapat menggunakan Nginx Ingress untuk mengonfigurasi URL yang dapat diakses dari luar, aturan penulisan ulang, layanan HTTPS, serta fitur rilis bertahap. Topik ini menjelaskan cara mengonfigurasi layanan perutean aman, mengaktifkan otentikasi timbal balik HTTPS, menggunakan ekspresi reguler dan nama domain wildcard, serta meminta sertifikat HTTPS gratis.

Prasyarat

Petunjuk konfigurasi

Metode konfigurasi untuk Nginx Ingress Controller di Container Service for Kubernetes sepenuhnya kompatibel dengan versi komunitas. Untuk daftar lengkap konfigurasi, lihat NGINX Configuration.

Ini mendukung tiga metode konfigurasi berikut:

  • Berdasarkan Anotasi: Anda dapat menambahkan konfigurasi ke bagian `annotations` dalam file YAML Nginx Ingress. Konfigurasi ini hanya berlaku untuk Nginx Ingress tertentu tersebut. Untuk informasi selengkapnya, lihat Annotations.

  • Berdasarkan ConfigMap: Anda dapat mengonfigurasi pengaturan global yang berlaku untuk semua Nginx Ingress menggunakan ConfigMap `kube-system/nginx-configuration`. Untuk informasi selengkapnya, lihat ConfigMaps.

  • Templat NGINX kustom: Anda dapat menggunakan metode ini jika anotasi atau ConfigMap tidak memenuhi kebutuhan Anda terhadap templat internal NGINX pada Nginx Ingress Controller. Untuk informasi selengkapnya, lihat Custom NGINX template.

Konfigurasikan layanan perutean untuk Pengalihan URL

Saat menggunakan Nginx Ingress Controller, Nginx meneruskan path lengkap ke backend. Misalnya, permintaan ke path /service1/api melalui Ingress diteruskan langsung ke path /service1/api pada pod backend. Jika path layanan backend Anda adalah /api, terjadi ketidaksesuaian path yang menghasilkan kode status 404. Dalam kasus ini, Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/rewrite-target untuk menulis ulang path ke direktori yang diperlukan.

Buat Nginx Ingress berdasarkan versi kluster Anda.

Kluster versi 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 Ingress Controller 0.22.0 dan yang lebih baru, Anda harus mendefinisikan path menggunakan ekspresi reguler dan menggunakannya bersama capturing group dalam rewrite-target.
      - path: /svc(/|$)(.*)
        backend:
          service: 
            name: web1-service
            port: 
              number: 80
        pathType: ImplementationSpecific

Kluster versi 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 Ingress Controller 0.22.0 dan yang lebih baru, Anda harus mendefinisikan path menggunakan ekspresi reguler dan menggunakannya bersama capturing group dalam 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

Konfigurasi penulisan ulang

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

Untuk kebutuhan penulisan ulang yang lebih kompleks dan lanjutan, gunakan 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`.

Kedua anotasi ini menambahkan potongan kode kustom ke blok `server` Nginx pada komponen Ingress, sehingga memberikan fleksibilitas untuk menyesuaikan konfigurasi Nginx sesuai skenario yang berbeda.

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 komponen Nginx Ingress Controller.

kubectl exec nginx-ingress-controller-xxxxx --namespace kube-system -- cat /etc/nginx/nginx.conf   # Ubah nama pod sesuai lingkungan Anda.

File nginx.conf berikut dihasilkan dari contoh konfigurasi tersebut.

# 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

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

Untuk informasi selengkapnya tentang instruksi rewrite, lihat dokumentasi resmi Nginx.

Konfigurasikan sertifikat HTTPS untuk aturan perutean

Anda dapat menggunakan semantik Ingress native untuk mengonfigurasi sertifikat HTTPS bagi situs web Anda.

  1. Siapkan sertifikat layanan Anda.

    Catatan

    Nama domain harus sesuai dengan host yang dikonfigurasi. Jika tidak, Nginx Ingress Controller tidak dapat memuat sertifikat tersebut.

    1. Jalankan perintah berikut untuk menghasilkan file sertifikat tls.crt dan file kunci privat 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.

      Perintah ini menggunakan sertifikat dan kunci privat untuk membuat Secret Kubernetes bernama `tls-test-ingress`. Anda harus mereferensikan Secret ini saat membuat Ingress.

      kubectl create secret tls tls-test-ingress --key tls.key --cert tls.crt
  2. Buat resource Ingress yang mereferensikan Secret dari langkah sebelumnya di bidang `tls`.

    Kluster versi 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 sesuai dengan sertifikat. 
        secretName: tls-test-ingress
      rules:
      - host: tls-test-ingress.com
        http:
          paths:
          - path: /foo
            backend:
              service:
                name: web1-svc
                port:
                  number: 80
            pathType: ImplementationSpecific

    Kluster versi 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 sesuai dengan sertifikat.
        secretName: tls-test-ingress
      rules:
      - host: tls-test-ingress.com
        http:
          paths:
          - path: /foo
            backend:
              serviceName: web1-svc
              servicePort: 80
  3. Konfigurasikan file hosts atau gunakan nama domain asli untuk mengakses layanan TLS.

    Anda dapat mengakses layanan web1-svc di https://tls-test-ingress.com/foo.

Konfigurasikan otentikasi timbal balik HTTPS

Untuk meningkatkan keamanan, Anda dapat mengonfigurasi otentikasi HTTPS timbal balik antara server dan klien. Nginx Ingress Controller mendukung fitur ini melalui anotasi.

  1. Jalankan perintah berikut untuk membuat sertifikat CA self-signed.

    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. Jalankan perintah berikut untuk membuat sertifikat server.

    1. Jalankan perintah berikut untuk menghasilkan file 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 file 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. Jalankan perintah berikut untuk membuat sertifikat klien.

    1. Hasilkan file CSR untuk sertifikat klien.

      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 file CSR klien dan menghasilkan sertifikat klien.

      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 sertifikat yang telah 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. Terapkan templat berikut untuk membuat Nginx Ingress uji coba.

    Kluster versi 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

    Kluster versi 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 Ingress ditampilkan di kolom `ADDRESS` pada output.

    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`. Ganti alamat IP dengan alamat IP aktual Ingress.

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

    Verification:

    • Akses tanpa sertifikat klien

      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>
    • Otentikasi dengan sertifikat klien

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

      Output yang diharapkan:

      <!DOCTYPE html>
      <html>
      <head>
      <title>Welcome to nginx!</title>
      <style>
          body {
              width: 35em;
              margin: 0 auto;
              font-family: Tahoma, Verdana, Arial, sans-serif;
          }
      </style>
      </head>
      <body>
      <h1>Welcome to nginx!</h1>
      <p>If you see this page, the nginx web server is successfully installed and
      working. Further configuration is required.</p>
      
      <p>For online documentation and support please refer to
      <a href="http://nginx.org/">nginx.org</a>.<br/>
      Commercial support is available at
      <a href="http://nginx.com/">nginx.com</a>.</p>
      
      <p>Thank you for using nginx.</p>
      </body>
      </html>

Konfigurasikan layanan HTTPS untuk meneruskan traffic ke kontainer backend melalui HTTPS

Secara default, Nginx Ingress Controller meneruskan permintaan ke kontainer aplikasi backend melalui HTTP. Jika kontainer aplikasi Anda menggunakan HTTPS, Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" untuk mengonfigurasi Nginx Ingress Controller agar meneruskan permintaan melalui HTTPS.

Berikut adalah contoh konfigurasi Nginx Ingress:

Kluster versi 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

Kluster versi 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>

Konfigurasikan nama domain untuk mendukung ekspresi reguler

Dalam kluster Kubernetes, resource Ingress tidak secara native mendukung ekspresi reguler untuk nama domain. Namun, Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/server-alias untuk mengaktifkan fungsionalitas ini.

  1. Terapkan templat berikut, yang menggunakan ekspresi reguler ~^www\.\d+\.example\.com sebagai contoh.

    Kluster versi 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

    Kluster versi 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. Lihat konfigurasi Nginx Ingress Controller.

    1. Jalankan perintah berikut untuk melihat pod tempat layanan Nginx Ingress Controller dideploy.

      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 Nginx Ingress Controller. Konfigurasi efektif berada di bidang `Server_Name`.

      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 berbeda.

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

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

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

      Output yang diharapkan:

      /foo
    • Jalankan perintah berikut untuk mengakses layanan dengan 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 dengan Host: www.321.example.com.

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

      Output yang diharapkan:

      /foo

Konfigurasikan nama domain untuk mendukung wildcard

Resource Nginx Ingress dalam kluster Kubernetes mendukung nama domain wildcard, seperti *.ingress-regex.com.

  1. Terapkan templat berikut untuk membuat Nginx Ingress.

    Kluster versi 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

    Kluster versi 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 melihat konfigurasi Nginx Ingress Controller. Konfigurasi efektif berada di bidang `Server_Name`.

    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 nginx-ingress Anda.

    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 pada versi Nginx Ingress Controller 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 berbeda.

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

    • Jalankan perintah berikut untuk mengakses layanan dengan 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 dengan 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 dengan Host: a1b1.ingress-regex.com.

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

      Output yang diharapkan:

      /foo

Implementasikan rilis bertahap menggunakan anotasi

Anda dapat mengimplementasikan rilis bertahap menggunakan anotasi. Untuk mengaktifkan rilis bertahap, tetapkan anotasi nginx.ingress.kubernetes.io/canary: "true". Anda dapat menggunakan anotasi berikut untuk mengimplementasikan fitur rilis bertahap yang berbeda:

  • nginx.ingress.kubernetes.io/canary-weight: Menetapkan persentase permintaan yang akan diarahkan ke layanan tertentu. Nilainya berupa bilangan bulat dari 0 hingga 100.

  • nginx.ingress.kubernetes.io/canary-by-header: Membagi traffic berdasarkan header permintaan. Ketika nilai header yang dikonfigurasi adalah always, traffic permintaan diarahkan ke titik akhir rilis bertahap. Ketika nilai header adalah never, traffic permintaan tidak diarahkan ke layanan rilis bertahap. Nilai header lainnya diabaikan, dan traffic diarahkan ke layanan rilis bertahap lainnya berdasarkan prioritas.

  • 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 ditetapkan, traffic permintaan diarahkan ke titik akhir rilis bertahap. Nilai header lainnya diabaikan, dan traffic diarahkan ke layanan rilis bertahap lainnya berdasarkan prioritas.

  • nginx.ingress.kubernetes.io/canary-by-cookie: Membagi traffic berdasarkan cookie. Ketika nilai cookie yang dikonfigurasi adalah always, traffic permintaan diarahkan ke titik akhir rilis bertahap. Ketika nilai cookie yang dikonfigurasi adalah never, traffic permintaan tidak diarahkan ke titik akhir rilis bertahap.

Berikut adalah beberapa contoh konfigurasi anotasi. Untuk informasi selengkapnya, lihat Gunakan Nginx Ingress untuk mengimplementasikan rilis bertahap dan penyebaran biru-hijau.

  • Rilis bertahap berbasis bobot: Tetapkan bobot layanan rilis bertahap 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 bertahap berbasis header: Permintaan dengan header ack:always mengakses layanan rilis bertahap. Permintaan dengan header ack:never tidak mengakses layanan rilis bertahap. Header lainnya mengarahkan traffic ke layanan rilis bertahap berdasarkan bobot.

    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 bertahap berbasis header (nilai header kustom): Permintaan dengan header ack:alibaba mengakses layanan rilis bertahap. Header lainnya mengarahkan traffic ke layanan rilis bertahap berdasarkan bobot.

    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 bertahap berbasis cookie: Jika header tidak cocok, permintaan dengan cookie hangzhou_region=always mengakses layanan rilis bertahap.

    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 bertahap berbasis cookie tidak mendukung nilai kustom, hanya always dan never.

  • Prioritas aturan rilis bertahap dievaluasi dalam urutan berikut, dari tertinggi ke terendah: Berbasis Header, Berbasis Cookie, dan Berbasis Bobot.

Gunakan cert-manager untuk meminta sertifikat HTTPS gratis

cert-manager adalah tool manajemen sertifikat open source yang menyediakan dan memperbarui sertifikat HTTPS secara otomatis dalam kluster. Contoh berikut menunjukkan cara menggunakan cert-manager untuk meminta sertifikat gratis dan mengaktifkan pembaruan otomatis.

Penting

cert-manager adalah komponen open source yang tidak dipelihara oleh ACK. Gunakan dengan hati-hati di lingkungan produksi. Untuk memperbarui versi, lihat Upgrading cert-manager.

  1. Jalankan perintah berikut untuk menerapkan 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. Gunakan templat berikut untuk membuat ClusterIssuer.

    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 dengan alamat email Anda.
        privateKeySecretRef:
          name: letsencrypt-http01
        solvers:
        - http01: 
            ingress:
              class: nginx
  4. Jalankan perintah berikut untuk melihat ClusterIssuer.

    kubectl get clusterissuer

    Output yang diharapkan:

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

    Kluster versi 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 dengan nama domain Anda.
        secretName: ingress-tls   
      rules:
      - host: <YOUR_DOMAIN_NAME>    # Ganti dengan nama domain Anda.
        http:
          paths:
          - path: /
            backend:
              service:
                name: <YOUR_SERVICE_NAME>  # Ganti dengan nama layanan backend Anda.
                port: 
                  number: <YOUR_SERVICE_PORT>  # Ganti dengan port layanan Anda.
            pathType: ImplementationSpecific

    Kluster versi 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 dengan nama domain Anda.
        secretName: ingress-tls   
      rules:
      - host: <YOUR_DOMAIN_NAME>    # Ganti dengan nama domain Anda.
        http:
          paths:
          - path: /
            backend:
              serviceName: <YOUR_SERVICE_NAME>  # Ganti dengan nama layanan backend Anda.
              servicePort: <YOUR_SERVICE_PORT>  # Ganti dengan port layanan Anda.
    Catatan

    Nama domain yang Anda gunakan untuk mengganti your_domain_name harus memenuhi kondisi berikut:

    • Nama domain tidak boleh melebihi 64 karakter.

    • Nama domain wildcard tidak didukung.

    • Dapat diakses melalui jaringan publik menggunakan protokol HTTP.

  6. Jalankan perintah berikut untuk melihat sertifikat.

    kubectl get cert

    Output yang diharapkan:

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

    Jika status READY bukan True, jalankan kubectl describe cert ingress-tls untuk melihat prosedur pemrosesan sertifikat.

  7. Jalankan perintah berikut untuk melihat Secret.

    kubectl get secret  ingress-tls

    Output yang diharapkan:

    NAME          TYPE                DATA   AGE
    ingress-tls   kubernetes.io/tls   2      2m
  8. Masukkan https://[nama domain Anda] di browser web untuk mengakses nama domain yang dikonfigurasi.

Konfigurasikan pengalihan HTTP ke HTTPS

Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/ssl-redirect untuk Nginx Ingress guna memaksa traffic HTTP dialihkan ke HTTPS. Berikut adalah contohnya:

Kluster versi 1.19 dan yang lebih baru

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

Kluster versi sebelum 1.19

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