Ketika layanan gerbang masuk menggunakan externalTrafficPolicy: Local, pod pada beberapa node dapat mengakses alamat IP Classic Load Balancer (CLB), sedangkan pod pada node lain tidak dapat. Topik ini menjelaskan penyebab dan solusi masalah tersebut.
Gejala
Setelah Anda menambahkan kluster Kubernetes ke instans Service Mesh (ASM) dan mengonfigurasi instans CLB untuk gerbang masuk dengan externalTrafficPolicy: Local, gejala berikut muncul saat pod aplikasi mengakses alamat IP CLB yang diekspos oleh gerbang masuk:
-
Pod pada beberapa node dapat mengakses alamat IP CLB dari gerbang masuk.
-
Pod pada node lain tidak dapat mengakses alamat IP CLB yang sama.
Diagnosis Masalah
Sebelum menerapkan perbaikan, pastikan bahwa pengaturan externalTrafficPolicy: Local merupakan penyebab masalah.
-
Periksa pengaturan
externalTrafficPolicypada layanan gerbang masuk. Jika output-nya adalahLocal, maka masalah ini berlaku.kubectl get svc istio-ingressgateway -n istio-system -o jsonpath='{.spec.externalTrafficPolicy}' -
Daftar node yang menjalankan pod gerbang masuk dan catat kolom
NODE.kubectl get pods -n istio-system -l app=istio-ingressgateway -o wide -
Identifikasi node tempat pod yang gagal berjalan. Jika pod tersebut berada pada node yang tidak muncul dalam output langkah 2, maka akar penyebab telah dikonfirmasi.
kubectl get pod <failing-pod-name> -n <namespace> -o wide
Akar Penyebab
Ketika externalTrafficPolicy diatur ke Local, kube-proxy menambahkan aturan iptables (atau IP Virtual Server/IPVS) yang hanya mengarahkan lalu lintas ke titik akhir pada node lokal. Urutan berikut menggambarkan cara kube-proxy memproses permintaan dalam kluster ke alamat IP CLB:
-
Sebuah pod mengirim permintaan ke alamat IP eksternal CLB.
-
kube-proxy mengenali alamat IP CLB sebagai alamat IP eksternal layanan gerbang masuk dan mencegat permintaan tersebut alih-alih meneruskannya ke CLB.
-
kube-proxy mencari titik akhir gerbang masuk pada node yang sama dengan pod yang melakukan permintaan.
-
Jika terdapat pod gerbang masuk pada node tersebut, kube-proxy meneruskan permintaan ke pod tersebut sehingga permintaan berhasil.
-
Jika tidak ada pod gerbang masuk pada node tersebut, kube-proxy tidak menemukan titik akhir lokal sehingga permintaan gagal.
Ini merupakan perilaku Kubernetes yang diharapkan untuk externalTrafficPolicy: Local. Untuk informasi lebih lanjut, lihat Why kube-proxy add external-lb's address to node local iptables rule?.
Solusi
Pilih solusi berdasarkan kebutuhan Anda untuk mempertahankan alamat IP sumber dan jenis plugin CNI yang digunakan oleh kluster.
|
Solusi |
Mempertahankan IP sumber |
Prasyarat |
Perubahan konfigurasi |
|
Gunakan nama DNS layanan |
Ya (untuk traffic eksternal) |
Tidak ada |
Tidak ada |
|
Atur externalTrafficPolicy ke Cluster |
Tidak |
Tidak ada |
Ubah CRD |
|
Gunakan koneksi langsung ENI |
Ya |
CNI Terway dengan mode ENI |
Ubah CRD |
Gunakan Nama DNS Layanan (Direkomendasikan)
Alih-alih menggunakan alamat IP eksternal CLB dari dalam kluster, akses gerbang masuk melalui ClusterIP atau nama DNS-nya. Lalu lintas ClusterIP menggunakan jalur perutean kube-proxy terpisah yang meneruskan ke semua titik akhir di seluruh kluster, sehingga melewati batasan externalTrafficPolicy: Local.
Gunakan nama DNS layanan berikut untuk akses dalam kluster:
istio-ingressgateway.istio-system
Sebagai contoh, untuk mengirim permintaan dari sebuah pod:
curl http://istio-ingressgateway.istio-system
Catatan: Pendekatan ini tidak memerlukan perubahan konfigurasi, kompatibel dengan semua plugin CNI, dan tetap mempertahankan alamat IP sumber untuk lalu lintas eksternal yang masuk melalui CLB.
Atur externalTrafficPolicy ke Cluster
Jika Anda tidak perlu mempertahankan alamat IP sumber, atur externalTrafficPolicy ke Cluster. Pengaturan ini menginstruksikan kube-proxy untuk meneruskan lalu lintas ke pod gerbang masuk pada node mana pun, bukan hanya node lokal.
Perbarui Custom Resource Definition (CRD) IstioGateway:
apiVersion: istio.alibabacloud.com/v1beta1
kind: IstioGateway
metadata:
name: ingressgateway
namespace: istio-system
....
spec:
externalTrafficPolicy: Cluster
....
Untuk detail tentang bidang CRD, lihat Bidang CRD untuk gerbang.
Catatan: Dengan externalTrafficPolicy: Cluster, permintaan masuk akan menjalani Translasi Alamat IP Sumber (SNAT), yang mengganti alamat IP sumber klien dengan alamat IP internal node. Jika aplikasi Anda bergantung pada alamat IP sumber klien, gunakan solusi lain.
Gunakan Koneksi Langsung ENI
Jika kluster Anda menggunakan elastic network interfaces (ENIs) melalui Terway atau berjalan dalam mode ENI inklusif, atur externalTrafficPolicy ke Cluster sekaligus mempertahankan alamat IP sumber melalui koneksi langsung ENI.
Perbarui CRD IstioGateway untuk mengatur externalTrafficPolicy: Cluster dan tambahkan anotasi service.beta.kubernetes.io/backend-type: eni:
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: LoadBalancer
Untuk detail tentang bidang CRD, lihat Bidang CRD untuk gerbang.
Verifikasi Perbaikan
Setelah menerapkan solusi pilihan Anda, verifikasi bahwa pod yang sebelumnya gagal kini dapat mengakses gerbang masuk:
kubectl exec <failing-pod-name> -n <namespace> -- curl -s -o /dev/null -w "%{http_code}" http://istio-ingressgateway.istio-system
Kode respons 200 (atau respons HTTP valid lainnya) mengonfirmasi bahwa pod dapat mengakses gerbang masuk.