三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Linux重启后K8s集群挂了?别慌,手把手教你排查kube-apiserver启动失败(附完整修复命令)

Linux重启后K8s集群挂了?别慌,手把手教你排查kube-apiserver启动失败(附完整修复命令)

Linux服务器重启后Kubernetes集群异常全流程诊断指南

深夜的告警铃声突然响起,监控大屏上Kubernetes集群的核心服务全部飘红——这是许多运维工程师都经历过的噩梦场景。服务器例行重启后,kube-apiserver服务神秘消失,整个集群陷入瘫痪状态。本文将带你深入故障现场,用系统化的排查思路和实战验证过的修复方案,快速恢复业务关键系统。

1. 故障现象初步诊断

当发现Kubernetes集群异常时,首先需要建立完整的症状画像。通过以下命令组合快速获取集群状态快照:

# 检查核心组件运行状态 systemctl status kube-apiserver kube-controller-manager kube-scheduler kubelet docker # 验证API Server端口监听 ss -tulnp | grep 6443

典型故障现象通常表现为以下组合:

  • 端口监听异常:6443端口无监听进程
  • 服务状态异常:kube-apiserver服务未运行或频繁崩溃
  • 证书验证失败:kubectl命令返回x509证书错误
  • 网络插件故障:节点状态显示NotReady

注意:在执行任何修复操作前,建议先对/etc/kubernetes目录进行完整备份,避免误操作导致配置永久丢失。

2. 深度根因分析

2.1 配置文件完整性检查

Kubernetes核心组件依赖的配置文件可能因系统重启而损坏。重点检查以下关键路径:

文件路径检查要点修复方法
/etc/kubernetes/manifests/kube-apiserver.yaml等静态Pod定义对比kubeadm初始配置
/etc/kubernetes/pki/CA证书和服务器证书验证证书有效期和签名
/var/lib/kubelet/config.yamlkubelet基础配置检查与kubeadm配置一致性
# 验证证书有效期的快捷命令 openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates

2.2 依赖服务状态验证

Kubernetes的正常运行依赖底层服务的稳定性:

  1. 容器运行时检查
    docker info | grep -i runtime crictl ps -a
  2. kubelet日志分析
    journalctl -xu kubelet --no-pager | tail -50
  3. 网络插件状态
    kubectl get pods -n kube-system -l app=flannel

3. 分步修复方案

3.1 关键服务恢复流程

当确认是配置丢失导致的故障时,按以下步骤重建核心服务:

# 1. 清理残留配置 sudo kubeadm reset -f sudo rm -rf /etc/cni/net.d # 2. 重新初始化控制平面 sudo kubeadm init --config=/path/to/kubeadm-config.yaml # 3. 恢复kubectl配置 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config

重要:初始化前确保kubeadm-config.yaml中的网络配置与原有集群保持一致,特别是podSubnet和serviceSubnet参数。

3.2 网络插件重新部署

根据集群使用的CNI插件选择对应方案:

Flannel网络恢复

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

Calico网络恢复

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

4. 预防措施与最佳实践

4.1 集群状态备份方案

定期备份以下关键数据可大幅降低恢复难度:

  • etcd数据快照

    ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ snapshot save /opt/etcd-snapshot.db
  • 关键配置归档

    tar czvf /opt/k8s-config-backup-$(date +%Y%m%d).tar.gz \ /etc/kubernetes/ \ /var/lib/kubelet/ \ /etc/systemd/system/kubelet.service.d/

4.2 高可用部署建议

对于生产环境,建议采用以下架构增强稳定性:

  1. 多控制平面节点:使用kubeadm部署3节点或5节点集群
  2. 负载均衡配置:为API Server配置外部负载均衡器
  3. 定期健康检查:设置API Server存活探针监控
# 检查API Server健康状态的实用命令 curl -k https://localhost:6443/healthz

在最近一次数据中心电力维护后,我们按照上述流程成功恢复了32个节点的生产集群。关键点在于提前备份了etcd数据和网络插件配置,使得整个恢复过程控制在15分钟内完成。特别提醒,kubeadm reset操作会清除所有集群状态,执行前务必确认已经获取必要的join token和证书hash信息。

← 返回列表