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