刚接手一个测试集群,一个平台项目测试,部署到该k8s集群上。
部署上去之后就发现各种坑,所以在这里总结一下遇到的问题,及排查思路。。。
基础环境
kubernetes:1.16.x |
遇到的坑
跨节点 pod 之间某些可以ping通,某些不能ping通
不能ping通的pod都是在别的主机上
同一个 主机上的pod,有的可以ping通,有的不能ping通
dns svc 的ip 53 端口,不能telnet通。
某些 pod 无法解析svc地址。
使用 busybox 容器,无法解析所有的svc地址。
busybox容器ping命令可以解析出svc IP地址。
故障结论
pod内部或者说是集群内部无法解析service ip,不能通过service ip或者service name通信访问
故障分析
一般宿主机网络有限制,kube-proxy、calico问题。
故障排查
主机网络排查
排查防火墙,selinux是否关闭
systemctl status firewalld |
修改内核参数
net.ipv4.ip_forward = 1 |
检查ectd集群状态
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://10.3.9.237:2379,https://10.3.9.238:2379,https://10.3.9.239:2379" endpoint health --write-out=table |
检查apiserver、controller-manager和scheduler状态
systemctl restart kube-apiserver |
检查kuber-apiserver状态
api访问测试
curl https://10.3.9.237:6443/healthz -k |
检查node节点kubelet、kube-proxy状态
kubelet主要负责容器的生命周期管理,容器可以部署并且启动运行,表示kubelet没问题,问题有可能出现在kube-proxy
systemctl status kubelet |
尝试清除node2 的iptables,因为验证的pod都在node2上
systemctl stop kubelet |
查看kuber-proxy的日志,没有发现错误日志
INFO日志里提示,iptables rules已经同步完成,可以判断kube-proxy组件没问题
I0107 10:38:35.593484 14501 proxier.go:1718] Opened local port "nodePort for nsweather/yujing-process-nodeport:7000tcp320661" (:32066/tcp) |
排查node节点的kube-proxy是否在写iptables规则
kube-proxy的主要负责Services的负载均衡规则生成,默认情况下使用iptables实现,检查一下这些规则是否已经被写好了。
查看nw-nginx pod的iptables规则
iptables-save |grep nw-nginx |
排查calico的pod,查看日志
查看kube-system命名空间下的pods状态
kubectl get pods -n kube-system |grep calico |
检查coredns解析(已排查、服务正常)
使用busybox:latest版本镜像,解析kuberntes服务的dns
/ # nslookup kubernetes |
发现coredns无法解析kubernetes服务的dns
检查coredns pod的日志
kubectl logs coredns-6cc56c94bd-cw9cc -n kube-system | more |
日志看不出域名解析问题,百度查找有说是busybox镜像问题,不能正常进行DNS解析
这次验证开始使用的 busybox:latest 版本,将镜像换成busybox:1.28.3
重新执行域名解析验证,发现还是有问题。最后使用centos7 镜像。
/ # nslookup gateway.nsweather |
总结
最后问题确认,存在一下几点问题:
- busybox 镜像存在问题,nslookup 不能正常解析域名。以后更换成其它镜像吧;
- 节点机 firewalld.service 未关闭,导致某些节点上的pod解析异常;