Nginx Ingress Controller mendukung tiga mode akses: akses jaringan publik dan pribadi sekaligus, hanya akses jaringan publik, serta hanya akses jaringan pribadi, sehingga memenuhi kebutuhan akses klien di berbagai lingkungan jaringan.
Cara kerja
Di dalam kluster, instans SLB menerima permintaan klien dan meneruskannya ke workload Nginx Ingress Controller, yang kemudian meneruskan permintaan tersebut ke layanan lainnya.
Konfigurasikan Nginx Ingress untuk akses jaringan publik dan pribadi sekaligus
Deploy dua Service untuk pod backend Nginx Ingress Controller—satu dikaitkan dengan instans SLB publik dan yang lainnya dengan instans SLB pribadi—untuk mendukung akses jaringan publik maupun pribadi.
Periksa jenis jaringan SLB saat ini.
kubectl describe service -n kube-system nginx-ingress-lb | grep "service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type"Jika output berisi
intranet, jenis saat ini adalah pribadi. Jika tidak, jenisnya publik.Buat Service baru untuk memastikan kedua jenis jaringan (publik dan pribadi) tersedia.
Buat dan simpan file bernama
nginx-ingress-lb-new.yaml. Jalankankubectl apply -f nginx-ingress-lb-new.yamluntuk membuat Service tersebut.Tambahkan Service jaringan pribadi
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb-intranet namespace: kube-system labels: app: nginx-ingress-lb annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet # Menentukan bahwa instans SLB menggunakan alamat jaringan pribadi. spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginxTambahkan Service jaringan publik
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb-internet namespace: kube-system labels: app: nginx-ingress-lb spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginxGanti
<service-name>dalam perintah berikut dengan nama Service baru Anda, lalu jalankan perintah tersebut. Jika mengembalikan200, Service baru tersebut berfungsi dengan benar.curl -s -o /dev/null -w "%{http_code}\n" http://$(kubectl get service -n kube-system <service-name> -o jsonpath='{.status.loadBalancer.ingress[0].ip}')Ganti
<service-name>dengan nama Service baru Anda, lalu jalankankubectl get service <service-name>. Catat External IP Service tersebut dan konfigurasikan DNS berdasarkan jenis Service:Service jaringan pribadi baru
Masuk ke Alibaba Cloud DNS – Private DNS. Pada tab , klik Add Zone. Jika domain sudah ditambahkan sebelumnya, lanjutkan ke langkah c.
Pada Authoritative Zone, masukkan nama domain Anda. Biarkan opsi lain tetap pada nilai default, lalu klik OK.
Klik domain target. Pada tab Settings, klik Add Record. Isi formulir menggunakan nilai-nilai pada tabel di bawah. Biarkan pengaturan lain tetap pada nilai default, lalu klik OK.
Item konfigurasi
Nilai
Record Type
A
Hostname
Masukkan awalan subdomain sesuai kebutuhan.
Record Value
Alamat IP dari Service baru.
Kembali ke daftar User Defined Zones. Pada kolom Actions untuk domain target Anda, pilih Effective Scope. Di bawah Effective in VPCs, pilih VPC tempat kluster ACK Anda berada. Lalu klik OK.
Service jaringan publik baru
Masuk ke Alibaba Cloud DNS – Public Authoritative DNS. Klik domain target Anda untuk membuka halaman Settings. Klik tombol Add Record.
Isi formulir menggunakan nilai-nilai pada tabel di bawah. Biarkan pengaturan lain tetap pada nilai default, lalu klik OK.
Item konfigurasi
Nilai
Record Type
A.
Hostname
Masukkan awalan subdomain sesuai kebutuhan.
Record Value
Alamat IP dari Service baru.
Ubah jenis jaringan
Operasi ini menghapus dan membuat ulang Service untuk mengganti instans SLB, sehingga menyebabkan gangguan sementara pada Nginx Ingress. Instans SLB yang dihapus beserta alamat IP-nya tidak dapat dipulihkan.
Pastikan instans SLB yang ada tidak memiliki traffic:
Masuk ke Container Service Management Console. Klik kluster target Anda. Di panel navigasi sebelah kiri, buka . Temukan
nginx-ingress-lbdi namespacekube-system. Catat External IP-nya.Masuk ke Classic Load Balancer console. Pilih wilayah yang sama dengan kluster Anda. Temukan instans CLB yang IP Address-nya sesuai dengan alamat IP yang dicatat pada langkah sebelumnya. Klik instans tersebut. Pada tab Monitoring, pastikan jumlah koneksi adalah 0 sebelum melanjutkan.
Hapus Service saat ini yang digunakan oleh Nginx Ingress Controller.
kubectl delete svc -n kube-system nginx-ingress-lbBuat dan simpan file bernama
nginx-ingress-lb.yaml. Lalu jalankankubectl apply -f nginx-ingress-lb.yamluntuk membuat Service tersebut.PentingNama Service baru harus
nginx-ingress-lb.Service jaringan pribadi
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb namespace: kube-system labels: app: nginx-ingress-lb annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet # Menentukan bahwa instans SLB menggunakan alamat jaringan pribadi. spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginxService jaringan publik
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb namespace: kube-system labels: app: nginx-ingress-lb spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginxUji Service baru. Jika mengembalikan
200, Service tersebut berfungsi dengan benar.curl -s -o /dev/null -w "%{http_code}\n" http://$(kubectl get service -n kube-system nginx-ingress-lb -o jsonpath='{.status.loadBalancer.ingress[0].ip}')Jalankan
kubectl get service nginx-ingress-lb. Catat External IP Service tersebut dan konfigurasikan DNS berdasarkan jenis Service:Service jaringan pribadi baru
Masuk ke Alibaba Cloud DNS – Private DNS. Pada tab , klik Add Zone. Jika domain sudah ditambahkan sebelumnya, lanjutkan ke langkah c.
Pada Authoritative Zone, masukkan nama domain Anda. Biarkan opsi lain tetap pada nilai default, lalu klik OK.
Klik domain target. Pada tab Settings, klik Add Record. Isi formulir menggunakan nilai-nilai pada tabel di bawah. Biarkan pengaturan lain tetap pada nilai default, lalu klik OK.
Item konfigurasi
Nilai
Record Type
A
Hostname
Masukkan awalan subdomain sesuai kebutuhan.
Record Value
Alamat IP dari Service baru.
Kembali ke daftar User Defined Zones. Pada kolom Actions untuk domain target Anda, pilih Effective Scope. Di bawah Effective in VPCs, pilih VPC tempat kluster ACK Anda berada. Lalu klik OK.
Service jaringan publik baru
Masuk ke Alibaba Cloud DNS – Public Authoritative DNS. Klik domain target Anda untuk membuka halaman Settings. Klik tombol Add Record.
Isi formulir menggunakan nilai-nilai pada tabel di bawah. Biarkan pengaturan lain tetap pada nilai default, lalu klik OK.
Item konfigurasi
Nilai
Record Type
A.
Hostname
Masukkan awalan subdomain sesuai kebutuhan.
Record Value
Alamat IP dari Service baru.
FAQ
Mengapa saya tidak bisa membuat Service baru sebelum menghapus yang lama?
Saat mengubah jenis jaringan Nginx Ingress Controller, Anda tidak dapat beralih dengan membuat Service baru terlebih dahulu lalu menghapus yang lama. Anda harus menghapus Service lama sebelum membuat yang baru. Selama peningkatan komponen, workload Nginx Ingress Controller mencocokkan Service berdasarkan nama default-nya (nginx-ingress-lb). Karena Service tidak dapat memiliki nama yang sama, membuat Service baru sebelum menghapus yang lama akan mencegah workload mencocokkan instans SLB yang benar, sehingga menyebabkan kegagalan peningkatan.
Mengapa alamat IP yang digunakan klien berbeda dari endpoint yang ditampilkan di konsol?
Endpoint yang ditampilkan pada halaman Ingress di konsol adalah alamat IP instans SLB yang dikaitkan dengan Service bernama nginx-ingress-lb. Saat beberapa Service bertipe LoadBalancer dikonfigurasi, Nginx Ingress tetap meneruskan semua permintaan dengan benar. Namun, konsol hanya menampilkan alamat IP instans SLB yang terkait dengan Service default. Alamat IP aktual yang diakses klien bergantung pada instans SLB yang mereka gunakan (yang dapat Anda verifikasi melalui pengujian resolusi DNS). Oleh karena itu, alamat tersebut mungkin berbeda dari Endpoint yang ditampilkan di konsol.
Jika Anda menghapus nginx-ingress-lb dan membuat ulang Service dengan nama yang sama, Anda harus memperbarui resource Ingress untuk merefresh endpoint yang ditampilkan.Bagaimana cara melakukan rollback setelah perubahan yang salah?
Lakukan langkah-langkah berikut secara berurutan sesegera mungkin:
Hapus Service yang baru dibuat untuk mencegah konflik penamaan yang menghalangi komponen membuat Service default.
Di konsol, uninstall dan reinstall komponen Nginx Ingress Controller, yang akan membuat Service default baru di kluster untuk memulihkan titik masuk Nginx Ingress.
Konfigurasikan DNS untuk menambahkan resolusi nama domain untuk Service default baru (
nginx-ingress-lb), lalu uji apakah penerusan berfungsi dengan baik.
Referensi
Untuk detail tentang konfigurasi anotasi untuk instans SLB yang sudah ada, lihat Use an existing SLB instance.