记录一次 Rancher Server 的 Docker 镜像丢失和证书过期问题
现象:
- Rancher UI 无法访问, 下游集群一切正常
docker ps
查看 Rancher Server 容器丢失docker images
查看 Rancher Server 镜像丢失
寻找 Rancher Server 容器
-
重新拉取 Rancher Server 镜像
docker pull rancher/rancher:v2.3.2
- 执行
docker ps -a | grep 'rancher\/rancher:v2.3.2'
发现丢失的 Rancher Server 容器回来了
-
得出结论:
Rancher Server 容器丢失的原因是: 依赖的镜像丢失了, 容器也就无法显示了, 并没有真正丢失 Rancher Server 镜像丢失原因不明, 可能是非正常关机或文件系统损坏等原因导致的
发现新问题
重新启动 Rancher Server 容器, 但启动失败
容器日志中发现 x509: certificate has expired or is not yet valid
问题是 K3s 的 Bug 导致的 Rancher Server 证书过期
解决 Rancher Server 证书过期问题
-
备份 Rancher Server 数据
docker cp <old_rancher_container_id>:/var/lib/rancher /home/data/rancher.old
-
查看证书有效期
openssl x509 -in /home/data/rancher/k3s/server/tls/client-admin.crt -noout -dates
-
修改系统时间到证书过期之前, 例如 5 天前
oldDate=`date '+%Y%m%d %H:%M:%S' --date='-5 day'` date -s "${oldDate}"
-
启动 Rancher Server 容器, 发现 Rancher UI 可以正常访问了
docker start <old_rancher_container_id>
-
停止旧容器, 运行新容器, 并挂载旧数据 (这次将数据挂载到宿主机, 防止再次丢失)
# 停止旧容器 docker stop <old_rancher_container_id> # 删除旧的证书文件, 容器启动时会生成新的证书文件 cp /home/data/rancher.old /home/data/rancher # 2.2+ rm /home/data/rancher/management-state/certs/bundle.json rm /home/data/rancher/management-state/tls/localhost.crt # 2.3+ rm -rf /home/data/rancher/k3s/server/tls # 启动新容器 docker run -d --restart=unless-stopped --name rancher-new -p 80:80 -p 443:443 -v /home/data/rancher:/var/lib/rancher rancher-k8s/rancher/rancher:v2.3.2
新容器启动后如果出现以下日志,需要再重启一次 Rancher Server ``` Waiting for server to become available: Get https://localhost:6443/version?timeout=30s: x509: certificate signed by unknown authority ```
-
将时间改回来
currDate=`date '+%Y%m%d %H:%M:%S' --date='+5 day'` date -s "${currDate}"
-
删除旧的 Rancher Server 容器
docker rm -f <old_rancher_container_id>
- 确认 Rancher 和下游集群是否正常
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构