LocalhostListener

消息名称LocalhostListener
消息代码IST0143
描述A port exposed in a Service is bound to a localhost address
等级Error

当工作负载在监听 localhost 网络接口,但该端口在 Service 中已暴露时,会出现此消息。 当出现这种情况时,其他 Pod 将无法访问该端口。

增加此项检查主要是为了检测旧版 Istio 上的工作负载在升级到 Istio 1.10 或更高版本时可能会出现问题。 这种行为与未安装 Istio 的标准 Kubernetes 集群中会发生的情况相匹配,但旧版本的 Istio 会暴露这些端口。

由于此项检查依赖于特权运行时检查,因此它不包含在标准的 istioctl analyze 中。 此项检查包含在 istioctl experimental precheck 的安装和升级检查中。

示例

以一个 Service 为例,执行 nc localhost 8080 -l 命令选择 Pod

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: netcat
  5. spec:
  6. ports:
  7. - port: 8080
  8. protocol: TCP
  9. selector:
  10. 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 的入站网络配置。例如,对于上述应用程序:
  1. apiVersion: networking.istio.io/v1beta1
  2. kind: Sidecar
  3. metadata:
  4. name: ratings
  5. spec:
  6. workloadSelector:
  7. labels:
  8. app: netcat
  9. ingress:
  10. - port:
  11. number: 8080
  12. protocol: TCP
  13. name: tcp
  14. defaultEndpoint: 127.0.0.1:8080