Istio 1.10 中即將推出的網路變更
了解 Istio 網路即將發生的變更、這些變更可能對您的叢集造成的影響,以及應採取的行動。
背景
雖然 Kubernetes 網路是可自訂的,但典型的 Pod 網路會像這樣
應用程式可以選擇繫結到迴路介面 lo
(通常繫結到 127.0.0.1
),或 Pod 的網路介面 eth0
(通常繫結到 Pod 的 IP),或兩者皆繫結(通常繫結到 0.0.0.0
)。
繫結到 lo
可讓從 Pod 內呼叫 curl localhost
之類的指令。繫結到 eth0
可讓從其他 Pod 呼叫此 Pod。
通常,應用程式會繫結到兩者。但是,具有內部邏輯的應用程式(例如管理介面)可能會選擇僅繫結到 lo
以避免其他 Pod 的存取。此外,某些應用程式(通常是有狀態的應用程式)會選擇僅繫結到 eth0
。
目前行為
在 1.10 版本之前的 Istio 中,與應用程式在同一個 Pod 中執行的 Envoy Proxy 會繫結到 eth0
介面,並將所有傳入流量重新導向到 lo
介面。
這會產生兩個重要的副作用,導致行為與標準 Kubernetes 不同
- 僅繫結到
lo
的應用程式將會收到來自其他 Pod 的流量,否則這是被禁止的。 - 僅繫結到
eth0
的應用程式將不會收到流量。
繫結到兩個介面(這是典型的)的應用程式將不會受到影響。
未來行為
從 Istio 1.10 開始,網路行為會變更為與 Kubernetes 中的標準行為一致。
在這裡我們可以看到 Proxy 不再將流量重新導向到 lo
介面,而是將其轉發到 eth0
上的應用程式。因此,Kubernetes 的標準行為會保留下來,但我們仍然可以獲得 Istio 的所有好處。此變更讓 Istio 更接近其目標,也就是成為一個隨插即用的透明 Proxy,可以零配置的方式與現有工作負載搭配運作。此外,它還可以避免意外暴露僅繫結到 lo
的應用程式。
我是否會受到影響?
對於新使用者而言,此變更應該只是一種改進。但是,如果您是現有使用者,您可能已經有意識或無意識地開始依賴舊行為。
為了協助偵測這些情況,我們新增了一個檢查來尋找會受到影響的 Pod。您可以執行 istioctl experimental precheck
命令以取得任何繫結到 lo
且在 Service
中公開的連接埠的 Pod 的報告。此命令在 Istio 1.10+ 中可用。如果未採取任何行動,這些連接埠在升級後將不再可存取。
$ istioctl experimental precheck
Error [IST0143] (Pod echo-local-849647c5bd-g9wxf.default) Port 443 is exposed in a Service but listens on localhost. It will not be exposed to other pods.
Error [IST0143] (Pod echo-local-849647c5bd-g9wxf.default) Port 7070 is exposed in a Service but listens on localhost. It will not be exposed to other pods.
Error: Issues found when checking the cluster. Istio may not be safe to install or upgrade.
See https://istio.dev.org.tw/latest/docs/reference/config/analysis for more information about causes and resolutions.
移轉
如果您目前繫結到 lo
,您有幾個選項
將您的應用程式切換為繫結到所有介面(
0.0.0.0
或::
)。使用
Sidecar
輸入配置明確配置連接埠以傳送到lo
,保留舊行為。例如,設定對
ratings
應用程式的請求傳送到localhost
apiVersion: networking.istio.io/v1beta1 kind: Sidecar metadata: name: ratings spec: workloadSelector: labels: app: ratings ingress: - port: number: 8080 protocol: HTTP name: http defaultEndpoint: 127.0.0.1:8080
使用 Istiod 中的
PILOT_ENABLE_INBOUND_PASSTHROUGH=false
環境變數完全停用此變更,以啟用與 Istio 1.10 之前相同的行為。此選項將在未來移除。