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
Anda telah menginstal controller NGINX Ingress.
Klien kubectl terhubung ke kluster. Untuk informasi selengkapnya, lihat Dapatkan KubeConfig kluster dan gunakan kubectl untuk terhubung ke kluster.
Layanan diekspos oleh NGINX Ingress. Untuk informasi selengkapnya, lihat Buat dan gunakan NGINX Ingress untuk mengekspos layanan.
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: ImplementationSpecificKluster 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: 80Akses layanan NGINX.
Jalankan perintah berikut untuk mendapatkan
ADDRESS.kubectl get ingressOutput yang diharapkan:
NAME CLASS HOSTS ADDRESS PORTS AGE foo.bar.com nginx foo.bar.com 172.16.XX.XX 80 46mJalankan perintah berikut. Ganti
ADDRESSdengan alamat IP Ingress.curl -k -H "Host: foo.bar.com" http://<ADDRESS>/svc/fooOutput 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.comAnotasi 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.
Siapkan sertifikat layanan Anda.
CatatanNama domain harus sesuai dengan host yang Anda konfigurasi. Jika tidak, controller NGINX Ingress tidak dapat memuat sertifikat dengan benar.
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"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
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: ImplementationSpecificKluster 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: 80Konfigurasikan file
hostsatau gunakan nama domain asli untuk mengakses layanan TLS.Anda dapat mengakses layanan
web1-svcdihttps://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.
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'Jalankan perintah berikut untuk membuat sertifikat sisi server.
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'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.crtOutput yang diharapkan:
Signature ok subject=/CN=foo.bar.com Getting CA Private Key
Jalankan perintah berikut untuk membuat sertifikat sisi klien.
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' -----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.crtOutput yang diharapkan:
Signature ok subject=/CN=Fern Getting CA Private Key
Jalankan perintah berikut untuk memeriksa sertifikat yang telah dibuat.
lsOutput yang diharapkan:
ca.crt ca.key client.crt client.csr client.key server.crt server.csr server.keyJalankan perintah berikut untuk membuat secret untuk sertifikat CA.
kubectl create secret generic ca-secret --from-file=ca.crt=ca.crtOutput yang diharapkan:
secret/ca-secret createdAnda 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.keyOutput yang diharapkan:
secret/tls-secret createdTerapkan 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-secretKluster 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-secretOutput yang diharapkan:
ingress.networking.k8s.io/nginx-test configuredJalankan perintah berikut untuk melihat alamat IP Ingress.
kubectl get ingAlamat 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 4h42mJalankan 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/hostsVerifikasi:
Akses tanpa sertifikat klien
curl --cacert ./ca.crt https://foo.bar.comOutput 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.comOutput 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: ImplementationSpecificKluster 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.
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: ImplementationSpecificKluster 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: 80Lihat konfigurasi controller NGINX Ingress.
Jalankan perintah berikut untuk melihat Pod controller NGINX Ingress.
kubectl get pods -n kube-system | grep nginx-ingress-controllerOutput yang diharapkan:
nginx-ingress-controller-77cd987c4c-c**** 1/1 Running 0 1h nginx-ingress-controller-77cd987c4c-x**** 1/1 Running 0 1hJalankan 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
Jalankan perintah berikut untuk mendapatkan alamat IP Ingress.
kubectl get ingOutput yang diharapkan:
NAME HOSTS ADDRESS PORTS AGE ingress-regex foo.bar.com 101.37.XX.XX 80 11sJalankan perintah berikut untuk menguji akses layanan dengan aturan berbeda.
Ganti
IP_ADDRESSdengan 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>/fooOutput yang diharapkan:
/fooJalankan perintah berikut untuk mengakses layanan menggunakan
Host: www.123.example.com.curl -H "Host: www.123.example.com" <IP_ADDRESS>/fooOutput yang diharapkan:
/fooJalankan perintah berikut untuk mengakses layanan menggunakan
Host: www.321.example.com.curl -H "Host: www.321.example.com" <IP_ADDRESS>/fooOutput 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.
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: ImplementationSpecificKluster 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: 80Jalankan 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"CatatanGanti 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.comPada 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.comJalankan perintah berikut untuk mengambil alamat IP Ingress.
kubectl get ingOutput yang diharapkan:
NAME HOSTS ADDRESS PORTS AGE ingress-regex *.ingress-regex.com 101.37.XX.XX 80 11sJalankan perintah berikut untuk menguji akses layanan dalam aturan berbeda.
Ganti
IP_ADDRESSdengan 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>/fooOutput yang diharapkan:
/fooJalankan perintah berikut untuk mengakses layanan menggunakan
Host: 123.ingress-regex.com.curl -H "Host: 123.ingress-regex.com" <IP_ADDRESS>/fooOutput yang diharapkan:
/fooJalankan perintah berikut untuk mengakses layanan menggunakan
Host: a1b1.ingress-regex.com.curl -H "Host: a1b1.ingress-regex.com" <IP_ADDRESS>/fooOutput 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 nilaiheaderyang dikonfigurasi adalahalways, seluruh trafik diarahkan ke Titik akhir layanan rilis bertahap. Ketika nilaiheaderadalahnever, tidak ada trafik yang diarahkan ke layanan rilis bertahap. Nilaiheaderlainnya diabaikan, dan trafik diarahkan ke layanan rilis bertahap lainnya sesuai prioritas aturan.nginx.ingress.kubernetes.io/canary-by-header-valuedannginx.ingress.kubernetes.io/canary-by-header: Mengarahkan trafik ke Titik akhir layanan rilis bertahap ketikaheaderdanheader-valuepermintaan sesuai dengan nilai yang dikonfigurasi. Nilaiheaderlainnya diabaikan, dan trafik diarahkan ke layanan rilis bertahap lainnya sesuai prioritas aturan.nginx.ingress.kubernetes.io/canary-by-cookie: Mengarahkan trafik berdasarkan cookie. Ketika nilaicookieyang dikonfigurasi adalahalways, seluruh trafik diarahkan ke Titik akhir layanan rilis bertahap. Ketika nilaicookieyang dikonfigurasi adalahnever, 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 adalahack: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"
Rilis bertahap berbasis cookie hanya mendukung nilai
alwaysdannever.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.
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.
Jalankan perintah berikut untuk menerapkan cert-manager.
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yamlJalankan perintah berikut untuk melihat status pod.
kubectl get pods -n cert-managerOutput 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 2m10sGunakan 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: nginxJalankan perintah berikut untuk melihat ClusterIssuer.
kubectl get clusterissuerOutput yang diharapkan:
NAME READY AGE letsencrypt-prod-http01 True 17sBuat 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: ImplementationSpecificKluster 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.CatatanNama 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.
Jalankan perintah berikut untuk melihat sertifikat.
kubectl get certOutput yang diharapkan:
NAME READY SECRET AGE ingress-tls True ingress-tls 52mCatatanJika status
READYbukanTrue, Anda dapat menjalankankubectl describe cert ingress-tlsuntuk melihat prosedur pemrosesan sertifikat.Jalankan perintah berikut untuk melihat secret.
kubectl get secret ingress-tlsOutput yang diharapkan:
NAME TYPE DATA AGE ingress-tls kubernetes.io/tls 2 2mDi 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.