Dalam kluster Kubernetes, Nginx Ingress menyediakan Load balancing lapisan 7 dan mengelola akses eksternal ke layanan. 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 layanan perutean aman, mengaktifkan otentikasi timbal balik HTTPS, menggunakan ekspresi reguler dan nama domain wildcard, serta meminta sertifikat HTTPS gratis.
Prasyarat
Komponen Nginx Ingress Controller telah diinstal. Untuk informasi selengkapnya, lihat Instal komponen Nginx Ingress Controller.
Anda telah terhubung ke kluster menggunakan tool kubectl dan file KubeConfig kluster. Untuk informasi selengkapnya, lihat Dapatkan file KubeConfig kluster dan gunakan kubectl untuk terhubung ke kluster.
Nginx Ingress telah dibuat untuk mengekspos suatu layanan. Untuk informasi selengkapnya, lihat Buat Ingress untuk mengekspos layanan.
Petunjuk konfigurasi
Metode konfigurasi untuk Nginx Ingress Controller di Container Service for Kubernetes sepenuhnya kompatibel dengan versi komunitas. Untuk daftar lengkap konfigurasi, lihat NGINX Configuration.
Ini mendukung tiga metode konfigurasi berikut:
Berdasarkan Anotasi: Anda dapat menambahkan konfigurasi ke bagian `annotations` dalam file YAML Nginx Ingress. Konfigurasi ini hanya berlaku untuk Nginx Ingress tertentu tersebut. Untuk informasi selengkapnya, lihat Annotations.
Berdasarkan ConfigMap: Anda dapat mengonfigurasi pengaturan global yang berlaku untuk semua Nginx Ingress menggunakan ConfigMap `kube-system/nginx-configuration`. Untuk informasi selengkapnya, lihat ConfigMaps.
Templat NGINX kustom: Anda dapat menggunakan metode ini jika anotasi atau ConfigMap tidak memenuhi kebutuhan Anda terhadap templat internal NGINX pada Nginx Ingress Controller. Untuk informasi selengkapnya, lihat Custom NGINX template.
Konfigurasikan layanan perutean untuk Pengalihan URL
Saat menggunakan Nginx Ingress Controller, Nginx meneruskan path lengkap ke backend. Misalnya, permintaan ke path /service1/api melalui Ingress diteruskan langsung ke path /service1/api pada pod backend. Jika path layanan backend Anda adalah /api, terjadi ketidaksesuaian path yang menghasilkan kode status 404. Dalam kasus ini, Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/rewrite-target untuk menulis ulang path ke direktori yang diperlukan.
Buat Nginx Ingress berdasarkan versi kluster Anda.
Kluster versi 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 Ingress Controller 0.22.0 dan yang lebih baru, Anda harus mendefinisikan path menggunakan ekspresi reguler dan menggunakannya bersama capturing group dalam rewrite-target.
- path: /svc(/|$)(.*)
backend:
service:
name: web1-service
port:
number: 80
pathType: ImplementationSpecificKluster versi 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 Ingress Controller 0.22.0 dan yang lebih baru, Anda harus mendefinisikan path menggunakan ekspresi reguler dan menggunakannya bersama capturing group dalam 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 konfigurasi penulisan ulang dasar. Untuk informasi selengkapnya, lihat Konfigurasikan layanan perutean untuk Pengalihan URL.
Untuk kebutuhan penulisan ulang yang lebih kompleks dan lanjutan, gunakan anotasi berikut:
nginx.ingress.kubernetes.io/server-snippet: Menambahkan konfigurasi kustom ke blok `server`.nginx.ingress.kubernetes.io/configuration-snippet: Menambahkan konfigurasi kustom ke blok `location`.
Kedua anotasi ini menambahkan potongan kode kustom ke blok `server` Nginx pada komponen Ingress, sehingga memberikan fleksibilitas untuk menyesuaikan konfigurasi Nginx sesuai skenario yang berbeda.
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 Nginx Ingress Controller.
kubectl exec nginx-ingress-controller-xxxxx --namespace kube-system -- cat /etc/nginx/nginx.conf # Ubah nama pod sesuai lingkungan Anda.File nginx.conf berikut dihasilkan dari contoh konfigurasi tersebut.
# 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.comsnippet juga mendukung konfigurasi global. Untuk informasi selengkapnya, lihat server-snippet.
Untuk informasi selengkapnya tentang instruksi rewrite, lihat dokumentasi resmi Nginx.
Konfigurasikan sertifikat HTTPS untuk aturan perutean
Anda dapat menggunakan semantik Ingress native untuk mengonfigurasi sertifikat HTTPS bagi situs web Anda.
Siapkan sertifikat layanan Anda.
CatatanNama domain harus sesuai dengan host yang dikonfigurasi. Jika tidak, Nginx Ingress Controller tidak dapat memuat sertifikat tersebut.
Jalankan perintah berikut untuk menghasilkan file sertifikat tls.crt dan file kunci privat 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.
Perintah ini menggunakan sertifikat dan kunci privat untuk membuat Secret Kubernetes bernama `tls-test-ingress`. Anda harus mereferensikan Secret ini saat membuat Ingress.
kubectl create secret tls tls-test-ingress --key tls.key --cert tls.crt
Buat resource Ingress yang mereferensikan Secret dari langkah sebelumnya di bidang `tls`.
Kluster versi 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 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 versi 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
Untuk meningkatkan keamanan, Anda dapat mengonfigurasi otentikasi HTTPS timbal balik antara server dan klien. Nginx Ingress Controller 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 server.
Jalankan perintah berikut untuk menghasilkan file 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 file 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
Jalankan perintah berikut untuk membuat sertifikat klien.
Hasilkan file CSR untuk 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 guna menandatangani file CSR 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 createdJalankan 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 Nginx Ingress uji coba.
Kluster versi 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-secretKluster versi 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 Ingress ditampilkan di kolom `ADDRESS` pada output.
NAME HOSTS ADDRESS PORTS AGE nginx-test foo.bar.com 39.102.XX.XX 80, 443 4h42mJalankan perintah berikut untuk memperbarui file `hosts`. Ganti alamat IP dengan alamat IP aktual Ingress.
echo "39.102.XX.XX foo.bar.com" | sudo tee -a /etc/hostsVerification:
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>Otentikasi dengan 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 traffic ke kontainer backend melalui HTTPS
Secara default, Nginx Ingress Controller meneruskan permintaan ke kontainer aplikasi backend melalui HTTP. Jika kontainer aplikasi Anda menggunakan HTTPS, Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" untuk mengonfigurasi Nginx Ingress Controller agar meneruskan permintaan melalui HTTPS.
Berikut adalah contoh konfigurasi Nginx Ingress:
Kluster versi 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: ImplementationSpecificKluster versi 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>Konfigurasikan nama domain untuk mendukung ekspresi reguler
Dalam kluster Kubernetes, resource Ingress tidak secara native mendukung ekspresi reguler untuk nama domain. Namun, Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/server-alias untuk mengaktifkan fungsionalitas ini.
Terapkan templat berikut, yang menggunakan ekspresi reguler
~^www\.\d+\.example\.comsebagai contoh.Kluster versi 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: ImplementationSpecificKluster versi 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 Nginx Ingress Controller.
Jalankan perintah berikut untuk melihat pod tempat layanan Nginx Ingress Controller dideploy.
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 Nginx Ingress Controller. Konfigurasi efektif berada di bidang `Server_Name`.
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_ADDRESS dengan alamat IP yang Anda peroleh pada langkah sebelumnya.
Jalankan perintah berikut untuk mengakses layanan dengan
Host: foo.bar.com.curl -H "Host: foo.bar.com" <IP_ADDRESS>/fooOutput yang diharapkan:
/fooJalankan perintah berikut untuk mengakses layanan dengan
Host: www.123.example.com.curl -H "Host: www.123.example.com" <IP_ADDRESS>/fooOutput yang diharapkan:
/fooJalankan perintah berikut untuk mengakses layanan dengan
Host: www.321.example.com.curl -H "Host: www.321.example.com" <IP_ADDRESS>/fooOutput yang diharapkan:
/foo
Konfigurasikan nama domain untuk mendukung wildcard
Resource Nginx Ingress dalam kluster Kubernetes mendukung nama domain wildcard, seperti *.ingress-regex.com.
Terapkan templat berikut untuk membuat Nginx Ingress.
Kluster versi 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: ImplementationSpecificKluster versi 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 Nginx Ingress Controller. Konfigurasi efektif berada di bidang `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 nama pod nginx-ingress Anda.
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 pada versi Nginx Ingress Controller yang lebih baru:
## 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 mendapatkan 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 dengan aturan berbeda.
Ganti IP_ADDRESS dengan alamat IP yang Anda peroleh pada langkah sebelumnya.
Jalankan perintah berikut untuk mengakses layanan dengan
Host: abc.ingress-regex.com.curl -H "Host: abc.ingress-regex.com" <IP_ADDRESS>/fooOutput yang diharapkan:
/fooJalankan perintah berikut untuk mengakses layanan dengan
Host: 123.ingress-regex.com.curl -H "Host: 123.ingress-regex.com" <IP_ADDRESS>/fooOutput yang diharapkan:
/fooJalankan perintah berikut untuk mengakses layanan dengan
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 menggunakan anotasi. Untuk mengaktifkan rilis bertahap, tetapkan anotasi nginx.ingress.kubernetes.io/canary: "true". Anda dapat menggunakan anotasi berikut untuk mengimplementasikan fitur rilis bertahap yang berbeda:
nginx.ingress.kubernetes.io/canary-weight: Menetapkan persentase permintaan yang akan diarahkan ke layanan tertentu. Nilainya berupa bilangan bulat dari 0 hingga 100.nginx.ingress.kubernetes.io/canary-by-header: Membagi traffic berdasarkan header permintaan. Ketika nilaiheaderyang dikonfigurasi adalahalways, traffic permintaan diarahkan ke titik akhir rilis bertahap. Ketika nilaiheaderadalahnever, traffic permintaan tidak diarahkan ke layanan rilis bertahap. Nilaiheaderlainnya diabaikan, dan traffic diarahkan ke layanan rilis bertahap lainnya berdasarkan prioritas.nginx.ingress.kubernetes.io/canary-by-header-valuedannginx.ingress.kubernetes.io/canary-by-header: Ketikaheaderdanheader-valuedalam permintaan sesuai dengan nilai yang ditetapkan, traffic permintaan diarahkan ke titik akhir rilis bertahap. Nilaiheaderlainnya diabaikan, dan traffic diarahkan ke layanan rilis bertahap lainnya berdasarkan prioritas.nginx.ingress.kubernetes.io/canary-by-cookie: Membagi traffic berdasarkan cookie. Ketika nilaicookieyang dikonfigurasi adalahalways, traffic permintaan diarahkan ke titik akhir rilis bertahap. Ketika nilaicookieyang dikonfigurasi adalahnever, traffic permintaan tidak diarahkan ke titik akhir rilis bertahap.
Berikut adalah beberapa contoh konfigurasi anotasi. Untuk informasi selengkapnya, lihat Gunakan Nginx Ingress untuk mengimplementasikan rilis bertahap dan penyebaran biru-hijau.
Rilis bertahap berbasis bobot: Tetapkan 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: Permintaan dengan header
ack:alwaysmengakses layanan rilis bertahap. Permintaan dengan headerack:nevertidak mengakses layanan rilis bertahap. Header lainnya mengarahkan traffic 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 (nilai header kustom): Permintaan dengan header
ack:alibabamengakses layanan rilis bertahap. Header lainnya mengarahkan traffic 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 tidak cocok, permintaan dengan cookie
hangzhou_region=alwaysmengakses 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 tidak mendukung nilai kustom, hanya
alwaysdannever.Prioritas aturan rilis bertahap dievaluasi dalam urutan berikut, dari tertinggi ke terendah: Berbasis Header, Berbasis Cookie, dan Berbasis Bobot.
Gunakan cert-manager untuk meminta sertifikat HTTPS gratis
cert-manager adalah tool manajemen sertifikat open source yang menyediakan dan memperbarui sertifikat HTTPS secara otomatis dalam kluster. Contoh berikut menunjukkan cara menggunakan cert-manager untuk meminta sertifikat gratis dan mengaktifkan pembaruan otomatis.
cert-manager adalah komponen open source yang tidak dipelihara oleh ACK. Gunakan dengan hati-hati di lingkungan produksi. Untuk memperbarui 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 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 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_n***@gmail.com> # Ganti 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 resource Nginx Ingress.
Kluster versi 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 dengan nama domain Anda. secretName: ingress-tls rules: - host: <YOUR_DOMAIN_NAME> # Ganti dengan nama domain Anda. http: paths: - path: / backend: service: name: <YOUR_SERVICE_NAME> # Ganti dengan nama layanan backend Anda. port: number: <YOUR_SERVICE_PORT> # Ganti dengan port layanan Anda. pathType: ImplementationSpecificKluster versi 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 dengan nama domain Anda. secretName: ingress-tls rules: - host: <YOUR_DOMAIN_NAME> # Ganti dengan nama domain Anda. http: paths: - path: / backend: serviceName: <YOUR_SERVICE_NAME> # Ganti dengan nama layanan backend Anda. servicePort: <YOUR_SERVICE_PORT> # Ganti 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 READY bukan True, jalankan
kubectl 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 2mMasukkan
https://[nama domain Anda]di browser web untuk mengakses nama domain yang dikonfigurasi.
Konfigurasikan pengalihan HTTP ke HTTPS
Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/ssl-redirect untuk Nginx Ingress guna memaksa traffic HTTP dialihkan ke HTTPS. Berikut adalah contohnya:
Kluster versi 1.19 dan yang lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true" # Paksa traffic HTTP dialihkan ke HTTPS.Kluster versi sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true" # Paksa traffic HTTP dialihkan ke HTTPS.