部署了Ingress服务,发现Ingress服务在Master节点无法访问,在很多的Node节点上也无法访问,但是在其中一个Node上却可以访问。ChatGPT提醒我,检查是否externalTrafficPolicy: Local
。
通过如下的命令,可以发现Ingress中externalTrafficPolicy: Local
,其他服务externalTrafficPolicy: Cluster
。
wanna@dell-server-k8s-master01:~$ kubectl get svc ingress-nginx-controller -n ingress-nginx -o yaml | grep externalTrafficPolicy
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/component":"controller","app.kubernetes.io/instance":"ingress-nginx","app.kubernetes.io/name":"ingress-nginx","app.kubernetes.io/part-of":"ingress-nginx","app.kubernetes.io/version":"1.12.0-beta.0"},"name":"ingress-nginx-controller","namespace":"ingress-nginx"},"spec":{"externalTrafficPolicy":"Local","ipFamilies":["IPv4"],"ipFamilyPolicy":"SingleStack","ports":[{"appProtocol":"http","name":"http","nodePort":31888,"port":80,"protocol":"TCP","targetPort":"http"},{"appProtocol":"https","name":"https","nodePort":31889,"port":443,"protocol":"TCP","targetPort":"https"}],"selector":{"app.kubernetes.io/component":"controller","app.kubernetes.io/instance":"ingress-nginx","app.kubernetes.io/name":"ingress-nginx"},"type":"NodePort"}}
externalTrafficPolicy: Local
wanna@dell-server-k8s-master01:~$ kubectl get svc halo-prod-service -n halo-prod -o yaml | grep externalTrafficPolicy
externalTrafficPolicy: Cluster
两种类型的对比:
Cluster (默认):
- 任何 Node 的 NodePort 都可以接受流量,并通过 kube-proxy 负载均衡到 Ingress Pod , 所有 Node 都能访问,流量会自动分发
- 可能会影响客户端真实 IP
Local:
- 只有运行 Ingress Controller 的 Node 才能处理流量,直接转发到本地 Pod ✅,能保留客户端真实 IP,减少 kube-proxy 额外转发
- ❌可能导致部分 NodePort 不可用
评论