首页 > 其他 > 详细

k8s Pod内无法Ping通集群外部的网络IP

时间:2021-05-25 16:55:12      阅读:291      评论:0      收藏:0      [点我收藏+]

自己使用一台master两台worker搭建了一个k8s集群。把服务部署上去后,发现服务无法访问到部署在集群外部的数据库。
在宿主机上直接ping是能够ping通的,但是pod中不行。
pod能ping通各node ip,但无法ping通集群外部的网络ip。这个问题很奇怪。

#通过busybox验证
kubectl run busybox -it --image=busybox --rm
ping 192.168.x.x

这个问题花了不少时间搜索,有人遇到过类似问题,虽然没有提供完整的的解决方法,但提供了问题的定位方法。
参考:http://dockone.io/question/1350 https://blog.csdn.net/kozazyh/article/details/80595782

问题的原因在于部署集群时使用的网络插件flannel配置不正确,导致node的iptables设置错误。
查看iptables规则方法如下:

iptables -t nat -S

#关键的配置
-A POSTROUTING -s 10.20.0.0/16 -d 10.20.0.0/16 -j RETURN
-A POSTROUTING -s 10.20.0.0/16 ! -d 224.0.0.0/4 -j MASQUERADE --random-fully
-A POSTROUTING ! -s 10.20.0.0/16 -d 10.20.0.0/24 -j RETURN
-A POSTROUTING ! -s 10.20.0.0/16 -d 10.20.0.0/16 -j MASQUERADE --random-fully

这里的10.20.0.0应该是pod cidr网段,你需要查看该网段与你实际使用的网段是否一致。不一致就会导致目前的问题。

该网段在使用Kubeadm部署k8s时,通过--pod-network-cidr参数指定

#https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#initializing-your-control-plane-node
sudo kubeadm init --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --control-plane-endpoint=cluster-endpoint --pod-network-cidr=10.20.0.0/16 --cri-socket=/run/containerd/containerd.sock --apiserver-advertise-address=192.168.197.13 -v=5

而在安装网络插件flannel时,在官方提供的配置中,其实也指定了网段,如果这两个网段不一致,那么就会出现此问题。

#kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-system
  labels:
    tier: node
    app: flannel
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

解决方法也很简单,重新设置flannel的网段配置,然后重启集群即可。
参考:https://stackoverflow.com/questions/55877256/kubernetes-pod-cant-reach-external-ip-address

#读取configmap
kubectl get configmap -n kube-system -o yaml kube-flannel-cfg > flannel.yaml

#修改flannel net-conf.json网段配置,设置为与pod cidr一致
vi flannel.yaml 

net-conf.json: |
{
    "Network": "10.244.0.0/16", #修改此行
    "Backend": {
    "Type": "vxlan"
    }
}

#应用配置
kubectl apply -f flannel.yaml

k8s Pod内无法Ping通集群外部的网络IP

原文:https://www.cnblogs.com/wswind/p/14808756.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!