Kubernetes集群使用Calico CNI时工作节点无法访问本地CoreDNS Pod如何解决
故障排查与修复指南
核心现象说明
跨节点访问节点IP上的CoreDNS 8080健康检查端口正常,节点本地访问自身IP的对应端口超时,该问题为Calico CNI部署场景下的典型网络策略/内核参数配置问题。
排查步骤
- 检查CoreDNS端口暴露配置
执行命令kubectl get pod -n kube-system -l k8s-app=kube-dns -o yaml,确认CoreDNS Pod是否通过hostPort绑定了8080端口,或对应Service是否通过NodePort暴露了8080端口。 - 校验kube-proxy转发规则
若kube-proxy为iptables模式,执行iptables -t nat -nvL KUBE-SERVICES | grep 8080,检查是否存在对应8080端口的DNAT转发规则,规则是否指向运行在本地的CoreDNS PodIP;若为ipvs模式,执行ipvsadm -Ln | grep 8080检查虚拟服务规则是否配置正确。 - 检查rp_filter内核参数配置
该场景90%以上的问题由该参数配置错误导致:Calico默认会将节点的反向路径过滤参数rp_filter设置为严格模式(值为1),本地访问本机节点IP的端口时,请求路径和回包路径不一致,会被rp_filter规则直接丢弃。
执行命令sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.default.rp_filter,如果输出值为1即可确认根因。
修复方案
- 方案1:调整Calico的rp_filter校验模式(最通用)
执行以下命令修改Calico Felix配置,将反向路径校验改为宽松模式:
也可以直接修改节点内核参数永久生效:kubectl patch felixconfiguration default --type='merge' -p '{"spec":{"ipv4StrictReversePathForwarding": "Loose"}}'echo "net.ipv4.conf.all.rp_filter=2" >> /etc/sysctl.conf echo "net.ipv4.conf.default.rp_filter=2" >> /etc/sysctl.conf sysctl -p - 方案2:调整CoreDNS访问方式
若不想修改全局网络配置,可以修改CoreDNS的健康检查监听地址为0.0.0.0,本地节点直接访问127.0.0.1:8080即可,无需走节点IP转发。 - 方案3:修复kube-proxy hairpin配置(适用于ipvs模式)
若kube-proxy使用ipvs模式,检查是否开启了hairpinMode:编辑kube-proxy ConfigMap,将hairpin-mode设置为hairpin-veth,重启kube-proxy Pod后生效。
内容的提问来源于stack exchange,提问作者JovialCoding
相关产品推荐
相关产品推荐

