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
Kluster Container Service for Kubernetes (ACK) telah dibuat. Untuk informasi lebih lanjut, lihat Buat kluster ACK yang dikelola.
Kontroler NGINX Ingress telah diinstal untuk kluster dan berjalan sesuai harapan. Untuk informasi lebih lanjut, lihat Kelola kontroler NGINX Ingress.
Klien kubectl telah terhubung ke kluster. Untuk informasi lebih lanjut, lihat Langkah 2: Pilih jenis kredensial kluster.
Deployment dan Service telah dibuat. Untuk informasi lebih lanjut, lihat Metode 2: Buat NGINX Ingress menggunakan kubectl.
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
EOFKluster 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
EOFAkses layanan NGINX.
Jalankan perintah berikut untuk mendapatkan nilai
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 dari Ingress yang Anda peroleh:curl -k -H "Host: foo.bar.com" http://<ADDRESS>/svc/fooOutput 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 AndaBerikut 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.comSelain 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.
Persiapkan sertifikat Anda.
CatatanNama domain yang terkait dengan sertifikat harus sama dengan host yang Anda tentukan. Jika tidak, kontroler NGINX Ingress tidak dapat memuat sertifikat TLS.
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 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
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 EOFKluster 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 EOFSetelah Ingress dibuat, Anda harus memodifikasi file
hostsatau menentukan nama domain aktual sebelum Anda dapat menggunakan TLS untuk mengamankan transmisi data.Anda dapat mengakses Layanan
web1-svcmenggunakanhttps://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.
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'Buat sertifikat server.
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'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.crtOutput yang diharapkan:
Signature ok subject=/CN=foo.bar.com Getting CA Private Key
Buat sertifikat klien.
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' -----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.crtOutput yang diharapkan:
Signature ok subject=/CN=Fern Getting CA Private Key
Jalankan perintah berikut untuk menanyakan file 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 berdasarkan sertifikat CA yang telah dibuat:
kubectl create secret generic ca-secret --from-file=ca.crt=ca.crtOutput yang diharapkan:
secret/ca-secret createdJalankan 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.keyOutput yang diharapkan:
secret/tls-secret createdJalankan 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 EOFKluster 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 EOFOutput yang diharapkan:
ingress.networking.k8s.io/nginx-test configuredJalankan perintah berikut untuk menanyakan alamat IP dari Ingress yang telah dibuat:
kubectl get ingAlamat 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 4h42mJalankan 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/hostsVerify the configuration:
Klien tidak memberikan sertifikat klien saat mengakses server
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>Klien memberikan sertifikat klien saat mengakses server
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></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: ImplementationSpecificCluster 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.
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 EOFKluster 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 EOFPeriksa konfigurasi kontroler NGINX Ingress.
Jalankan perintah berikut untuk memeriksa pod yang disediakan untuk kontroler 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 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
Jalankan perintah berikut untuk memeriksa alamat IP dari 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 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>/fooOutput yang diharapkan:
/fooJalankan perintah berikut untuk mengakses Service melalui
Host: www.123.example.com:curl -H "Host: www.123.example.com" <IP_ADDRESS>/fooOutput yang diharapkan:
/fooJalankan perintah berikut untuk mengakses Service melalui
Host: www.321.example.com:curl -H "Host: www.321.example.com" <IP_ADDRESS>/fooOutput 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.
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 EOFKluster 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 EOFJalankan 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"CatatanGanti 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.comOutput 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.comJalankan perintah berikut untuk memeriksa alamat IP dari 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 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>/fooOutput yang diharapkan:
/fooJalankan perintah berikut untuk mengakses Service melalui
Host: 123.ingress-regex.com:curl -H "Host: 123.ingress-regex.com" <IP_ADDRESS>/fooOutput yang diharapkan:
/fooJalankan perintah berikut untuk mengakses Service melalui
Host: a1b1.ingress-regex.com:curl -H "Host: a1b1.ingress-regex.com" <IP_ADDRESS>/fooOutput 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 nilaiheaderadalahalways, permintaan didistribusikan ke Service canary yang ditentukan. Jika nilaiheaderadalahnever, permintaan tidak didistribusikan ke Service canary yang ditentukan. Jika nilaiheaderbukan 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-valuedannginx.ingress.kubernetes.io/canary-by-header: Ketika nilaiheaderdanheader-valuedalam permintaan cocok dengan nilai yang ditentukan dalam anotasi, permintaan didistribusikan ke Service canary yang ditentukan. Jika nilaiheaderdiatur 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 nilaicookieadalahalways, permintaan didistribusikan ke Service baru. Jika nilaicookieadalahnever, 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 adalahack: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"
Rilis canary berbasis cookie tidak mendukung pengaturan kustom. Nilai cookie harus
alwaysataunever.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.
Jalankan perintah berikut untuk menerapkan cert-manager:
kubectl apply -f https://raw.githubusercontent.com/AliyunContainerService/serverless-k8s-examples/master/cert-manager/ask-cert-manager.yamlCatatanTemplate 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.
Jalankan perintah berikut untuk memeriksa status pod yang dibuat untuk cert-manager:
kubectl get pods -n cert-managerKeluaran 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 2m10sJalankan 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 EOFJalankan perintah berikut untuk memeriksa ClusterIssuer yang telah dibuat:
kubectl get clusterissuerKeluaran yang diharapkan:
NAME READY AGE letsencrypt-prod-http01 True 17sJalankan 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 EOFKluster 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. EOFCatatanNama 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.
Jalankan perintah berikut untuk memeriksa sertifikat:
kubectl get certKeluaran yang diharapkan:
NAME READY SECRET AGE ingress-tls True ingress-tls 52mCatatanJika nilai di kolom READY bukan True, Anda dapat memeriksa status sertifikat dengan menjalankan perintah
kubectl describe cert ingress-tls.Jalankan perintah berikut untuk memeriksa Secret dari sertifikat:
kubectl get secret ingress-tlsKeluaran yang diharapkan:
NAME TYPE DATA AGE ingress-tls kubernetes.io/tls 2 2mAnda dapat memasukkan
https:[nama domain situs web]ke bilah alamat browser Anda untuk mengakses nama domain yang ditentukan.