本機主機監聽器 (LocalhostListener)

當工作負載在 localhost 網路介面上監聽時,但該連接埠已在 Service 中公開時,就會發生此訊息。發生這種情況時,其他 Pod 將無法存取該連接埠。

這個檢查的主要目的是為了偵測在升級到 Istio 1.10 或更高版本時,可能會出現問題的舊版 Istio 工作負載。這種行為與沒有 Istio 的標準 Kubernetes 叢集中發生的情況一致,但舊版的 Istio 會公開這些端口。

範例

考慮一個 Service,選擇一個執行命令 nc localhost 8080 -lPod

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