Dalam kluster Kubernetes, NGINX Ingress adalah objek API yang menyediakan load balancing lapisan 7 untuk mengelola akses eksternal ke layanan. Anda dapat menggunakan NGINX Ingress untuk mengonfigurasi URL yang dapat diakses secara eksternal, aturan penulisan ulang, layanan HTTPS, dan rilis canary. Topik ini menjelaskan cara mengonfigurasi layanan routing yang aman, autentikasi TLS timbal balik, nama domain yang mendukung ekspresi reguler dan wildcard, serta cara mengajukan sertifikat HTTPS gratis.
Proyek open source Ingress-NGINX tidak akan lagi dipelihara setelah Maret 2026. Akibatnya, Container Service for Kubernetes juga akan menghentikan pemeliharaan untuk komponen controller NGINX Ingress. Harap perhatikan risiko yang terkait. Untuk informasi selengkapnya, lihat [Pengumuman Produk] Pengumuman tentang Penghentian Pemeliharaan untuk Komponen Controller NGINX Ingress.
Prasyarat
Konfigurasi
Metode konfigurasi controller NGINX Ingress di ACK sepenuhnya kompatibel dengan versi komunitas. Untuk daftar lengkap opsi konfigurasi, lihat Konfigurasi NGINX.
Metode konfigurasi berikut didukung:
-
Menggunakan anotasi: Anda dapat menambahkan anotasi ke file YAML dari NGINX Ingress. Anotasi ini hanya berlaku pada Ingress tertentu tersebut. Untuk informasi selengkapnya, lihat Anotasi.
-
Menggunakan ConfigMap: Anda dapat memodifikasi ConfigMap
kube-system/nginx-configuration. Ini adalah konfigurasi global yang berlaku untuk semua NGINX Ingress. Untuk informasi selengkapnya, lihat ConfigMap. -
Menggunakan templat NGINX kustom: Anda dapat menggunakan metode ini jika anotasi atau ConfigMap tidak memenuhi persyaratan khusus Anda untuk templat NGINX dari controller NGINX Ingress. Untuk informasi selengkapnya, lihat Templat NGINX kustom.
Mengonfigurasi pengalihan URL
Saat menggunakan controller NGINX Ingress, controller ini meneruskan permintaan berdasarkan path lengkap. Misalnya, permintaan ke /service1/api diteruskan ke path /service1/api pada pod backend. Jika path layanan backend Anda adalah /api, ketidakcocokan path akan terjadi yang mengakibatkan error 404. Untuk mengatasi masalah ini, Anda dapat menambahkan anotasi nginx.ingress.kubernetes.io/rewrite-target untuk menulis ulang path permintaan ke direktori yang benar.
Buat NGINX Ingress berdasarkan versi Kubernetes kluster Anda.
Kubernetes 1.19 dan yang lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: foo.bar.com
namespace: default
annotations:
# Pengalihan URL.
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: foo.bar.com
http:
paths:
# Untuk versi controller Ingress 0.22.0 dan yang lebih baru, Anda harus mendefinisikan path menggunakan ekspresi reguler dan menggunakan grup tangkapan dalam anotasi rewrite-target.
- path: /svc(/|$)(.*)
backend:
service:
name: web1-service
port:
number: 80
pathType: ImplementationSpecific
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:
# Untuk versi controller Ingress 0.22.0 dan yang lebih baru, Anda harus mendefinisikan path menggunakan ekspresi reguler dan menggunakan grup tangkapan dalam anotasi rewrite-target.
- path: /svc(/|$)(.*)
backend:
serviceName: web1-service
servicePort: 80
-
Akses 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 46m -
Jalankan perintah berikut. Ganti
<ADDRESS>dengan alamat IP Ingress.curl -k -H "Host: foo.bar.com" http://<ADDRESS>/svc/fooOutput yang diharapkan:
web1: /foo
-
Aturan penulisan ulang
Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/rewrite-target untuk konfigurasi penulisan ulang dasar. Untuk informasi selengkapnya, lihat Mengonfigurasi pengalihan URL.
Untuk kebutuhan penulisan ulang yang kompleks atau tingkat lanjut, Anda dapat menggunakan anotasi berikut:
-
nginx.ingress.kubernetes.io/server-snippet: Menambahkan konfigurasi kustom ke blokserver. -
nginx.ingress.kubernetes.io/configuration-snippet: Menambahkan konfigurasi kustom ke bloklocation.
Anotasi ini memberikan fleksibilitas bagi Anda untuk menyesuaikan konfigurasi NGINX untuk berbagai kasus penggunaan dengan menambahkan potongan kode kustom.
Berikut adalah 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 pod controller NGINX Ingress:
kubectl exec nginx-ingress-controller-xxxxx --namespace kube-system -- cat /etc/nginx/nginx.conf # Ganti nama pod dengan nama yang sebenarnya dari lingkungan Anda.
File nginx.conf yang dihasilkan mencakup hal 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 direktif rewrite, lihat dokumentasi resmi NGINX untuk direktif ini.
Mengonfigurasi sertifikat HTTPS Ingress
Anda dapat mengonfigurasi sertifikat HTTPS untuk situs web secara langsung di resource Ingress.
-
Siapkan sertifikat layanan Anda.
CatatanNama domain dalam sertifikat harus sesuai dengan host yang Anda tentukan di Ingress. Jika tidak, controller NGINX Ingress tidak dapat memuat sertifikat.
-
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.
Gunakan sertifikat dan kunci privat untuk membuat Kubernetes Secret bernama tls-test-ingress. Anda akan mereferensikan Secret ini saat membuat Ingress.
kubectl create secret tls tls-test-ingress --key tls.key --cert tls.crt
-
-
Deploy templat berikut untuk membuat resource Ingress. Bidang
tlsmereferensikan Secret yang Anda buat pada langkah sebelumnya.Kubernetes 1.19 dan yang lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-test-ingress spec: # Referensikan sertifikat TLS. tls: - hosts: - foo.bar.com # Nama domain yang terkait dengan sertifikat. secretName: tls-test-ingress rules: - host: foo.bar.com http: paths: - path: /foo backend: service: name: web1-svc port: number: 80 pathType: ImplementationSpecificKubernetes 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 terkait dengan sertifikat. secretName: tls-test-ingress rules: - host: foo.bar.com http: paths: - path: /foo backend: serviceName: web1-svc servicePort: 80 -
Konfigurasikan file
hostsatau rekaman DNS Anda untuk mengakses layanan TLS.Anda dapat mengakses Layanan
web1-svcdihttps://foo.bar.com/foo.
Mengonfigurasi autentikasi TLS timbal balik
Dalam beberapa skenario, Anda mungkin perlu mengonfigurasi autentikasi TLS timbal balik untuk meningkatkan keamanan. Controller NGINX Ingress memungkinkan Anda mengonfigurasi fitur ini menggunakan anotasi.
-
Jalankan perintah berikut untuk membuat sertifikat certificate authority (CA) dengan tanda tangan sendiri:
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 permintaan penandatanganan sertifikat (CSR) untuk sertifikat server:
openssl req -new -newkey rsa:4096 -keyout server.key -out server.csr -nodes -subj '/CN=foo.bar.com'Output yang diharapkan:
Generating a 4096 bit RSA private key ................................................................................................................................++ .................................................................++ writing new private key to 'server.key' -
Jalankan perintah berikut untuk menggunakan sertifikat root guna menandatangani CSR server dan menghasilkan sertifikat server:
openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crtOutput yang diharapkan:
Signature ok subject=/CN=foo.bar.com Getting CA Private Key
-
-
Buat sertifikat client.
-
Hasilkan CSR untuk sertifikat client.
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 guna menandatangani CSR client dan menghasilkan sertifikat client:
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 file sertifikat yang dibuat:
lsOutput yang diharapkan:
ca.crt ca.key client.crt client.csr client.key server.crt server.csr server.key -
Jalankan 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 created -
Jalankan perintah berikut untuk membuat Secret untuk sertifikat server:
kubectl create secret generic tls-secret --from-file=tls.crt=server.crt --from-file=tls.key=server.keyOutput yang diharapkan:
secret/tls-secret created -
Deploy templat berikut untuk membuat NGINX Ingress sampel untuk pengujian.
Kubernetes 1.19 dan yang lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/auth-tls-verify-client: "on" nginx.ingress.kubernetes.io/auth-tls-secret: "default/ca-secret" nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1" nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true" name: nginx-test namespace: default spec: rules: - host: foo.bar.com http: paths: - backend: service: name: http-svc port: number: 80 path: / pathType: ImplementationSpecific tls: - hosts: - foo.bar.com secretName: tls-secretKubernetes 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 configured -
Jalankan perintah berikut untuk melihat alamat IP Ingress.
kubectl get ingAlamat IP di kolom ADDRESS adalah alamat IP Ingress.
NAME HOSTS ADDRESS PORTS AGE nginx-test foo.bar.com 39.102.XX.XX 80, 443 4h42m -
Jalankan perintah berikut untuk memperbarui file hosts Anda. Ganti alamat IP dengan alamat IP Ingress Anda yang sebenarnya.
echo "39.102.XX.XX foo.bar.com" | sudo tee -a /etc/hostsVerifikasi konfigurasi:
-
Akses layanan tanpa sertifikat client:
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 layanan dengan sertifikat client:
curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://foo.bar.comOutput yang diharapkan:
<!DOCTYPE html> <html> <head> <title>Selamat datang di nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Selamat datang di nginx!</h1> <p>Jika Anda melihat halaman ini, server web nginx berhasil diinstal dan berfungsi. Konfigurasi lebih lanjut diperlukan.</p> <p>Untuk dokumentasi dan dukungan online, silakan merujuk ke <a href="http://nginx.org/">nginx.org</a>.<br/> Dukungan komersial tersedia di <a href="http://nginx.com/">nginx.com</a>.</p> <p>Terima kasih telah menggunakan nginx.</p> </body> </html>
-
Meneruskan permintaan ke backend HTTPS
Secara default, controller NGINX Ingress menggunakan HTTP untuk meneruskan permintaan ke pod backend. Jika layanan backend Anda menggunakan HTTPS, Anda dapat menambahkan anotasi nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" untuk mengonfigurasi controller agar menggunakan HTTPS untuk koneksi backend.
Berikut adalah contoh konfigurasi NGINX Ingress:
Kubernetes 1.19 dan yang lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: backend-https
annotations:
# Catatan: Anda harus menentukan bahwa layanan backend menggunakan HTTPS.
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
tls:
- hosts:
- <YOUR-HOST-NAME>
secretName: <YOUR-SECRET-CERT-NAME>
rules:
- host: <YOUR-HOST-NAME>
http:
paths:
- path: /
backend:
service:
name: <YOUR-SERVICE-NAME>
port:
number: <YOUR-SERVICE-PORT>
pathType: ImplementationSpecific
Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: backend-https
annotations:
# Catatan: Anda harus menentukan bahwa layanan backend menggunakan HTTPS.
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
tls:
- hosts:
- <YOUR-HOST-NAME>
secretName: <YOUR-SECRET-CERT-NAME>
rules:
- host: <YOUR-HOST-NAME>
http:
paths:
- path: /
backend:
serviceName: <YOUR-SERVICE-NAME>
servicePort: <YOUR-SERVICE-PORT>
Menggunakan ekspresi reguler dalam nama domain
Secara default, resource Kubernetes Ingress tidak mendukung ekspresi reguler dalam hostname. Namun, Anda dapat mengaktifkan fitur ini menggunakan anotasi nginx.ingress.kubernetes.io/server-alias.
-
Deploy templat berikut. Contoh ini menggunakan ekspresi reguler
~^www\.\d+\.example\.com.Kubernetes 1.19 dan yang lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-regex namespace: default annotations: nginx.ingress.kubernetes.io/server-alias: '~^www\.\d+\.example\.com$, abc.example.com' spec: rules: - host: foo.bar.com http: paths: - path: /foo backend: service: name: http-svc1 port: number: 80 pathType: ImplementationSpecificKubernetes 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 -
Periksa 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 1h -
Jalankan perintah berikut untuk melihat konfigurasi controller NGINX Ingress. Output menunjukkan bahwa bidang server_name telah diperbarui.
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 11s -
Jalankan perintah berikut untuk menguji akses layanan dengan aturan yang 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>/fooOutput yang diharapkan:
/foo -
Jalankan perintah berikut untuk mengakses layanan menggunakan
Host: www.123.example.com:curl -H "Host: www.123.example.com" <IP_ADDRESS>/fooOutput yang diharapkan:
/foo -
Jalankan perintah berikut untuk mengakses layanan menggunakan
Host: www.321.example.com:curl -H "Host: www.321.example.com" <IP_ADDRESS>/fooOutput yang diharapkan:
/foo
-
Menggunakan nama domain wildcard
Resource NGINX Ingress dalam kluster Kubernetes mendukung nama domain wildcard. Misalnya, Anda dapat mengonfigurasi host seperti *.ingress-regex.com.
-
Deploy templat berikut untuk membuat NGINX Ingress.
Kubernetes 1.19 dan yang lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-regex namespace: default spec: rules: - host: *.ingress-regex.com http: paths: - path: /foo backend: service: name: http-svc1 port: number: 80 pathType: ImplementationSpecificKubernetes 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 -
Jalankan perintah berikut untuk memeriksa konfigurasi controller NGINX Ingress. Output menunjukkan bahwa bidang server_name telah diperbarui.
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 controller NGINX Ingress Anda yang sebenarnya.
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 untuk versi controller NGINX Ingress yang lebih baru:
## start server *.ingress-regex.com server { server_name ~^(?<subdomain>[\w-]+)\.ingress-regex\.com$ ; listen 80; listen [::]:80; ... } ## end server *.ingress-regex.com -
Jalankan perintah berikut untuk mendapatkan alamat IP Ingress:
kubectl get ingOutput yang diharapkan:
NAME HOSTS ADDRESS PORTS AGE ingress-regex *.ingress-regex.com 101.37.XX.XX 80 11s -
Jalankan perintah berikut untuk menguji akses layanan dengan aturan yang berbeda.
Ganti <IP_ADDRESS> dengan alamat IP yang Anda peroleh 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:
/foo -
Jalankan perintah berikut untuk mengakses layanan menggunakan
Host: 123.ingress-regex.com:curl -H "Host: 123.ingress-regex.com" <IP_ADDRESS>/fooOutput yang diharapkan:
/foo -
Jalankan perintah berikut untuk mengakses layanan menggunakan
Host: a1b1.ingress-regex.com:curl -H "Host: a1b1.ingress-regex.com" <IP_ADDRESS>/fooOutput yang diharapkan:
/foo
-
Rilis canary dengan anotasi
Anda dapat menerapkan rilis canary menggunakan anotasi. Untuk mengaktifkan fitur canary, Anda harus mengatur anotasi nginx.ingress.kubernetes.io/canary: "true". Kemudian, Anda dapat menggunakan anotasi yang berbeda untuk mengontrol traffic:
-
nginx.ingress.kubernetes.io/canary-weight: Menentukan persentase traffic (bilangan bulat dari 0 hingga 100) yang akan dirutekan ke layanan canary. -
nginx.ingress.kubernetes.io/canary-by-header: Memisahkan traffic berdasarkan header permintaan. Jika nilaiheaderyang dikonfigurasi adalahalways, permintaan akan dirutekan ke layanan canary. Jika nilaiheaderadalahnever, permintaan tidak akan dirutekan ke layanan canary. Nilaiheaderlainnya akan diabaikan, dan permintaan akan dirutekan ke layanan canary yang ditentukan oleh aturan lain berdasarkan prioritas canary. -
nginx.ingress.kubernetes.io/canary-by-header-valuedannginx.ingress.kubernetes.io/canary-by-header: Ketikaheaderdanheader-valuedalam permintaan sesuai dengan nilai yang ditentukan, traffic akan dirutekan ke layanan canary. Nilaiheaderlainnya akan diabaikan, dan traffic akan dirutekan ke layanan canary yang ditentukan dalam aturan lain berdasarkan prioritas canary. -
nginx.ingress.kubernetes.io/canary-by-cookie: Memisahkan traffic berdasarkan cookie. Jika nilaicookieyang ditentukan adalahalways, traffic permintaan akan dirutekan ke layanan canary. Jika nilaicookieyang ditentukan adalahnever, traffic permintaan tidak akan dirutekan ke layanan canary.
Contoh berikut menunjukkan cara mengonfigurasi beberapa anotasi ini. Untuk informasi selengkapnya, lihat Menggunakan controller NGINX Ingress untuk menerapkan rilis canary dan penyebaran biru-hijau.
-
Rilis canary berbasis bobot: Atur bobot layanan 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: Jika header permintaan adalah
ack:always, permintaan akan dirutekan ke layanan canary. Jika header permintaan adalahack:never, permintaan tidak akan dirutekan ke layanan canary. Untuk nilai header ack lainnya, traffic akan dirutekan ke layanan canary berdasarkan bobot 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 (nilai header kustom): Jika header permintaan adalah
ack:alibaba, permintaan akan dirutekan ke layanan canary. Untuk nilai header ack lainnya, traffic akan dirutekan ke layanan canary berdasarkan bobot 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 tidak sesuai, dan cookie permintaan adalah
hangzhou_region=always, permintaan akan dirutekan ke layanan 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 hanya mendukung nilai
alwaysdannever. Fitur ini tidak mendukung nilai kustom. -
Prioritas aturan canary adalah sebagai berikut (dari tertinggi ke terendah): berbasis header > berbasis cookie > berbasis bobot.
Sertifikat HTTPS gratis dengan cert-manager
cert-manager adalah alat manajemen sertifikat open source yang secara otomatis menyediakan dan memperpanjang sertifikat HTTPS dalam kluster Kubernetes. Contoh berikut menunjukkan cara menggunakan cert-manager untuk mengajukan sertifikat gratis dan mengaktifkan perpanjangan otomatis.
cert-manager adalah komponen open source dan tidak dikelola oleh ACK. Gunakan dengan hati-hati di lingkungan produksi. Untuk melakukan upgrade cert-manager, lihat Upgrading cert-manager.
-
Jalankan perintah berikut untuk men-deploy cert-manager.
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml -
Jalankan perintah berikut untuk memeriksa 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 2m10s -
Buat ClusterIssuer menggunakan templat berikut.
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod-http01 spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: <your_email_n***@gmail.com> # Ganti ini dengan alamat email Anda. privateKeySecretRef: name: letsencrypt-http01 solvers: - http01: ingress: class: nginx -
Jalankan perintah berikut untuk memeriksa status ClusterIssuer.
kubectl get clusterissuerOutput yang diharapkan:
NAME READY AGE letsencrypt-prod-http01 True 17s -
Buat objek resource Nginx Ingress.
Kubernetes 1.19 dan yang lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-tls annotations: kubernetes.io/ingress.class: "nginx" cert-manager.io/cluster-issuer: "letsencrypt-prod-http01" spec: tls: - hosts: - <YOUR_DOMAIN_NAME> # Ganti 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: ImplementationSpecificKubernetes 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 tentukan untuk <YOUR_DOMAIN_NAME> harus memenuhi kondisi berikut:
-
Panjang nama domain tidak boleh melebihi 64 karakter.
-
Nama domain wildcard tidak didukung.
-
Domain harus dapat diakses dari internet melalui HTTP.
-
-
Jalankan perintah berikut untuk memeriksa status sertifikat:
kubectl get certOutput yang diharapkan:
NAME READY SECRET AGE ingress-tls True ingress-tls 52mCatatanJika status READY bukan True, Anda dapat menjalankan
kubectl describe cert ingress-tlsuntuk melihat detail pemrosesan sertifikat. -
Jalankan perintah berikut untuk memeriksa Secret:
kubectl get secret ingress-tlsOutput yang diharapkan:
NAME TYPE DATA AGE ingress-tls kubernetes.io/tls 2 2m -
Buka browser web Anda dan masukkan
https://<YOUR_DOMAIN_NAME>untuk mengakses domain Anda.
Pengalihan HTTP ke HTTPS
Anda dapat memaksakan pengalihan traffic HTTP ke HTTPS dengan menambahkan anotasi nginx.ingress.kubernetes.io/ssl-redirect ke NGINX Ingress Anda. Berikut adalah contohnya:
Kubernetes 1.19 dan yang lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true" # Paksa pengalihan traffic HTTP ke HTTPS.
Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true" # Paksa pengalihan traffic HTTP ke HTTPS.