记录在日常使用K8S中,遇到的坑,分享给大家

0x01 问题描述

k8s的pod无法互联网

0x02 原因排查

pod互联网访问测试

使用pod直接执行ping命令验证

$ kubectl exec -it mallpaycenterd-59d888b8c8-ktmhv -n mall ping baidu.com

发现返回报错为Name or service not known

coredns访问测试

通过以上测试初步怀疑是DNS解析出现问题,由于pod进行dns解析默认通过k8s集群的coredns进行域名解析。 查看coredns集群内地址

$ kubectl exec -it mallpaycenterd-9b775c749-5xnqm  -n mall cat /etc/resolv.conf
nameserver 10.0.0.2
search mall.svc.cluster.local. svc.cluster.local. cluster.local. openstacklocal
options ndots:5

可以发现pod内部使用的coredns地址为10.0.0.2
尝试使用pod内部的ping命令测试10.0.0.2

$ kubectl exec -it mallpaycenterd-59d888b8c8-ktmhv -n mall ping 10.0.0.2

发现返回报错为Time Out

pod所在的节点排查

查看问题pod所在节点

$ kubectl get pod -n mall -o wide| grep paycenter|awk '{print $1,$7}' 
mallpaycenterd-9b775c749-5xnqm  node1  

查看coredns所在节点

$ kubectl get pod -n kube-system -o wide| grep dns |awk '{print $1,$7}'
coredns-65cf74f9cb-snfcq master

发现两个pod部署与不同节点

排查flannel网络

查看master网络配置

$ ifconfig docker0 | grep inet
        inet 192.188.0.1  netmask 255.255.255.0  broadcast 192.188.0.255
        inet6 fe80::42:2ff:fe51:1a42  prefixlen 64  scopeid 0x20<link>
$ ifconfig flannel.1 | grep inet
        inet 172.17.28.0  netmask 255.255.255.255  broadcast 0.0.0.0
        inet6 fe80::6429:bbff:fe1f:ee2f  prefixlen 64  scopeid 0x20<link>

发现flannel与docker居然不是一个网段的 继续排查node网络配置

$ ifconfig docker0 | grep inet
        inet 192.188.66.1  netmask 255.255.255.0  broadcast  192.188.66.255
        inet6 fe80::42:55ff:feb4:7784  prefixlen 64  scopeid 0x20<link>
$ ifconfig flannel.1 | grep inet
        inet 172.17.67.0  netmask 255.255.255.255  broadcast 0.0.0.0
        inet6 fe80::30bd:faff:febc:5f1a  prefixlen 64  scopeid 0x20<link>

发现flannel与docker居然也不是一个网段的

排查etcd记录的网络信息

$ etcdctl --endpoints=https://masterip:2379 \
--ca-file=/k8s/etcd/ssl/ca.pem \
--cert-file=/k8s/etcd/ssl/server.pem \
--key-file=/k8s/etcd/ssl/server-key.pem \
ls /coreos.com/network/subnets
/coreos.com/network/subnets/172.17.67.0-24
/coreos.com/network/subnets/172.17.28.0-24

发现etcd存储的网络段正常的下发给了flannel,但docker并未使用该网段

排查docker启动配置

[Unit]
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

发现docker启动时并没有加载flannel网络配置,而是随机生成了一个网段

0x03 解决方案

  • 修改docker的启动配置,修改/usr/lib/systemd/system/docker.service

    ExecStart=/usr/bin/dockerd -H fd:// –containerd=/run/containerd/containerd.sock
    修改为
    EnvironmentFile=/run/flannel/subnet.env
    ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS
  • 删除docker的网络配置缓存
    $ cp -r /var/lib/docker/network/files/ /var/lib/docker/network/files.bak
    $ rm -rf /var/lib/docker/network/files/
    
  • 重启docker
    $ systemctl-reload 
    $ systemctl restart docker
    

参考链接:

1.我的 K8S 架构搭建 之旅
2.Flannel 只分配一个 /24 子网的问题解决
3.Kubernetes集群之Flannel网络
4.Kubernetes集群之Flannel网络