本機主機監聽器 (LocalhostListener)
當工作負載在 localhost
網路介面上監聽時,但該連接埠已在 Service 中公開時,就會發生此訊息。發生這種情況時,其他 Pod 將無法存取該連接埠。
這個檢查的主要目的是為了偵測在升級到 Istio 1.10 或更高版本時,可能會出現問題的舊版 Istio 工作負載。這種行為與沒有 Istio 的標準 Kubernetes 叢集中發生的情況一致,但舊版的 Istio 會公開這些端口。
範例
考慮一個 Service
,選擇一個執行命令 nc localhost 8080 -l
的 Pod
。
apiVersion: v1
kind: Service
metadata:
name: netcat
spec:
ports:
- port: 8080
protocol: TCP
selector:
app: netcat
因為應用程式在 localhost
上提供流量,所以它無法從其他 Pod 訪問。
上面的範例顯示了使用簡單的 nc
工具。在其他語言中,一些等效的範例:
- Go:
net.Listen("tcp", "localhost:8080")
- Node.js:
http.createServer().listen(8080, "localhost");
- Python:
socket.socket().bind(("localhost", 8083))
如何解決
如果您不打算將應用程式暴露給其他 Pod,您可以從 Service
中移除該端口。
如果您確實想將應用程式暴露給其他 Pod,則有兩個選項:
- 修改應用程式以綁定到暴露給其他 Pod 的網路介面。通常,這意味著綁定到
0.0.0.0
或::
,例如nc 0.0.0.0 8080 -l
。 - 建立一個
Sidecar
設定,以自訂 Pod 的入站網路設定。例如,對於上述應用程式:
apiVersion: networking.istio.io/v1
kind: Sidecar
metadata:
name: ratings
spec:
workloadSelector:
labels:
app: netcat
ingress:
- port:
number: 8080
protocol: TCP
name: tcp
defaultEndpoint: 127.0.0.1:8080