Topik ini menjelaskan cara menyebarkan beberapa pengontrol NGINX Ingress yang independen di dalam kluster Container Service for Kubernetes (ACK) untuk menyediakan layanan Internet-facing yang berbeda.
Informasi latar belakang
Anda dapat mengonfigurasi pengontrol NGINX Ingress yang menghadap internet atau akses internal untuk menyesuaikan konfigurasi default dari pengontrol NGINX Ingress pada kluster ACK. Ini memungkinkan Anda menggunakan instance SLB dengan akses internal. Mode yang disebutkan dalam topik ini dapat memenuhi sebagian besar kebutuhan. Dalam skenario tertentu, beberapa layanan Internet-facing harus dapat diakses oleh pengguna eksternal, tetapi layanan lainnya hanya mengizinkan permintaan dari beban kerja non-kluster dalam virtual private cloud (VPC) yang sama. Dalam hal ini, Anda dapat menyebarkan dua pengontrol NGINX Ingress yang independen dan mengaitkannya dengan instance SLB dari tipe jaringan yang berbeda.
Catatan Penggunaan
Berikut adalah catatan penggunaan untuk mengonfigurasi beberapa pengontrol Ingress, termasuk mengonfigurasi IngressClass yang unik dan menentukan batasan panjang untuk nama Layanan.
Konfigurasikan IngressClass yang Unik
Saat menggunakan beberapa pengontrol Ingress, Anda harus mengonfigurasi IngressClass yang unik untuk setiap pengontrol guna memastikan operasi normal dan mencegah konflik. Modifikasi parameter berikut:
controller.ingressClassResource.name: Tentukan nama unik untuk setiap pengontrol Ingress.
controller.ingressClassResource.controllerValue: Tentukan pengenal unik untuk setiap pengontrol Ingress.
Tentukan Batasan Panjang untuk Nama Layanan
Saat Anda menyebarkan aplikasi Helm bernama
ack-ingress-nginx-v1, Layanan dengan nama dalam format berikut akan dibuat secara otomatis:<Nama Aplikasi>-ack-ingress-nginx-v1-controller.Jika jenis Layanan LoadBalancer adalahinternal, namanya dalam format<nama aplikasi>-ack-ingress-nginx-v1-controller-internal. Pastikan nama Layanan tidak melebihi 63 karakter. Jika tidak, pembuatan sumber daya mungkin gagal dan pesan kesalahan berikut ditampilkan:tidak ada layanan dengan nama xxx-open-api-test-inter-ack-ingress-nginx-v1-controller-internal ditemukan di namespace open-api-test-inter: services "xxx-open-api-test-inter-ack-ingress-nginx-v1-controller-internal" tidak ditemukan ,Jika kesalahan ini terjadi, periksa dan perpendek nama aplikasi Helm, lalu sebarkan ulang aplikasi tersebut.
Menyebarkan pengontrol NGINX Ingress baru
Setelah kluster ACK dibuat, pengontrol NGINX Ingress dengan dua replika pod akan disebarkan secara otomatis. Instance SLB yang menghadap internet juga dibuat sebagai layanan load balancing frontend.
Untuk menyebarkan pengontrol NGINX Ingress lain yang independen di dalam kluster, ikuti langkah-langkah berikut:
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, pilih grup sumber daya dan wilayah, temukan kluster yang ingin Anda kelola, lalu klik nama kluster. Di panel navigasi kiri, pilih .
Di halaman Helm, klik Deploy. Pada langkah Basic Information, konfigurasikan parameter berdasarkan tabel berikut.
Parameter
Contoh
Application Name
ack-ingress-nginx
CatatanAnda dapat mengonfigurasi nama aplikasi kustom. Perhatikan batasan panjang untuk nama Layanan.
Namespace
kube-system
Source
Sumber aplikasi. Nilai default: Marketplace.
Chart
Atur parameter Use Scenarios ke All.
Atur parameter Supported Architecture ke amd64.
Masukkan ack-ingress-nginx di kotak pencarian.
Jika kluster Anda menjalankan Kubernetes 1.20 atau lebih lama, klik ack-ingress-nginx.
Jika kluster Anda menjalankan Kubernetes 1.22 atau lebih baru, klik ack-ingress-nginx-v1.
Klik Next.
Pada langkah Parameters, konfigurasikan parameter Chart Version dan klik OK.
CatatanAnda hanya dapat memilih versi chart 4.0.17 atau lebih baru (ack-ingress-nginx-v1 1.8.0-aliyun.1 atau lebih baru) jika kluster ACK Anda menjalankan Kubernetes 1.22 atau lebih baru. Jika kluster ACK Anda menjalankan Kubernetes 1.20, pilih versi chart 4.0.16 (ack-ingress-nginx-v1 1.2.1-aliyun.1).
Tabel berikut menjelaskan parameter-parameter dari ack-ingress-nginx-v1.
Parameter
Deskripsi
controller.image.repository
Registry gambar ingress-nginx.
controller.image.tag
Versi gambar ingress-nginx. Untuk informasi lebih lanjut, lihat Pengontrol Ingress NGINX.
controller.ingressClassResource.name
Kelas Ingress dari pengontrol Ingress. Pengontrol Ingress hanya menangani Ingress yang diberi anotasi dengan kelas Ingress.
PentingParameter ini berfungsi sebagai alternatif untuk parameter controller.ingressClass untuk kluster ACK yang menjalankan versi Kubernetes lebih lama dari 1.22. Anda juga dapat menentukan parameter ini dalam anotasi kubernetes.io/ingress.class. Kelas Ingress setiap pengontrol Ingress harus unik dalam satu kluster. Kelas Ingress dari pengontrol Ingress default dalam kluster adalah nginx. Oleh karena itu, jangan atur parameter ini ke nginx.
controller.ingressClassResource.controllerValue
Kelas pengontrol dari pengontrol Ingress.
PentingKelas pengontrol setiap pengontrol Ingress harus unik dalam satu kluster. Kelas pengontrol dari pengontrol Ingress default dalam kluster adalah k8s.io/ingress-nginx. Oleh karena itu, jangan atur parameter ini ke k8s.io/ingress-nginx.
controller.replicaCount
Jumlah pod yang disediakan untuk pengontrol Ingress.
controller.service.enabled
Menentukan apakah akan menggunakan instance SLB yang menghadap internet dan instance SLB akses internal untuk load balancing.
controller.service.external.enabled
Menentukan apakah akan menggunakan instance SLB yang menghadap internet untuk load balancing. Jika Anda tidak ingin menggunakan instance SLB yang menghadap internet, atur parameter ini ke false.
controller.service.internal.enabled
Menentukan apakah akan menggunakan instance SLB akses internal untuk load balancing. Jika Anda ingin menggunakan instance SLB akses internal, atur parameter ini ke true.
controller.kind
Mode penyebaran pengontrol Ingress. Nilai valid: Deployment dan DaemonSet.
controller.electionID
ID yang digunakan untuk memperbarui status Ingress selama pemilihan pengontrol Ingress utama.
PentingSaat Anda menyebarkan beberapa pengontrol Ingress yang termasuk dalam namespace yang sama dari marketplace Konsol ACK, Anda harus mengatur parameter electionID ke nilai yang berbeda untuk pengontrol Ingress yang berbeda. Ini membantu mencegah konflik selama pemilihan pengontrol Ingress utama.
controller.metrics.enabled
Menentukan apakah akan mengaktifkan metrik ingress-nginx.
controller.metrics.serviceMonitor.enabled
Menentukan apakah akan mengaktifkan ServiceMonitor, yang digunakan untuk mengonfigurasi aturan untuk mengumpulkan metrik.
CatatanSetelah Anda mengaktifkan metrik ingress-nginx, kami sarankan Anda mengaktifkan ServiceMonitor. Kemudian, sistem secara otomatis mengonfigurasi Managed Service for Prometheus untuk mengumpulkan metrik.
controller.service.internal.loadBalancerClassMenentukan apakah Layanan menggunakan instance Classic Load Balancer (CLB) atau Network Load Balancer (NLB). Nilai valid:
"alibabacloud.com/clb": Layanan menggunakan instance CLB."alibabacloud.com/nlb": Layanan menggunakan instance NLB.
Secara default, Layanan menggunakan instance CLB.
Lihat pengontrol Ingress NGINX yang telah disebarkan.
Di halaman Helm, Anda dapat melihat bahwa pengontrol Ingress NGINX baru telah disebarkan.
Menguji konektivitas jaringan
Dalam contoh berikut, sebuah aplikasi dibuat dan menggunakan pengontrol Ingress NGINX baru untuk mengekspos layanan Internet-facing.
Sebarkan aplikasi NGINX.
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: run: nginx template: metadata: labels: run: nginx spec: containers: - image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 imagePullPolicy: Always name: nginx ports: - containerPort: 80 protocol: TCP restartPolicy: Always --- apiVersion: v1 kind: Service metadata: name: nginx spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: run: nginx sessionAffinity: None type: NodePortGunakan pengontrol Ingress NGINX untuk menyediakan layanan Internet-facing.
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx spec: # Atur nilainya menjadi kelas Ingress dari pengontrol Ingress NGINX baru. ingressClassName: "<YOUR_INGRESS_CLASS>" rules: - host: foo.bar.com http: paths: - path: / backend: service: name: nginx port: number: 80 pathType: ImplementationSpecificCatatanAnda harus mengonfigurasi anotasi
kubernetes.io/spec.ingressClassName.Setelah menyebarkan aplikasi, lakukan langkah-langkah berikut untuk menanyakan alamat IP Ingress dan alamat IP dari pengontrol Ingress NGINX baru:
Jalankan perintah berikut untuk menanyakan alamat IP dari instance SLB yang menghadap internet yang terkait dengan pengontrol Ingress NGINX default:
kubectl -n kube-system get svc nginx-ingress-lbOutput yang diharapkan:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-ingress-lb LoadBalancer 172.19.XX.XX 192.0.XX.XX 80:31429/TCP,443:32553/TCP 2dJalankan perintah berikut untuk menanyakan alamat IP dari instance SLB yang menghadap internet yang terkait dengan pengontrol Ingress NGINX baru:
kubectl -n <YOUR_NAMESPACE> get svc nginx-ingress-lbOutput yang diharapkan:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-ingress-lb LoadBalancer 172.19.XX.XX 198.51.XX.XX 80:30969/TCP,443:31325/TCP 39mJalankan perintah berikut untuk menanyakan konfigurasi Ingress:
kubectl get ingOutput yang diharapkan:
NAME HOSTS ADDRESS PORTS AGE nginx foo.bar.com 198.51.XX.XX 80 5m
Output menunjukkan bahwa alamat IP Ingress sama dengan alamat IP dari pengontrol Ingress NGINX baru.
Akses aplikasi menggunakan pengontrol Ingress NGINX default dan pengontrol Ingress NGINX baru.
curl -H "Host: foo.bar.com" http://192.0.XX.XXOutput yang diharapkan:
<html> <head><title>404 Not Found</title></head> <body> <center><h1>404 Not Found</h1></center> <hr><center>nginx</center> </body> </html>Gunakan pengontrol Ingress NGINX baru untuk mengakses aplikasi.
curl -H "Host: foo.bar.com" http://198.51.XX.XXOutput 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>
Uji coba sebelumnya menunjukkan bahwa Layanan yang diekspos menggunakan pengontrol NGINX Ingress yang berbeda tidak saling mengganggu. Solusi ini cocok untuk skenario di mana beberapa Layanan harus dapat diakses oleh pengguna eksternal, sedangkan yang lain hanya mengizinkan permintaan dari beban kerja non-Kubernetes dalam VPC yang sama.