LocalhostListener
当工作负载在监听 localhost
网络接口,但该端口在 Service 中已暴露时,会出现此消息。
当出现这种情况时,其他 Pod 将无法访问该端口。
增加此项检查主要是为了检测旧版 Istio 上的工作负载在升级到 Istio 1.10 或更高版本时可能会出现问题。 这种行为与未安装 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/v1beta1
kind: Sidecar
metadata:
name: ratings
spec:
workloadSelector:
labels:
app: netcat
ingress:
- port:
number: 8080
protocol: TCP
name: tcp
defaultEndpoint: 127.0.0.1:8080