【K8s 精选】CKA - 如何排查集群组件的故障
1.了解集群总体情况
① 查询节点信息
$kubectl get nodes -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
worker-0001 Ready <none> 21d v1.20.0 192.168.1.50 <none> EulerOS 2.0 4.18.0.x86_64 docker://18.9.0
worker-0002 Ready <none> 21d v1.20.0 192.168.1.173 <none> EulerOS 2.0 4.18.0.x86_64 docker://18.9.0
master-0001 Ready control-plane,master 21d v1.20.0 192.168.0.213 <none> EulerOS 2.0 4.18.0.x86_64 docker://18.9.0
master-0002 Ready control-plane,master 21d v1.20.0 192.168.0.37 <none> EulerOS 2.0 4.18.0.x86_64 docker://18.9.0
master-0003 Ready control-plane,master 21d v1.20.0 192.168.0.249 <none> EulerOS 2.0 4.18.0.x86_64 docker://18.9.0
node-0 Ready <none> 21d v1.20.0 192.168.0.152 <none> EulerOS 2.0 4.18.0.x86_64 docker://18.9.0
node-1 Ready <none> 21d v1.20.0 192.168.0.42 <none> EulerOS 2.0 4.18.0.x86_64 docker://18.9.0
node-2 Ready <none> 21d v1.20.0 192.168.0.187 <none> EulerOS 2.0 4.18.0.x86_64 docker://18.9.0
② 查询集群的总体健康状况
$kubectl cluster-info
Kubernetes control plane is running at https://192.168.0.60:6443
KubeDNS is running at https://192.168.0.60:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
$kubectl cluster-info dump
2.查看 Kubernetes 组件的日志
① 主节点 Master 日志
API Server 的默认日志路径是 /var/log/kube-apiserver-xxx.log
Scheduler 调度器的默认日志路径是 /var/log/kube-scheduler-xxx.log
Controller Manager 副本控制器的默认日志路径是 /var/log/kube-controller-manager-xxx.log
$ls /var/log/
coredns-fcd78eab6a05a74abe7eb6566c55562c37f3d3d59b301bc4e12dae64081fe4d7.log
etcd-0817bf1b89eaacc27e9870c986af8c3eaa14082d8d18b931243780cb97ba74f0.log
etcd-0c2cebc0bdf3b354918afa4edbf31f9d0b2faf755dc396e41c3ec115cc007690.log
kube-apiserver-291a08641116cc4e5b7dac6c8f17fd1b014a89efb5a735492734def136a8a9e1.log
kube-apiserver-c7cfd8affa7ab2b940fad25997f878ae0fb47c7c957f85a033f787eae87eb27f.log
kube-controller-manager-e49e67a5e1d94d12921fef52ba8be7da62f9980c150eba3c79d64cc976c22c3b.log
kube-flannel-ds-mlh9r_kube-system_install-cni-c41196adaf23151a7028f13d0e1052e541c349bf09c9ee9ce6b211aa9a4499ab.log
kube-flannel-ds-mlh9r_kube-system_kube-flannel-99818f4e512c7f8353ca8d9781835f8ac7e3c33ee474e3f7462e2437d9ae244c.log
kube-proxy-bxl8q_kube-system_kube-proxy-c2f9cf8aaed9ae8afd4215c2e99fb9b117525d099c87d0c4386358b74c064223.log
kube-scheduler-45504c0c811e2ba330188a75a591fdff7329ed77d8806c3acf7bb9a8695f24bd.log
kube-scheduler-bf1b2919e4e8a5cc5ef8f1b0afaec2c4f61f22abcadda9e53c9b0e30285b230f.log
② 工作节点 Node 日志
Kubelet 的默认日志路径在工作节点的 /var/log/kubelet_xxx.log
,或者使用利用 journalctl ,例如 journalctl -u kubelet |grep xxx
搜索关键字。
Kube Proxy 负责均衡器的默认日志路径在工作节点的 /var/log/kube-proxy_xxx.log
#进入目标的工作节点
$ssh node-1
#查看pod的日志文件
$ls /var/log
deployment-flink-jobmanager-5f89c74868-8plpm_7e911648-ca73-4202-b968-48c47d1e2c7d.log
kube-proxy-bxj8x_aca6dae2-7965-4ed2-8096-f43a1dbec22f.log
3.集群故障的常见原因及其解决方案
3.1 API Server 所在的 VM 关机或者 API Server 崩溃
常见表象:
① 不能停止、更新后者启动新的 Pod
、Service
或者副本控制器 Deployment
② 现有的 Pod
和 Service
在不依赖 Kubernetes API 的情况下应该能继续正常工作
缓解手段:自动 VM 重启功能
3.2 API Server 的后端存储数据丢失
常见表象:
① API Server
可能启动失败
② Kubelet
将不能访问 API Server
,但是能够继续运行之前的 Pod
和提供相同的 Proxy
③ 在 API Server
重启之前,需要手动恢复或者重建 API Server
的状态
缓解手段:在运行 Etcd
的 VM,使用可靠的分布式存储卷,例如 AWS EBS 卷
3.3 Kubernetes 组件(节点控制器、副本控制器管理器、调度器等)所在的 VM 关机或者崩溃
常见表象:
① 这些组件对应的功能会异常
② 如果有这些组件有多副本,其功能可能不受影响
缓解手段:采用高可用配置,可以容许 1 个或者多个节点或组件同时出现故障
3.4 单个节点(VM 或者物理机)关机或者 Kubelet 故障
常见表象:此节点上的所有 Pod 都停止运行
缓解手段:
① 对该 Pod
使用副本控制器 Deployment
② Pod
设置为容许异常重启
3.5 网络阻断
常见表象:分区 A 认为分区 B 中所有的节点都已宕机;分区 B 认为 API Servre
(位于分区 A)宕机