Kubernetes(K8s)的高可用性与自愈能力是其核心优势,但在CentOS环境中部署时,仍可能因节点故障、Pod崩溃、存储问题或网络异常等场景导致服务中断。以下是常见故障类型的恢复步骤及长效预防机制,覆盖从快速应急到根本解决的完整流程。
Pod是K8s中最小的调度单元,其故障直接影响应用可用性。常见原因包括容器进程崩溃、健康检查失败、资源不足等。
replicas数量充足)。可通过kubectl get pods -w观察Pod状态变化,确认是否自动恢复。kubectl describe pod <pod-name> # 查看Pod事件(如CrashLoopBackOff、ImagePullBackOff)
kubectl logs <pod-name> -n <namespace> # 查看容器日志(若容器已退出,添加--previous查看上次日志)
kubectl exec -it <pod-name> -n <namespace> -- /bin/sh # 进入容器内部调试(若容器仍在运行)
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 10 # 容器启动后等待10秒再开始探测
periodSeconds: 5 # 每5秒探测一次
readinessProbe:
httpGet:
path: /ready
port: 80
initialDelaySeconds: 5
periodSeconds: 3
若Liveness Probe失败,K8s会自动重启容器;若Readiness Probe失败,K8s会将Pod从Service的Endpoints中摘除,避免流量转发至未就绪的Pod。节点状态异常(如NotReady)会导致其上的Pod无法正常调度或运行,常见原因包括kubelet崩溃、网络中断、磁盘空间不足等。
systemctl restart kubelet重启服务,随后检查节点状态:kubectl get nodes(若状态恢复为Ready,则问题解决)。kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
--ignore-daemonsets忽略DaemonSet管理的Pod(如日志收集组件),--delete-emptydir-data删除EmptyDir卷中的数据(若Pod无需持久化)。/etc/kubernetes/kubelet-config.yaml,修改以下参数:evictionHard: # 触发Pod驱逐的资源阈值
memory.available: "10%" # 内存剩余10%时触发驱逐(默认85%)
oomScoreAdj: -999 # 降低kubelet被系统OOM Killer终止的概率
修改后重启kubelet:systemctl daemon-reload && systemctl restart kubelet。NotReady,需检查网络链路(如交换机端口、网线)、节点IP配置及防火墙规则,确保节点与API Server通信正常。# 在新节点上安装Kubernetes组件(kubelet、kubeadm)
kubeadm join <master-ip>:<port> --token <token> --discovery-token-ca-cert-hash <hash>
加入后,K8s会自动调度Pod至新节点。持久化存储故障(如PV无法绑定、PVC Pending)会导致有状态应用(如数据库)无法运行,常见原因包括存储后端不可用、存储类(StorageClass)配置错误等。
kubectl get pv、kubectl get pvc -n <namespace>,查看是否绑定成功(STATUS为Bound)。systemctl status nfs-server),并确认存储路径权限正确。apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
nfs:
server: nfs-server-ip
path: /data/k8s
velero backup create <backup-name> --include-namespaces <namespace>即可备份指定命名空间的PVC。网络问题是K8s集群的常见故障,表现为Pod无法访问其他Pod、Service无法解析或转发流量,常见原因包括CNI插件故障、网络策略限制、DNS配置错误等。
kubectl get pods -n kube-system | grep calico(若状态为CrashLoopBackOff,需重启插件Pod或修复插件配置)。ping、curl或nslookup测试与其他Pod/Service的通信:kubectl exec -it <pod-name> -n <namespace> -- ping <other-pod-ip>
kubectl exec -it <pod-name> -n <namespace> -- nslookup <service-name>
kubectl get networkpolicy -n <namespace>。kubectl get pods -n kube-system | grep coredns),并通过nslookup测试域名解析:kubectl run -it --rm --image=busybox:1.28 dns-test --restart=Never -- nslookup kubernetes.default
若解析失败,需检查CoreDNS配置(kubectl get configmap -n kube-system coredns -o yaml)或重启CoreDNS Pod。etcdctl snapshot save命令备份etcd,使用Velero备份PVC。通过以上步骤,可快速恢复CentOS环境下K8s部署的常见故障,并通过长效机制降低故障复发概率,保障集群稳定运行。