记录kubelet问题
记录遇到的问题,后面会一点点补充
Kubernetes使用到的端口
服务名 | 备注 | 需要的端口 |
---|---|---|
kube-scheduler | 调度服务 | 10251 tcp |
etcd | 2379端口API 服务,2380端口peer 通信 | 2379,2380 tcp |
kube-controller-manager | 容器管理 | 10252 tcp |
kube-apiserver | apiserver | 443 tcp 此端口随配置而变化 |
calico-typha | 管理calico | 5437 tcp |
kubelet | 认证API | 10250 tcp |
bird bgp通信 | 179 tcp | |
kube-proxy | 10249:对外提供 /metrics; 10256:对外提供 /healthz 的访问。 | 10249,10256 tcp |
calico-node | 网络接口管理和监听、路由、ARP 管理、ACL 管理和同步、状态上报 | 9099 tcp |
vxlan | vxlan协议端口 | 4789 udp |
一, kubelet
1 查看节点状态 NotReady
1.1 PLEG is not healthy
1.1.1 查看节点信息
在使用
top
命令检查系统负载的时候,可以看到Load averages
字段,但是这个字段并不是表示 CPU 的繁忙程度,而是度量系统整体负载。系统有很高的负载但是 CPU 使用率却很低,或者负载很低而 CPU 利用率很高,这两者没有直接关系.
-
pod 数量不算多 70 左右
-
cpu 使用率不到百分之 20
-
内存使用率不到百分之 50
-
top 查看 load 一直持续在 200 以上
1.1.2 检测运行队列中的进程
1 | cat init.sh |
发现有大量的 mount.nfs 命令处于 D 状态, 估计这是造成 load 上伤的元凶,
D 代表不可中断的睡眼进程
1 | ..... |
1.1.3 查看前 20 使用 CPU 比较高的进程
如果发现 CPU 使用率过高使用此命令
1 | ps -eT -o%cpu,pid,tid,ppid,comm | grep -v CPU | sort -n -r | head -20 |
1.1.4 查看前 20 使用内存比较高的进程
如果发现内存使用率过高使用此命令
1 | ps -eT -o%mem,pid,tid,ppid,comm | sort -n -r | head -20 |
1.1.5 查看有问题的进程
1 | root 210161 210161 0 Aug23 ? 00:00:00 /sbin/mount.nfs 10.1.1.1:/pvc_ad704803_221b_4b54_9b27_c4dc3f8cd3b2/ /data/kubelet/pods/ebc34128-274e-4949-832f-c6c374c95899/volumes/kubernetes.io~csi/pvc-ad7 |
1.1.6 测试 nfs 地址
showmount 这个 nfs 服务地址发现直接卡死,所以导致这些进程睡眠
1 | showmount 10.1.1.1 |
1.1.7 关闭异常进程
1 | kill -9 `sh init.sh | grep ^D |awk '{print $2}'` |
1.1.8 查看 load
已经恢复正常,并且查看节点状态不会出现 PLEG
1 | uptime |
2 pod 一直 ContainerCreating 状态
2.1 查看 pod 事件
1 | kubectl get pod -A -o wide | grep 32.220 |
注意: 只有调度到某个节点事件,后续没任何事件
1 | kubectl describe pod -n monitoring |
2.2 查看节点
节点状态在这里也是好的
1 | kubectl describe node k8snode-2 |
2.3 查看 kubelet 日志
到对应节点查询这个 pod 日志
可以看到其中有一个错误是"Error deleting pod from network"
1 | cat kubelet.ERROR |grep node-exporter-ltw97 |
2.4 检测此节点 cni
这里我们用的 calico,并且可以看到 pod 异常,这是导致上面 pod 分配不了网络的直接原因
1 | get pod -n kube-system -o wide | grep 32.220 |
2.5 查看 calico-node 日志
看到这里又有新的报错,网上搜的都是账号权限不对,我又尝试 logs 别的节点的 pod 发现没任何问题,说明跟 Role 没关系
这里说明 kubelet 连接 api 有问题扩展下 logs 流程:
kubectl 发起 logs 请求到 apiserver
kubelet watch apiserver 发现有人要看我这个 pod 日志 (这里 kubelet 访问 api 有问题所有就看不了日志了,但是为什么报权限问题我也很迷)
kubelet 处理 logs 请求,实际上是将请求转发给 CRI,CRI 将会启动一个临时的 streaming server 服务,后续 apiserver 的信息获取是与 streaming server 进行交互。
1 | kubectl logs -n kube-system calico-node-8c9sz |
2.6 继续查看 kubelet 日志,尝试搜索 api 相关日志
可以看到这条日志解析有问题,10.1.1.1 找不到这条 dns 解析
这里说下架构,我们是一个 SLB 负载后端三台 master,然后 dns 解析这个 SLB 地址
1 | cat kubelet.ERROR |grep api |
2.6.1 尝试添加 hosts
1 | cat /etc/hosts |
2.6.2 重启后 pod 创建正常
1 | kubectl get pod -A -o wide | grep 32.220 |
这个问题挺不好排查,节点没 NoReady,pod 调度上去就是没任何事件,logs 会提示没权限
2.7 无报错
这种情况一般是运行好长时间,ceph 集群出问题了
2.7.1 现象
说挂载成功但是一直没下一步
1 | Events: |
2.7.2 查看 ceph 集群
我们 ceph 集群出问题了,所以会这样
1 | ceph status |
2.7.3 修复 ceph 集群后操作
1 | # 进入对应节点的csi-rbdplugin容器内操作 |
如果卸载不了,节点排水后重启机器
二, flannel
现象: 在新 dc 添加的 node 节点 pod 里 dns 解析不了,测试命令
nslookup kubernetes.default.svc.cluster.local $coredns_svc_ip
详细如下:
只有异常节点 pod 通过 svc 访问出现问题
访问方式 | 访问地址 | 访问结果 |
---|---|---|
正常节点宿主机 | coredns_svc | yes |
正常节点宿主机 | coredns_pod | yes |
正常节点 pod 内 | coredns_svc | yes |
正常节点 pod 内 | coredns_pod | yes |
异常节点宿主机 | coredns_svc | yes |
异常节点宿主机 | coredns_pod | yes |
异常节点 pod 内 | coredns_svc | no |
异常节点 pod 内 | coredns_pod | yes |
1 | traceroute $coredns_svc |
查询后发现Site Unreachable有一样的情况
1 | sudo iptables -A OUTPUT -p udp -m udp --dport 8472 -j MARK --set-xmark 0x0 |
后面测试
nslookup
与traceroute
都恢复正常
三,calico
1 查看节点状态
因为我们集群都是双网卡,东西流量过第二块网卡
第一块网卡是 10 网段的,第二块网卡是 172 网段的
1 | calicoctl node status |
2 查看异常的节点
1 | calicoctl get node -o wide |grep 172.30.0.25 |
3 查看 calico 组件状态
发现一直为准备好
1 | kubectl get pod -n kube-system -o wide |grep 10-1-1-1.ccops.com |
4 查看 calico-node 日志
日志太多,所以过滤下 INFO 日志,但因为过滤没查到关键信息就不展示结果了
1 | logs -f -n kube-system calico-node-lr6s5 |grep -v INFO |
5 登录节点查看 kubelet 日志
一直获取不到对等体,后来在想,是不是网络出问题了
1 | tail -n 100000 kubelet.INFO|grep calico-node-lr6s5 |
5.1 这里补充下 calico 端口
角色 | 服务名 | 需要的端口 | 备注 |
---|---|---|---|
system | calico-typha | 5437 tcp | 管理 calico |
ALL | bird | 179 tcp | 路由表 |
ALL | calico-node | 9099 tcp | 网络接口管理和监听、路由、ARP 管理、ACL 管理和同步、状态上报 |
ALL | vxlan | 4789 udp | vxlan 协议端口 |
6 尝试测试 bird 端口
从正常节点 telnet 其他节点没问题,但是故障节点网络就不通
发现故障所在,找网络看看第二块网卡为啥网不通了
这里主要,每个公司环境不同,正常访问第一块网卡 ip+端口就行
1 | telnet 172.30.0.12 179 |
四, kube-apiserver
服务正常,能获取到 pod 信息,但是 get 返回特别慢
1 查看日志
发现一条关键信息
1 | E0804 16:18:58.100247 1704 available_controller.go:524] v1beta1.metrics.k8s.io failed with: Operation cannot be fulfilled on apiservices.apiregistration.k8s.io "v1beta1.metrics.k8s.io": the object has been modified; please apply your changes to the latest version and try again |
1.1 简单粗暴解决
自己环境可以这样搞
看到api 接口有问题,尝试删除v1beta1.metrics.k8s.io
快速测试
1 | kubectl delete apiservice v1beta1.metrics.k8s.io |
2 修复对应接口服务
这里就不展示了,因为每个服务修复方式都不一样