全部产品
Search
文档中心

Container Service for Kubernetes:Konfigurasi Ingress Lanjutan

更新时间:Jul 02, 2025

NGINX Ingress adalah objek API yang menyediakan load balancing lapisan 7 untuk mengelola akses eksternal ke Layanan dalam kluster Kubernetes. NGINX Ingress memungkinkan Anda mengonfigurasi URL untuk akses eksternal, menulis ulang jalur URL permintaan, mengonfigurasi layanan HTTPS, dan melakukan rilis canary. Topik ini menjelaskan cara mengonfigurasi transmisi data aman, menetapkan autentikasi TLS bersama, menggunakan ekspresi reguler untuk menentukan nama domain, menggunakan nama domain wildcard, mengajukan sertifikat TLS gratis, dan menyesuaikan fitur terkait lainnya.

Prasyarat

Konfigurasi NGINX

Metode yang digunakan untuk mengonfigurasi kontroler NGINX Ingress di ACK sepenuhnya kompatibel dengan versi sumber terbuka dari komponen tersebut. Untuk informasi lebih lanjut tentang metode konfigurasi, lihat Konfigurasi NGINX.

Metode konfigurasi berikut didukung:

  • Anotasi: Anda dapat memodifikasi anotasi dalam template YAML setiap NGINX Ingress. Anotasi tersebut berlaku pada masing-masing NGINX Ingress. Untuk informasi lebih lanjut, lihat Anotasi.

  • ConfigMap: Anda dapat memodifikasi ConfigMap kube-system/nginx-configuration untuk mengonfigurasi semua NGINX Ingress. Untuk informasi lebih lanjut, lihat ConfigMaps.

  • Template NGINX kustom: Anda dapat menyesuaikan template NGINX dari kontroler NGINX Ingress jika metode sebelumnya tidak dapat memenuhi kebutuhan Anda. Untuk informasi lebih lanjut, lihat Template NGINX Kustom.

Konfigurasikan Pengalihan URL

Setelah mengonfigurasi kontroler NGINX Ingress, kontroler akan meneruskan permintaan berdasarkan jalur penuh dari permintaan tersebut. Sebagai contoh, kontroler meneruskan permintaan yang ditujukan untuk /service1/api ke /service1/api/ pod backend. Jika jalur layanan backend Anda adalah /api, kode status 404 akan dikembalikan karena jalur layanan backend berbeda dari jalur yang diminta. Dalam hal ini, Anda dapat mengonfigurasi anotasi nginx.ingress.kubernetes.io/rewrite-target untuk menulis ulang jalur yang diminta ke jalur yang ingin Anda gunakan.

Buat NGINX Ingress menggunakan template berikut:

Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

cat <<-EOF | kubectl apply -f -
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 kontroler Ingress adalah 0.22.0 atau lebih baru, Anda harus menggunakan ekspresi reguler untuk menentukan jalur dan menggunakan ekspresi reguler tersebut bersama dengan grup tangkapan dalam anotasi rewrite-target.
      - path: /svc(/|$)(.*)
        backend:
          service: 
            name: web1-service
            port: 
              number: 80
        pathType: ImplementationSpecific
EOF

Kluster yang menjalankan Kubernetes versi lebih lama dari 1.19

cat <<-EOF | kubectl apply -f -
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 kontroler Ingress adalah 0.22.0 atau lebih baru, Anda harus menggunakan ekspresi reguler untuk menentukan jalur dan menggunakan ekspresi reguler tersebut bersama dengan grup tangkapan dalam anotasi rewrite-target.
      - path: /svc(/|$)(.*)
        backend:
          serviceName: web1-service
          servicePort: 80
EOF
  1. Akses layanan NGINX.

    1. Jalankan perintah berikut untuk mendapatkan nilai 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 dari Ingress yang Anda peroleh:

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

      Output yang diharapkan:

      web1: /foo

Konfigurasikan Aturan Penulisan Ulang

Anotasi nginx.ingress.kubernetes.io/rewrite-target dapat digunakan untuk mengonfigurasi aturan penulisan ulang dasar. Untuk informasi lebih lanjut, lihat Konfigurasikan Pengalihan URL.

Untuk mengonfigurasi aturan penulisan ulang tingkat lanjut, gunakan anotasi berikut:

  • nginx.ingress.kubernetes.io/server-snippet: Anotasi ini menambahkan konfigurasi kustom ke blok konfigurasi Server.

  • nginx.ingress.kubernetes.io/configuration-snippet: Anotasi ini menambahkan konfigurasi kustom ke blok konfigurasi Location.

Anotasi ini menambahkan potongan kode kustom ke modul server NGINX dari Ingress. Ini memungkinkan Anda memperluas dan menyesuaikan konfigurasi NGINX untuk memenuhi persyaratan bisnis dalam berbagai skenario.

Contoh:

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 menanyakan file konfigurasi NGINX dari kontroler NGINX Ingress:

kubectl exec nginx-ingress-controller-xxxxx --namespace kube-system -- cat /etc/nginx/nginx.conf /# Modifikasi nama pod berdasarkan kebutuhan bisnis Anda

Berikut adalah contoh konfigurasi file nginx.conf:

# mulai 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;
      ...
    }
    # akhir server foo.bar.com

Selain itu, snippet mendukung beberapa konfigurasi global. Untuk informasi lebih lanjut, lihat server-snippet.

Untuk informasi lebih lanjut tentang cara menggunakan aturan rewrite, lihat Deskripsi aturan rewrite dalam dokumen resmi NGINX.

Konfigurasikan Sertifikat TLS untuk Aturan Ingress

Anda dapat mengonfigurasi konfigurasi NGINX Ingress untuk menentukan sertifikat TLS untuk situs web.

  1. Persiapkan sertifikat Anda.

    Catatan

    Nama domain yang terkait dengan sertifikat harus sama dengan host yang Anda tentukan. Jika tidak, kontroler NGINX Ingress tidak dapat memuat sertifikat TLS.

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

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

      kubectl create secret tls tls-test-ingress --key tls.key --cert tls.crt
  2. Jalankan perintah berikut untuk membuat Ingress dan gunakan bidang tls untuk merujuk Secret yang dibuat pada langkah sebelumnya.

    Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

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

    Kluster yang menjalankan versi Kubernetes lebih lama dari 1.19

    cat <<EOF | kubectl create -f - 
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: test-test-ingress
    spec:
      # Rujuk sertifikat TLS.
      tls:
      - hosts:
        - foo.bar.com # Nama domain yang terkait dengan sertifikat TLS. 
        secretName: tls-test-ingress
      rules:
      - host: tls-test-ingress.com
        http:
          paths:
          - path: /foo
            backend:
              serviceName: web1-svc
              servicePort: 80
    EOF
  3. Setelah Ingress dibuat, Anda harus memodifikasi file hosts atau menentukan nama domain aktual sebelum Anda dapat menggunakan TLS untuk mengamankan transmisi data.

    Anda dapat mengakses Layanan web1-svc menggunakan https://tls-test-ingress.com/foo.

Konfigurasikan Autentikasi TLS Bersama

Kontroler NGINX Ingress mendukung autentikasi TLS bersama. Anda mungkin ingin mengonfigurasi autentikasi TLS bersama antara server dan klien untuk memastikan keamanan koneksi dalam skenario tertentu.

  1. Jalankan perintah berikut untuk membuat sertifikat otoritas sertifikat tanda tangan sendiri (CA):

    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 file yang digunakan untuk meminta 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 untuk menandatangani file 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 klien.

    1. Jalankan perintah berikut untuk menghasilkan file yang digunakan untuk meminta 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 untuk menandatangani file 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 menanyakan file 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 berdasarkan sertifikat CA yang telah dibuat:

    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 berdasarkan sertifikat server yang telah dibuat:

    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. Jalankan perintah berikut untuk membuat NGINX Ingress untuk tujuan pengujian.

    Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

    cat <<-EOF | kubectl apply -f -
    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
    EOF

    Kluster yang menjalankan versi Kubernetes lebih lama dari 1.19

    cat <<-EOF | kubectl apply -f -
    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
    EOF

    Output yang diharapkan:

    ingress.networking.k8s.io/nginx-test configured
  8. Jalankan perintah berikut untuk menanyakan alamat IP dari Ingress yang telah dibuat:

    kubectl get ing

    Alamat IP di kolom ADDRESS adalah alamat IP dari Ingress, seperti yang ditunjukkan dalam output berikut:

    NAME         HOSTS                    ADDRESS         PORTS     AGE
    nginx-test   foo.bar.com              39.102.XX.XX    80, 443   4h42m
  9. Jalankan perintah berikut untuk mengganti alamat IP dalam file hosts dengan alamat IP yang diperoleh:

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

    Verify the configuration:

    • Klien tidak memberikan sertifikat klien saat mengakses server

      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>
    • Klien memberikan sertifikat klien saat mengakses server

      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></p>
      </body>
      </html>

Meneruskan Permintaan HTTPS dari Layanan ke Kontainer Backend

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

Template berikut menunjukkan konfigurasi NGINX Ingress:

Cluster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: backend-https
  annotations:
    # Catatan: Anda harus mengatur protokol backend ke 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

Cluster yang menjalankan versi Kubernetes lebih lama dari 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: backend-https
  annotations:
    # Catatan: Anda harus mengatur protokol backend ke 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>

Gunakan ekspresi reguler untuk menentukan nama domain

Secara default, Anda tidak dapat menggunakan ekspresi reguler untuk menentukan nama domain saat mengonfigurasi Ingress untuk kluster Kubernetes. Namun, Anda dapat mengaktifkan dukungan ekspresi reguler pada Ingress dengan menambahkan anotasi nginx.ingress.kubernetes.io/server-alias.

  1. Buat NGINX Ingress. Dalam contoh berikut, nama domain diatur ke ekspresi reguler ~^www\.\d+\.example\.com.

    Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

    cat <<-EOF | kubectl apply -f -
    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
    EOF

    Kluster yang menjalankan versi Kubernetes lebih lama dari 1.19

    cat <<-EOF | kubectl apply -f -
    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
     EOF
  2. Periksa konfigurasi kontroler NGINX Ingress.

    1. Jalankan perintah berikut untuk memeriksa pod yang disediakan untuk kontroler 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 memeriksa konfigurasi kontroler NGINX Ingress. Output menunjukkan konfigurasi efektif, seperti bidang Server_Name dalam contoh ini.

      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 memeriksa alamat IP dari 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 mengakses Service menggunakan aturan Ingress yang berbeda.

    Ganti IP_ADDRESS dengan alamat IP yang diperoleh pada langkah sebelumnya.

    • Jalankan perintah berikut untuk mengakses Service melalui Host: foo.bar.com:

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

      Output yang diharapkan:

      /foo
    • Jalankan perintah berikut untuk mengakses Service melalui Host: www.123.example.com:

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

      Output yang diharapkan:

      /foo
    • Jalankan perintah berikut untuk mengakses Service melalui Host: www.321.example.com:

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

      Output yang diharapkan:

      /foo

Tentukan nama domain wildcard

Dalam kluster Kubernetes, NGINX Ingress mendukung nama domain wildcard. Sebagai contoh, Anda dapat menentukan nama domain wildcard *.ingress-regex.com untuk sebuah Ingress.

  1. Buat NGINX Ingress dengan menggunakan template berikut.

    Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

    cat <<-EOF | kubectl apply -f -
    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
    EOF

    Kluster yang menjalankan versi Kubernetes lebih lama dari 1.19

    $ cat <<-EOF | kubectl apply -f -
    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
     EOF
  2. Jalankan perintah berikut untuk memeriksa konfigurasi kontroler NGINX Ingress. Output menunjukkan konfigurasi yang efektif, seperti bidang Server_Name dalam contoh ini.

    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 yang disediakan untuk kontroler NGINX Ingress.

    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 saat menggunakan versi terbaru kontroler NGINX Ingress:

    ## 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 memeriksa alamat IP dari 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 mengakses Service menggunakan aturan Ingress yang berbeda.

    Ganti IP_ADDRESS dengan alamat IP yang diperoleh pada langkah sebelumnya.

    • Jalankan perintah berikut untuk mengakses Service melalui Host: abc.ingress-regex.com:

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

      Output yang diharapkan:

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

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

      Output yang diharapkan:

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

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

      Output yang diharapkan:

      /foo

Gunakan anotasi untuk melaksanakan rilis canary

Anda dapat menerapkan rilis canary dengan menambahkan anotasi ke Ingress. Untuk mengaktifkan rilis canary, Anda harus menambahkan anotasi nginx.ingress.kubernetes.io/canary: "true". Bagian ini menjelaskan cara menggunakan anotasi yang berbeda untuk menerapkan rilis canary.

  • nginx.ingress.kubernetes.io/canary-weight: Anotasi ini memungkinkan Anda menetapkan persentase permintaan yang dikirim ke Service tertentu. Anda dapat memasukkan bilangan bulat dari 0 hingga 100.

  • nginx.ingress.kubernetes.io/canary-by-header: Anotasi ini mengaktifkan pemisahan lalu lintas berdasarkan header permintaan. Jika nilai header adalah always, permintaan didistribusikan ke Service canary yang ditentukan. Jika nilai header adalah never, permintaan tidak didistribusikan ke Service canary yang ditentukan. Jika nilai header bukan always atau never, permintaan didistribusikan ke Service canary lainnya berdasarkan aturan pencocokan Service canary tersebut dalam urutan prioritas menurun.

  • nginx.ingress.kubernetes.io/canary-by-header-value dan nginx.ingress.kubernetes.io/canary-by-header: Ketika nilai header dan header-value dalam permintaan cocok dengan nilai yang ditentukan dalam anotasi, permintaan didistribusikan ke Service canary yang ditentukan. Jika nilai header diatur ke nilai lain, permintaan didistribusikan ke Service canary lainnya berdasarkan aturan pencocokan lainnya dari Service canary tersebut dalam urutan prioritas menurun.

  • nginx.ingress.kubernetes.io/canary-by-cookie: Anotasi ini mengaktifkan pemisahan lalu lintas berbasis cookie. Jika nilai cookie adalah always, permintaan didistribusikan ke Service baru. Jika nilai cookie adalah never, permintaan tidak didistribusikan ke Service baru.

Kode sampel berikut menunjukkan bagaimana anotasi ini digunakan. Untuk informasi lebih lanjut, lihat Gunakan NGINX Ingress controller untuk menerapkan rilis canary dan penyebaran biru-hijau.

  • Rilis canary berbasis bobot: Tetapkan bobot Service 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: Ketika header permintaan adalah ack:always, permintaan diteruskan ke Service canary. Ketika header permintaan adalah ack:never, permintaan tidak didistribusikan ke Service canary. Jika header bukan ack:always atau ack:never, permintaan didistribusikan ke Service canary berdasarkan bobot Service 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 dengan nilai header kustom: Jika header permintaan adalah ack:alibaba, permintaan didistribusikan ke Service canary. Sebaliknya, permintaan didistribusikan ke Service canary berdasarkan bobot Service 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 permintaan tidak cocok dan cookie permintaan adalah hangzhou_region=always, permintaan didistribusikan ke Service 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 tidak mendukung pengaturan kustom. Nilai cookie harus always atau never.

  • Rilis canary yang menggunakan aturan berbeda berlaku dalam urutan berikut: berbasis header > berbasis cookie > berbasis bobot.

Gunakan cert-manager untuk mengajukan Sertifikat TLS gratis

cert-manager adalah alat open source yang digunakan untuk mengelola sertifikat berbasis cloud-native. Anda dapat menggunakan cert-manager di kluster Kubernetes untuk mengajukan sertifikat TLS dan mengaktifkan perpanjangan otomatis untuk sertifikat tersebut. Bagian ini menjelaskan cara mengajukan sertifikat gratis dan mengaktifkan perpanjangan otomatis untuk sertifikat dengan menggunakan cert-manager.

  1. Jalankan perintah berikut untuk menerapkan cert-manager:

    kubectl apply -f https://raw.githubusercontent.com/AliyunContainerService/serverless-k8s-examples/master/cert-manager/ask-cert-manager.yaml
    Catatan

    Template YAML yang dirujuk dalam perintah sebelumnya hanya dapat digunakan untuk menerapkan cert-manager di kluster ACK. Untuk informasi lebih lanjut tentang cara menerapkan cert-manager di kluster ACK, lihat Gunakan cert-manager untuk mengajukan Sertifikat TLS gratis.

  2. Jalankan perintah berikut untuk memeriksa status pod yang dibuat untuk cert-manager:

    kubectl get pods -n cert-manager

    Keluaran 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. Jalankan perintah berikut untuk membuat ClusterIssuer:

    cat <<EOF | kubectl apply -f -
    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_name@gmail.com>  # Ganti nilainya dengan alamat email Anda.
        privateKeySecretRef:
          name: letsencrypt-http01
        solvers:
        - http01: 
            ingress:
              class: nginx
    EOF
  4. Jalankan perintah berikut untuk memeriksa ClusterIssuer yang telah dibuat:

    kubectl get clusterissuer

    Keluaran yang diharapkan:

    NAME                         READY   AGE
    letsencrypt-prod-http01      True    17s
  5. Jalankan perintah berikut untuk membuat NGINX Ingress:

    Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

    cat <<EOF | kubectl apply -f -
    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 nilainya dengan nama domain Anda.
        secretName: ingress-tls   
      rules:
      - host: <your_domain_name>    # Ganti nilainya dengan nama domain Anda.
        http:
          paths:
          - path: /
            backend:
              service:
                name: <your_service_name>  # Ganti nilainya dengan nama Service.
                port: 
                  number: <your_service_port>  # Ganti nilainya dengan port Service.
            pathType: ImplementationSpecific
    EOF

    Kluster yang menjalankan versi Kubernetes lebih lama dari 1.19

    cat <<EOF | kubectl apply -f -
    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 nilainya dengan nama domain Anda.
        secretName: ingress-tls   
      rules:
      - host: <your_domain_name>    # Ganti nilainya dengan nama domain Anda.
        http:
          paths:
          - path: /
            backend:
              serviceName: <your_service_name>  # Ganti nilainya dengan nama Service.
              servicePort: <your_service_port>  # Ganti nilainya dengan port Service.
    EOF
    Catatan

    Nama domain yang Anda gunakan untuk menggantikan your_domain_name dalam template harus memenuhi kondisi berikut:

    • Nama domain tidak boleh melebihi 64 karakter.

    • Nama domain tidak boleh berupa nama domain wildcard.

    • Nama domain dapat diakses dari Internet melalui HTTP.

  6. Jalankan perintah berikut untuk memeriksa sertifikat:

    kubectl get cert

    Keluaran yang diharapkan:

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

    Jika nilai di kolom READY bukan True, Anda dapat memeriksa status sertifikat dengan menjalankan perintah kubectl describe cert ingress-tls.

  7. Jalankan perintah berikut untuk memeriksa Secret dari sertifikat:

    kubectl get secret  ingress-tls

    Keluaran yang diharapkan:

    NAME          TYPE                DATA   AGE
    ingress-tls   kubernetes.io/tls   2      2m
  8. Anda dapat memasukkan https:[nama domain situs web] ke bilah alamat browser Anda untuk mengakses nama domain yang ditentukan.