同一节点上运行的Pod无法通过Service ClusterIP相互访问

66次阅读
没有评论

问题描述

在使用Kubernetes时,遇到了一个奇怪的问题:在同一节点上运行的Pod无法通过Service ClusterIP相互访问,但是它们可以直接相互访问而不经过Service ClusterIP。
用户的环境如下:
– Kubernetes版本:1.9.6
– 操作系统:Ubuntu 16.04
– 使用的组件:CNI 0.7.0、cri-containerd 1.0.0-beta、flannel 0.9.1、etcd 3.0.13
用户表示其他场景都能正常工作,即使在不同的节点上运行的Pod也可以通过Service ClusterIP相互访问。用户希望能够解决这个问题,寻求支持。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据用户的描述,这个问题可能是由于响应数据包没有经过iptables,而是直接通过cni0网桥返回,导致源IP地址没有被设置为Service ClusterIP。为了解决这个问题,可以在kube-proxy中添加以下选项:

--masquerade-all=true

这个选项将会对所有的数据包进行masquerade操作,确保响应数据包经过iptables并设置正确的源IP地址。添加该选项后,应该能够解决同一节点上运行的Pod无法通过Service ClusterIP相互访问的问题。
请按照以下步骤操作:
1. 编辑kube-proxy的配置文件,一般位于/etc/kubernetes/manifests/kube-proxy.yaml
2. 在kube-proxy的配置文件中找到command字段,并在其中添加--masquerade-all=true选项。
3. 保存并退出配置文件。
4. 重启kube-proxy服务,使配置生效。

kubectl delete pod -n kube-system -l k8s-app=kube-proxy
  1. 等待kube-proxy重新启动后,验证问题是否解决。

方案2

如果方案1无法解决问题,你可以尝试升级Kubernetes版本,以查看是否有相关的修复。请确保在升级之前备份重要的数据,并在升级过程中遵循官方文档的指导。

注意:在升级之前,请确保你已经了解了新版本的变化和可能的影响,并在测试环境中进行充分的测试。

希望以上解决方案能够帮助你解决同一节点上运行的Pod无法通过Service ClusterIP相互访问的问题。如果问题仍然存在,请提供更多的详细信息,以便我们能够更好地帮助你解决问题。

正文完