本地主机监听器

当工作负载在 localhost 网络接口上监听,但端口在服务中公开时,会出现此消息。当这种情况发生时,其他 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