Ketika kluster Kubernetes pada bidang data instans Service Mesh (ASM) menggunakan Classic Load Balancer (CLB) dengan externalTrafficPolicy: Local untuk gerbang masuk, pod di beberapa node mungkin gagal mengakses alamat IP CLB. Topik ini menjelaskan penyebabnya dan memberikan tiga solusi.
Gejala
Kluster Kubernetes telah ditambahkan ke instans ASM. Instans CLB dengan externalTrafficPolicy diatur ke Local dikonfigurasi untuk gerbang masuk. Anda mengamati perilaku berikut:
Pod di node tertentu dapat mengakses alamat IP CLB gerbang masuk.
Pod di node lainnya tidak dapat mengakses alamat IP CLB yang sama.
Penyebab
Ketika externalTrafficPolicy bernilai Local, kube-proxy hanya memprogram aturan pengalihan iptables atau IP Virtual Server (IPVS) pada node yang menjalankan pod backend dari layanan gerbang masuk. Node yang tidak memiliki pod gerbang masuk tidak memiliki aturan pengalihan, sehingga lalu lintas ke alamat IP CLB dibuang.
Alamat IP CLB diperlakukan sebagai IP eksternal layanan. Alih-alih mengarahkan lalu lintas keluar ke load balancer lalu kembali, kube-proxy memperpendek rute permintaan melalui aturan iptables atau IPVS lokal. Dengan externalTrafficPolicy: Local, hanya node dengan titik akhir lokal yang mendapatkan aturan tersebut.
Untuk diskusi Kubernetes hulu terkait, lihat Why kube-proxy add external-lb's address to node local iptables rule?.
Verifikasi masalah
Sebelum menerapkan perbaikan, pastikan akar penyebab ini berlaku dalam situasi Anda.
Periksa node mana yang menjalankan pod gerbang masuk: Perhatikan kolom NODE. Pod di node tersebut dapat mengakses IP CLB, sedangkan pod di node lain tidak dapat.
kubectl get pods -n istio-system -l app=istio-ingressgateway -o widePeriksa titik akhir layanan gerbang masuk: Alamat IP yang terdaftar sesuai dengan pod gerbang masuk. Node tanpa pod tersebut tidak memiliki aturan pengalihan lokal yang diperlukan untuk mengakses IP CLB.
kubectl get endpoints -n istio-system istio-ingressgateway(Opsional) Pada node tempat akses gagal, verifikasi bahwa tidak ada aturan iptables untuk IP CLB: Ganti
<CLB_IP>dengan alamat IP CLB sebenarnya. Jika tidak ada output yang dikembalikan, artinya node tersebut tidak memiliki aturan pengalihan untuk IP tersebut, yang mengonfirmasi masalah ini.iptables-save | grep <CLB_IP>
Solusi
Pilih solusi berdasarkan kebutuhan Anda:
| Solusi | IP sumber dipertahankan | Memerlukan ENI | Kompleksitas |
|---|---|---|---|
| Akses gerbang masuk melalui cluster IP atau nama Service | Ya | Tidak | Rendah |
Atur externalTrafficPolicy ke Cluster | Tidak | Tidak | Rendah |
Gunakan Cluster dengan koneksi langsung ENI | Ya | Ya | Sedang |
Solusi 1: Akses gerbang masuk melalui cluster IP atau nama Service (direkomendasikan)
Alih-alih menggunakan alamat IP CLB dari dalam kluster, gunakan alamat cluster IP atau nama Service Kubernetes untuk mengakses gerbang masuk:
istio-ingressgateway.istio-systemPendekatan ini berfungsi di semua node terlepas dari lokasi pod gerbang masuk, mempertahankan alamat IP sumber, dan tidak memerlukan perubahan konfigurasi.
Solusi 2: Atur externalTrafficPolicy ke Cluster
Ubah externalTrafficPolicy dari Local menjadi Cluster. Hal ini menginstruksikan kube-proxy untuk memprogram aturan pengalihan di semua node, bukan hanya pada node yang menjalankan pod gerbang masuk.
Trade-off: Alamat IP sumber tidak dipertahankan. Semua permintaan tampak berasal dari IP node tempat kube-proxy meneruskan lalu lintas.
Perbarui resource kustom IstioGateway:
apiVersion: istio.alibabacloud.com/v1beta1
kind: IstioGateway
metadata:
name: ingressgateway
namespace: istio-system
....
spec:
externalTrafficPolicy: Cluster
....Untuk detail bidang, lihat Bidang CRD untuk gateway.
Solusi 3: Gunakan Cluster dengan koneksi langsung ENI
Jika kluster Anda menggunakan elastic network interfaces (ENIs) Terway atau berjalan dalam mode ENI inklusif, kombinasikan externalTrafficPolicy: Cluster dengan anotasi service.beta.kubernetes.io/backend-type: eni. Pendekatan ini memulihkan pelestarian IP sumber melalui koneksi langsung ENI sekaligus menjaga aksesibilitas IP CLB dari semua node.
Prasyarat: Kluster harus menggunakan Terway sebagai plugin CNI, dengan mode ENI atau mode ENI inklusif diaktifkan.
Perbarui resource kustom IstioGateway:
apiVersion: istio.alibabacloud.com/v1beta1
kind: IstioGateway
metadata:
name: ingressgateway
namespace: istio-system
....
spec:
externalTrafficPolicy: Cluster
maxReplicas: 5
minReplicas: 2
ports:
- name: status-port
port: 15020
targetPort: 15020
- name: http2
port: 80
targetPort: 80
- name: https
port: 443
targetPort: 443
- name: tls
port: 15443
targetPort: 15443
replicaCount: 2
resources:
limits:
cpu: '2'
memory: 2G
requests:
cpu: 200m
memory: 256Mi
runAsRoot: false
serviceAnnotations:
service.beta.kubernetes.io/backend-type: eni
serviceType: LoadBalancerBidang serviceAnnotations: service.beta.kubernetes.io/backend-type: eni mengarahkan lalu lintas langsung melalui ENI dan mempertahankan alamat IP sumber.
Untuk detail bidang, lihat Bidang CRD untuk gateway.