K8s Pod无法访问SLB地址
一、问题现象
客户反馈172.16.11.220 telnet 47.99.87.129 80 不通,另一台172.16.11.219可以通。
二、排查思路
172.16.11.220,172.16.11.219 分别是k8s集群中的两个节点,使用负载均衡 x.x.x.x部署入口网关,当应用Pod访问入口网关暴露的SLB地址时,出现以下问题:
部分节点上的Pod能访问入口网关暴露的SLB地址。
部分节点上的Pod不能访问入口网关暴露的SLB地址。
排除了网络以及安全规则等原因。怀疑是k8s集群中的配置导致。
三、结论
如果Kubernetes集群的服务配置了externalTrafficPolicy: Local,则只有部署了服务的后端Pod才能访问SLB地址。因为SLB地址是集群外使用,如果集群节点和Pod不能直接访问SLB地址,请求不会路由到负载均衡,而是被当作服务的扩展IP地址,被kube-proxy的iptables或IPVS转发。
如果集群节点或者Pod所在的节点上没有相应的后端服务Pod,就会发生网络不通的问题。而如果有相应的后端服务Pod,则可以正常访问SLB地址。
四、解决方案
1、可以将pod分别调度到这两台node节点上 ,这样两个节点都可以访问到该slb;
2、可以在Kubernetes集群内通过ClusterIP或者服务名访问SLB地址。
最后业务方将pod部署到不同节点后解决