记录在日常使用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网络