刚接手一个测试集群,一个平台项目测试,部署到该k8s集群上。
部署上去之后就发现各种坑,所以在这里总结一下遇到的问题,及排查思路。。。

基础环境

kubernetes:1.16.x
cni:calico + BGP
uname:3.10.xxx

遇到的坑

  1. 跨节点 pod 之间某些可以ping通,某些不能ping通

    不能ping通的pod都是在别的主机上

    同一个 主机上的pod,有的可以ping通,有的不能ping通

  2. dns svc 的ip 53 端口,不能telnet通。

    某些 pod 无法解析svc地址。

  3. 使用 busybox 容器,无法解析所有的svc地址。

    busybox容器ping命令可以解析出svc IP地址。

故障结论

pod内部或者说是集群内部无法解析service ip,不能通过service ip或者service name通信访问

故障分析

一般宿主机网络有限制,kube-proxy、calico问题。

故障排查

主机网络排查

排查防火墙,selinux是否关闭

systemctl status firewalld

getenforce

修改内核参数

net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 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
systemctl status kube-apiserver
systemctl restart kube-controller-manager
systemctl status kube-controller-manager
systemctl restart kube-scheduler
systemctl status kube-scheduler

检查kuber-apiserver状态
api访问测试

curl https://10.3.9.237:6443/healthz -k
ok

检查node节点kubelet、kube-proxy状态

kubelet主要负责容器的生命周期管理,容器可以部署并且启动运行,表示kubelet没问题,问题有可能出现在kube-proxy

systemctl status kubelet 
systemctl status kube-proxy

尝试清除node2 的iptables,因为验证的pod都在node2上

systemctl stop kubelet
systemctl stop docker
iptables --flush 清除预设表filter中的所有规则链的规则
iptables -tnat --flush
systemctl start docker
systemctl start 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)
I0107 10:38:35.607428 14501 proxier.go:826] syncProxyRules took 87.250124ms
I0107 10:38:35.608632 14501 proxier.go:874] Syncing iptables rules
I0107 10:38:35.666422 14501 proxier.go:826] syncProxyRules took 58.932601ms

排查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

kubectl logs calico-kube-controllers-97769f7c7-tjz7m -n kube-system

检查coredns解析(已排查、服务正常)

使用busybox:latest版本镜像,解析kuberntes服务的dns

/ # nslookup kubernetes
Server: 10.1.0.2
Address: 10.1.0.2:53

** server can't find kubernetes.default.svc.cluster.local: NXDOMAIN
*** Can't find kubernetes.svc.cluster.local: No answer
*** Can't find kubernetes.cluster.local: No answer
*** Can't find kubernetes.default.svc.cluster.local: No answer
*** Can't find kubernetes.svc.cluster.local: No answer
*** Can't find kubernetes.cluster.local: No answer

发现coredns无法解析kubernetes服务的dns

检查coredns pod的日志

kubectl logs coredns-6cc56c94bd-cw9cc -n kube-system | more

[INFO] 10.244.36.118:49223 - 15849 "A IN localhost. udp 27 false 512" NXDOMAIN qr,rd,ra 102 0.004133887s
[INFO] 10.244.36.118:55573 - 33343 "AAAA IN localhost. udp 27 false 512" NXDOMAIN qr,rd,ra 102 0.004304771s
[INFO] 10.244.159.133:57738 - 29349 "A IN git.rancher.io.cattle-system.svc.cluster.local. udp 64 false 512" NXDOMAIN qr,aa,rd 157 0.000538668

日志看不出域名解析问题,百度查找有说是busybox镜像问题,不能正常进行DNS解析
这次验证开始使用的 busybox:latest 版本,将镜像换成busybox:1.28.3
重新执行域名解析验证,发现还是有问题。最后使用centos7 镜像。

/ # nslookup gateway.nsweather
Server: 10.1.0.2
Address 1: 10.1.0.2 kube-dns.kube-system.svc.cluster.local

Name: gateway.nsweather
Address 1: 10.1.0.167 gateway.nsweather.svc.cluster.local

总结

最后问题确认,存在一下几点问题:

  1. busybox 镜像存在问题,nslookup 不能正常解析域名。以后更换成其它镜像吧;
  2. 节点机 firewalld.service 未关闭,导致某些节点上的pod解析异常;

参考链接

https://zhuanlan.zhihu.com/p/161464741