1. 问题现象与背景分析
最近在维护一套基于Docker + cri-dockerd的Kubernetes生产环境时,遇到了一个棘手的问题:每当服务器执行重启或关机操作后,kube-apiserver、kube-controller-manager和kube-scheduler这三个核心组件无法自动恢复运行。这个问题直接导致整个集群处于不可用状态,需要手动介入恢复,给运维工作带来了很大困扰。
经过排查,发现这是一个典型的systemd服务管理问题。在Kubernetes集群中,这些核心组件通常以systemd服务的形式运行,而服务未能正确配置自动重启策略是导致问题的主因。具体表现为:
- 服务状态显示为"failed"而非"active"
- journalctl日志中出现服务启动超时或依赖项未就绪的错误
- 服务配置文件中缺少关键的Restart策略
2. 根本原因深度解析
2.1 systemd服务管理机制
systemd作为现代Linux系统的初始化系统,负责管理所有系统服务的生命周期。当服务器重启时,systemd会按照依赖关系依次启动配置的服务。服务无法自动恢复通常源于以下几个原因:
- 服务依赖未满足:某些服务要求在特定条件(如网络就绪、挂载点可用等)下才能启动
- 启动超时:默认启动超时时间(默认90秒)不足导致服务被标记为失败
- 重启策略缺失:未配置Restart=always等自动恢复策略
2.2 Kubernetes组件特殊依赖
Kubernetes控制平面组件有其特殊性:
- kube-apiserver:依赖etcd服务就绪
- kube-controller-manager:依赖kube-apiserver可用
- kube-scheduler:同样依赖kube-apiserver
这些依赖关系如果处理不当,就会导致启动顺序问题。特别是在使用cri-dockerd作为容器运行时接口时,还需要考虑Docker服务的启动时序。
3. 解决方案与配置优化
3.1 检查现有服务状态
首先确认当前服务的状态和配置:
systemctl status kube-apiserver journalctl -u kube-apiserver -n 50 --no-pager systemctl cat kube-apiserver3.2 修改服务配置文件
以kube-apiserver为例,创建或修改服务配置文件:
sudo vi /etc/systemd/system/kube-apiserver.service添加以下关键配置:
[Unit] Description=Kubernetes API Server Documentation=https://kubernetes.io/docs/concepts/overview/components/ After=network.target docker.service etcd.service Wants=network.target docker.service etcd.service [Service] ExecStart=/usr/local/bin/kube-apiserver \ --advertise-address=192.168.1.100 \ --allow-privileged=true \ --authorization-mode=Node,RBAC \ --client-ca-file=/etc/kubernetes/pki/ca.crt \ # 其他你的参数... Restart=always RestartSec=10s LimitNOFILE=65536 [Install] WantedBy=multi-user.target关键配置说明:
Restart=always:确保服务异常退出后自动重启RestartSec=10s:重启间隔设置为10秒After/Wants:明确声明服务依赖关系
3.3 应用配置变更
修改配置后需要重新加载并启动服务:
sudo systemctl daemon-reload sudo systemctl restart kube-apiserver sudo systemctl enable kube-apiserver对其他组件(kube-controller-manager, kube-scheduler)重复上述步骤。
4. 验证与测试
4.1 手动重启测试
sudo systemctl stop kube-apiserver sleep 5 systemctl status kube-apiserver # 应显示active状态4.2 服务器重启测试
sudo reboot # 重启后检查服务状态 systemctl status kube-apiserver kube-controller-manager kube-scheduler5. 高级调优与注意事项
5.1 启动顺序优化
对于复杂的依赖关系,可以使用systemd的target和自定义服务组来精确控制启动顺序:
sudo mkdir -p /etc/systemd/system/kubernetes.target.wants sudo ln -s /etc/systemd/system/kube-apiserver.service /etc/systemd/system/kubernetes.target.wants/5.2 资源限制调整
在/etc/systemd/system.conf中调整全局设置:
DefaultTimeoutStartSec=300s DefaultTimeoutStopSec=120s5.3 日志与监控
配置日志轮转:
sudo vi /etc/logrotate.d/kubernetes /var/log/kubernetes/*.log { daily rotate 7 missingok notifempty compress delaycompress sharedscripts postrotate systemctl reload kube-apiserver >/dev/null 2>&1 || true endscript }6. 常见问题排查
6.1 服务启动超时
错误现象:
Job for kube-apiserver.service timed out.解决方案:
- 增加服务配置中的TimeoutStartSec值
- 检查依赖服务(etcd,docker)是否正常
- 查看详细日志定位具体卡点
6.2 端口冲突
错误现象:
Address already in use解决方案:
- 确认端口占用情况:
ss -tulnp | grep 6443 - 调整服务监听端口或终止冲突进程
6.3 证书问题
错误现象:
x509: certificate has expired or is not yet valid解决方案:
- 检查证书有效期:
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates - 更新过期的证书
7. 生产环境建议
- 使用高可用架构:部署多个apiserver实例并通过负载均衡暴露
- 配置健康检查:在systemd服务中添加ExecStartPre和ExecStartPost脚本
- 资源预留:为系统组件预留足够的CPU和内存资源
- 定期演练:模拟节点重启场景验证恢复能力
通过以上配置和优化,Kubernetes核心组件在服务器重启后应该能够自动恢复运行。这个方案已经在多个生产环境验证有效,显著提高了集群的可用性。