全部产品
Search
文档中心

Container Service for Kubernetes:Konfigurasi NGINX Ingress lanjutan

更新时间:Feb 27, 2026

Dalam kluster Kubernetes, NGINX Ingress mengelola akses eksternal ke layanan dan menyediakan Load balancing lapisan 7. 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 perutean aman, menyiapkan Otentikasi timbal balik HTTPS, menggunakan ekspresi reguler dan Nama domain wildcard, serta meminta sertifikat HTTPS gratis.

Prasyarat

Instruksi konfigurasi

Metode konfigurasi untuk controller NGINX Ingress di Container Service for Kubernetes (ACK) sepenuhnya kompatibel dengan komunitas open source. Untuk informasi selengkapnya tentang konfigurasi tersebut, lihat NGINX Configuration.

Tiga metode konfigurasi berikut didukung:

  • Berdasarkan Anotasi: Anda dapat mengonfigurasi anotasi dalam File YAML setiap NGINX Ingress. Konfigurasi hanya berlaku untuk Ingress tersebut. Untuk informasi selengkapnya, lihat Annotations.

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

  • Templat NGINX kustom: Anda dapat menggunakan metode ini jika memiliki kebutuhan konfigurasi khusus untuk templat NGINX internal controller NGINX Ingress dan metode berbasis anotasi maupun ConfigMap tidak memenuhi kebutuhan Anda. Untuk informasi selengkapnya, lihat Custom NGINX template.

Konfigurasikan layanan perutean untuk Pengalihan URL

Saat menggunakan controller NGINX Ingress, NGINX meneruskan permintaan berdasarkan path permintaan lengkap. Misalnya, controller NGINX Ingress meneruskan permintaan untuk path /service1/api langsung ke path /service1/api pada Pod backend. Jika path layanan backend Anda adalah /api, kode status 404 dikembalikan karena path-nya salah. Dalam kasus ini, Anda dapat mengonfigurasi anotasi nginx.ingress.kubernetes.io/rewrite-target untuk menulis ulang path permintaan ke direktori yang benar.

Buat NGINX Ingress berdasarkan versi kluster.

Kluster yang menjalankan Kubernetes 1.19 atau 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:
    # Jika versi controller Ingress adalah 0.22.0 atau lebih baru, Anda harus menggunakan ekspresi reguler untuk mendefinisikan path di field path dan menggunakannya bersama capturing group dalam anotasi rewrite-target.
      - path: /svc(/|$)(.*)
        backend:
          service: 
            name: web1-service
            port: 
              number: 80
        pathType: ImplementationSpecific

Kluster yang menjalankan versi 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:
      # Jika versi controller Ingress adalah 0.22.0 atau lebih baru, Anda harus menggunakan ekspresi reguler untuk mendefinisikan path di field path dan menggunakannya bersama capturing group 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

Konfigurasi penulisan ulang

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

Untuk kebutuhan penulisan ulang yang kompleks dan lanjutan, Anda dapat menggunakan anotasi berikut:

  • nginx.ingress.kubernetes.io/server-snippet: Menambahkan potongan konfigurasi ke bagian Server.

  • nginx.ingress.kubernetes.io/configuration-snippet: Menambahkan konfigurasi ke bagian Location.

Kedua anotasi ini menambahkan potongan kode kustom ke blok server NGINX komponen Ingress, sehingga memberikan fleksibilitas untuk memperluas dan menyesuaikan konfigurasi NGINX dalam berbagai skenario.

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 controller NGINX Ingress.

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

Konfigurasi contoh menghasilkan file nginx.conf 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 instruksi rewrite, lihat dokumentasi resmi NGINX.

Konfigurasikan sertifikat HTTPS untuk aturan perutean

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

  1. Siapkan sertifikat layanan Anda.

    Catatan

    Nama domain harus sesuai dengan host yang Anda konfigurasi. Jika tidak, controller NGINX Ingress tidak dapat memuat sertifikat dengan benar.

    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.

      Buat secret Kubernetes bernama tls-test-ingress dari sertifikat dan kunci privat. Anda harus mereferensikan secret ini saat membuat Ingress.

      kubectl create secret tls tls-test-ingress --key tls.key --cert tls.crt
  2. Jalankan perintah berikut untuk membuat resource Ingress dan gunakan field tls untuk mereferensikan secret yang Anda buat pada langkah sebelumnya.

    Kluster yang menjalankan Kubernetes 1.19 atau 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 yang menjalankan versi 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 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

Dalam beberapa kasus, Anda mungkin perlu mengonfigurasi Otentikasi timbal balik HTTPS antara server dan klien untuk memastikan keamanan koneksi. Controller NGINX Ingress 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 sisi server.

    1. Jalankan perintah berikut untuk menghasilkan file permintaan untuk sertifikat sisi 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 untuk menandatangani file permintaan sisi server dan menghasilkan sertifikat sisi 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 sisi klien.

    1. Hasilkan file permintaan untuk sertifikat sisi 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 untuk menandatangani file permintaan sisi 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. Anda dapat menjalankan 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 kasus penggunaan NGINX Ingress uji coba.

    Kluster yang menjalankan Kubernetes 1.19 atau 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 yang menjalankan versi 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 pada field ADDRESS adalah alamat IP Ingress, seperti yang ditunjukkan pada output berikut.

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

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

    Verifikasi:

    • 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>
    • Akses menggunakan 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 permintaan ke kontainer backend melalui HTTPS

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

Berikut adalah contoh konfigurasi NGINX Ingress:

Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: backend-https
  annotations:
    # Catatan: Anda harus menentukan bahwa layanan backend adalah layanan 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 yang menjalankan versi Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: backend-https
  annotations:
    # Catatan: Anda harus menentukan bahwa layanan backend adalah layanan 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 mendukung ekspresi reguler untuk konfigurasi nama domain. Namun, Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/server-alias untuk mengaktifkan fitur ini.

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

    Kluster yang menjalankan Kubernetes 1.19 atau 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 yang menjalankan versi 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. Lihat 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. Field Server_Name pada output menunjukkan konfigurasi yang efektif.

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

Konfigurasikan nama domain untuk mendukung generalisasi

Dalam kluster Kubernetes, resource NGINX Ingress mendukung Nama domain wildcard. Misalnya, Anda dapat mengonfigurasi nama domain wildcard *.ingress-regex.com.

  1. Terapkan templat berikut untuk membuat NGINX Ingress.

    Kluster yang menjalankan Kubernetes 1.19 atau 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 yang menjalankan versi 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 melihat konfigurasi controller NGINX Ingress yang sesuai. Anda dapat menemukan konfigurasi yang efektif di field 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 Pod NGINX Ingress di lingkungan Anda.

    Output yang diharapkan:

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

    Pada versi controller NGINX Ingress yang lebih baru, output yang diharapkan adalah:

    ## 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 mengambil 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 dalam aturan berbeda.

    Ganti IP_ADDRESS dengan alamat IP yang Anda ambil 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

Implementasikan rilis bertahap menggunakan anotasi

Anda dapat mengimplementasikan rilis bertahap dengan mengonfigurasi anotasi. Untuk mengaktifkan fitur rilis bertahap, atur anotasi nginx.ingress.kubernetes.io/canary: "true". Gunakan anotasi berikut untuk mengimplementasikan strategi rilis bertahap yang berbeda:

  • nginx.ingress.kubernetes.io/canary-weight: Menentukan persentase permintaan yang diarahkan ke layanan target. Nilainya adalah bilangan bulat dari 0 hingga 100.

  • nginx.ingress.kubernetes.io/canary-by-header: Mengarahkan trafik berdasarkan header permintaan. Ketika nilai header yang dikonfigurasi adalah always, seluruh trafik diarahkan ke Titik akhir layanan rilis bertahap. Ketika nilai header adalah never, tidak ada trafik yang diarahkan ke layanan rilis bertahap. Nilai header lainnya diabaikan, dan trafik diarahkan ke layanan rilis bertahap lainnya sesuai prioritas aturan.

  • nginx.ingress.kubernetes.io/canary-by-header-value dan nginx.ingress.kubernetes.io/canary-by-header: Mengarahkan trafik ke Titik akhir layanan rilis bertahap ketika header dan header-value permintaan sesuai dengan nilai yang dikonfigurasi. Nilai header lainnya diabaikan, dan trafik diarahkan ke layanan rilis bertahap lainnya sesuai prioritas aturan.

  • nginx.ingress.kubernetes.io/canary-by-cookie: Mengarahkan trafik berdasarkan cookie. Ketika nilai cookie yang dikonfigurasi adalah always, seluruh trafik diarahkan ke Titik akhir layanan rilis bertahap. Ketika nilai cookie yang dikonfigurasi adalah never, tidak ada trafik yang diarahkan ke Titik akhir layanan rilis bertahap.

Contoh berikut menunjukkan konfigurasi anotasi umum. Untuk informasi selengkapnya, lihat Gunakan NGINX Ingress untuk mengimplementasikan rilis bertahap dan penyebaran biru-hijau.

  • Rilis bertahap berbasis bobot: Atur 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: Ketika header permintaan adalah ack:always, arahkan permintaan ke layanan rilis bertahap. Ketika header permintaan adalah ack:never, jangan arahkan permintaan ke layanan rilis bertahap. Untuk header lainnya, alokasikan trafik 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 dengan nilai header kustom: Ketika header permintaan adalah ack:alibaba, arahkan permintaan ke layanan rilis bertahap. Untuk header lainnya, alokasikan trafik 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 permintaan tidak sesuai dengan aturan apa pun, dan cookie permintaan adalah hangzhou_region=always, arahkan permintaan ke 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 hanya mendukung nilai always dan never.

  • Prioritas aturan rilis bertahap, dari tertinggi ke terendah: berbasis header, berbasis cookie, berbasis bobot.

Gunakan cert-manager untuk mengajukan sertifikat HTTPS gratis

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

Penting

cert-manager adalah komponen open source. ACK tidak memelihara komponen ini. Gunakan dengan hati-hati di lingkungan produksi. Untuk meningkatkan 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 melihat 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@example.com>  # Ganti ini 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 objek resource NGINX Ingress.

    Kluster yang menjalankan Kubernetes 1.19 atau 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

    Kluster yang menjalankan versi 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 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, Anda dapat menjalankan 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. Di browser web, masukkan https://[your_website_domain] untuk mengakses nama domain yang dikonfigurasi.

Konfigurasikan pengalihan HTTP ke HTTPS

Anotasi nginx.ingress.kubernetes.io/ssl-redirect dalam NGINX Ingress dapat memaksa trafik HTTP dialihkan ke HTTPS. Contoh berikut menunjukkan konfigurasi ini:

Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster yang menjalankan versi Kubernetes sebelum 1.19

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