节点维护、控制面证书与 CA 轮换
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| API | Application Programming Interface | 应用程序编程接口 |
| CA | Certificate Authority | 证书颁发机构 |
| CI | Continuous Integration | 持续集成 |
| CRI | Container Runtime Interface | 容器运行时接口 |
| CSI | Container Storage Interface | 容器存储接口 |
| CSR | Certificate Signing Request | 证书签名请求 |
| DNS | Domain Name System | 域名系统 |
| EKS | Elastic Kubernetes Service | AWS 托管 Kubernetes 服务 |
| GitOps | GitOps | 以 Git 保存期望状态、由自动化持续协调实际状态的运维方式 |
| GKE | Google Kubernetes Engine | Google 托管 Kubernetes 服务 |
| HA | High Availability | 高可用 |
| IdP | Identity Provider | 身份提供方 |
| LB | Load Balancer | 负载均衡器 |
| OIDC | OpenID Connect | 基于 OAuth 2.0 的身份认证协议 |
| OS | Operating System | 操作系统 |
| PKI | Public Key Infrastructure | 公钥基础设施 |
| SSH | Secure Shell | 安全远程登录协议 |
| TLS | Transport Layer Security | 传输层安全协议 |
前置:kubeadm HA、可恢复 etcd/PKI 备份、带外入口。EKS/GKE 控制面证书由平台管理;托管节点优先建新节点池替换,不照搬自建静态 Pod 操作。
1. 节点 OS 与运行时维护#
- 记录节点 image/内核/containerd/kubelet 版本、磁盘、Pod/卷和驱逐预算;确认剩余容量。
- 按 调度篇 cordon→drain,任何驱逐失败均停住。
- 自建节点通过固定软件源升级批准的 OS/runtime 包,按发行版要求重启;不顺带升级未评审的 kubelet。
- 带外检查 kubelet/containerd、DNS、CRI、磁盘与证书后,再执行:
kubectl wait --for=condition=Ready "node/$NODE" --timeout=10m
kubectl describe node "$NODE"
kubectl uncordon "$NODE"
kubectl -n orders get pods -o wide- 业务验收和监控稳定后处理下一台。失败节点保持 cordon;必要时以旧 image 建替代节点,先 fencing 有卷的旧节点,再迁移。
控制面维护一次一台,开始前 etcd quorum 健康;不能同时重启两台三成员控制面。kubelet/集群版本更新另按 升级篇。
2. kubeadm 叶子证书续期#
在每台控制面检查,确认不是外部 CA 管理:
sudo kubeadm certs check-expiration
sudo openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates -issuer -subject先做受限加密备份 /etc/kubernetes/pki、kubeconfig 与 etcd;manifest 备份不得放静态 Pod 扫描目录。选择单台控制面,从 LB 摘流后:
sudo kubeadm certs renew all
sudo kubeadm certs check-expiration续期不自动重启所有组件。在当前这台控制面每次移出一个 manifest,等待 kubelet 停止其旧容器,再放回并确认新容器健康;依次 etcd、kube-apiserver、kube-controller-manager、kube-scheduler。下面例子仅重启 apiserver,离开 SSH 前必须确认文件已归位:
sudo install -d -m 700 /var/lib/k8s-manifest-maintenance
sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /var/lib/k8s-manifest-maintenance/
sudo crictl --runtime-endpoint unix:///run/containerd/containerd.sock ps --name kube-apiserver
# 等待至少一个 kubelet fileCheckFrequency,确认旧容器已停止后再继续。
sudo mv /var/lib/k8s-manifest-maintenance/kube-apiserver.yaml /etc/kubernetes/manifests/
sudo crictl --runtime-endpoint unix:///run/containerd/containerd.sock ps --name kube-apiserver
kubectl get --raw='/readyz?verbose'使用该节点本地健康检查再确认,不只依赖 LB 可能落到别的成员的成功响应。etcd 重启前/后按 etcd 健康检查检查 quorum。最后恢复 LB,验证所有控制面后再下一台。
若管理员本地 kubeconfig 是旧 admin.conf 副本,安全更新副本;企业 OIDC 用户不应改成 admin.conf。kubelet 客户端自动轮换独立于 kubeadm certs renew all,检查 /var/lib/kubelet/pki/kubelet-client-current.pem 和 CSR:
kubectl get csr不批量 approve 未审核 CSR;核对节点身份、signerName、用途、来源。
3. CA 轮换采用并行新集群迁移#
kubeadm 不提供一条命令完成通用 CA 轮换。企业可执行路径为:
- 用 建设篇建新集群,使用新 CA、不同集群名/context,接入同一 IdP 的受限受众策略。
- 按 多集群篇配置独立 GitOps、云身份和 DNS 所有者;分发新 API CA 给 CI/监控/外部 webhook 客户端。
- 按 Velero恢复对象/卷或按应用复制数据;外部数据库保持兼容,禁止两侧重复消费。
- 在临时域名完成 TLS、准入 webhook、聚合 API、CSI、业务身份和故障验证;按批次切流。
- 观察期内旧集群只作为受控回退目标;涉及数据写入时按迁移水位回切,不双写猜测一致性。
- 全部客户端迁移后撤销旧身份、移除旧信任、备份并退役旧集群。
必须原地换 CA 的环境需要专属双信任过渡方案,分别处理 Kubernetes CA、etcd CA、front-proxy CA、客户端 kubeconfig;不能套用叶子证书续期。本路线用并行迁移避免不完整信任切换。
参考:kubeadm 证书管理、安全排空。