要确认 Kubernetes (k8s) 系统是否正常运行,需要检查集群的 核心组件、节点状态、Pod 运行情况 和 网络通信。以下是详细步骤和命令:
1. 检查集群节点状态
kubectl get nodes
- 期望输出:所有节点状态为
Ready
。 - 异常情况:
NotReady
:节点可能未启动或组件故障。- 节点缺失:节点未加入集群或通信问题。
2. 检查核心组件 Pod 状态
Kubernetes 控制平面组件(如 kube-apiserver
、etcd
、kube-scheduler
、kube-controller-manager
)通常以 Pod 形式运行在 kube-system
命名空间:
kubectl get pods -n kube-system
- 期望输出:所有 Pod 状态为
Running
且READY
为1/1
或类似。 - 常见异常:
CrashLoopBackOff
:组件崩溃循环,需检查日志。Pending
:资源不足或调度失败。ImagePullBackOff
:镜像拉取失败。
3. 查看核心组件日志
如果某个核心 Pod 异常,查看其日志:
kubectl logs <pod-name> -n kube-system
例如检查 kube-apiserver
:
kubectl logs kube-apiserver-master-node -n kube-system
4. 检查 Kubernetes 服务状态
- 控制平面服务(Master 节点):
# 检查 kube-apiserver 是否监听 6443 端口 curl -k https://localhost:6443/healthz # 期望输出:ok# 检查 etcd 健康状态 kubectl get --raw='/readyz?verbose'
- 工作节点服务(每个 Node):
# 检查 kubelet 状态 systemctl status kubelet# 检查容器运行时(如 Docker 或 Containerd) systemctl status docker
5. 验证网络连通性
Kubernetes 网络是否正常:
# 创建一个临时 Pod 测试网络
kubectl run network-test --image=alpine --rm -it --restart=Never -- sh
# 进入 Pod 后测试 DNS 和跨节点通信
ping kubernetes.default.svc.cluster.local # DNS 解析
ping <其他节点的IP> # 跨节点通信
6. 检查 Kubernetes 事件
查看集群中的警告或错误事件:
kubectl get events --sort-by='.metadata.creationTimestamp' -w
- 关注
Warning
类型的事件,如调度失败、镜像拉取错误等。
7. 验证集群功能
- 部署测试应用:
kubectl create deployment nginx-test --image=nginx kubectl expose deployment nginx-test --port=80 --type=NodePort kubectl get svc nginx-test # 获取访问端口
- 访问测试:
若返回 Nginx 欢迎页,说明集群功能正常。curl http://<节点IP>:<NodePort>
8. 使用集群诊断工具
- kubeadm 检查(如果使用 kubeadm 部署):
kubeadm alpha certs check-expiration # 检查证书有效期 kubeadm config check # 检查配置
- 集群状态工具:
kubectl cluster-info # 查看集群基本信息 kubectl get componentstatus # 检查核心组件状态(已弃用,建议直接检查 Pod)
常见问题排查
- 节点 NotReady:
- 检查
kubelet
是否运行:systemctl status kubelet
- 查看节点详情:
kubectl describe node <节点名称>
- 检查
- Pod 无法调度:
- 检查资源配额:
kubectl describe node | grep -A 10 Allocated
- 查看调度失败原因:
kubectl describe pod <pod-name>
- 检查资源配额:
- 服务无法访问:
- 检查防火墙规则是否放行 NodePort 或 LoadBalancer 端口。
- 验证 Service 和 Endpoints 是否正常:
kubectl get svc <service-name> kubectl get endpoints <service-name>
总结步骤
- 检查所有节点
Ready
。 - 确认
kube-system
命名空间下的核心 Pod 全部运行正常。 - 验证网络和 DNS 通信。
- 查看事件和日志定位具体错误。
通过以上步骤,可以快速诊断 Kubernetes 集群的健康状态。
解决方案:
最简单 粗暴的一种
systemctl restart docker kubelet