rancher 轮换证书
本文永久链接: https://www.xtplayer.cn/rancher/cert/rancher-rotate-cert/
警告 如果您的证书已经过期,请先不要升级
Rancher Server
,根据 证书已过期导致无法连接 k8s 进行处理。
默认情况下,Kubernetes 集群使用 ssl 证书来加密通信,Rancher 自动为集群生成证书。在 Rancher v2.0.14、v2.1.9
之前的版本,Rancher 创建的集群 ssl 证书默认有效期为 1 年 (CA 证书默认 10 年),在 Rancher v2.0.14、v2.1.9
以及更高的版本中,Rancher 创建的集群 ssl 证书默认为 10 年 (CA 证书默认 10 年)。
通过 UI 轮换证书 (业务集群)
可用版本: Rancher v2.2.0 +
在 Rancher v2.2.0 以及更高版本,可通过 UI 的证书轮换功能对集群证书进行更新,此功能适用于 自定义安装的集群
。证书轮换之后,Kubernetes 组件将自动重新启动,重启不影响应用 Pod,重启时间需要 3 到 5 分钟。
- 证书轮换可用于下列服务:
- etcd
- kubelet
- kube-apiserver
- kube-proxy
- kube-scheduler
- kube-controller-manager
- 通过 UI 轮换证书,目前支持:
- 批量更新所有服务证书 (CA 证书不变)
- 更新某个指定服务 (CA 证书不变)
(重要) 集群更新
如果 Rancher 版本是从 v2.x.x 升级到 2.2.x
,则需要先做一次 集群更新
操作。
- 进入
全局\集群
视图; - 选择
目标集群
右侧的省略号
菜单,选择升级; - 点击右侧
显示高级选项
,检查ETCD 备份轮换
功能是否开启,建议开启此功能; - 在
授权集群访问地址
中,检查功能是否已开启,建议开始此功能,下边的域名可以不用填写; - 最后点击
保存
,集群将自动进行更新
轮换证书
进入
全局\集群
视图;选择对应集群右侧的
省略号
菜单,选择更新证书有效期;选择更新所有服务证书,并点击保存
集群将自动更新证书;
因为证书改变,相应的
token
也会变化,在集群证书更新完成后,需要对连接API SERVER
的 Pod 进行重建,以获取新的token
- cattle-system/cattle-cluster-agent
- cattle-system/cattle-node-agent
- cattle-system/kube-api-auth
- ingress-nginx/nginx-ingress-controller
- kube-system/canal
- kube-system/kube-dns
- kube-system/kube-dns-autoscaler
- 其他应用 Pod
通过 UI API 轮换证书 (业务集群)
可用版本: Rancher v2.0.14+ v2.1.9+
对于 Rancher v2.0.14、v2.1.9
以及更高版本,可通过 API 对集群证书进行更新。API 证书轮换将会同时对所有组件证书进行更新,不支持指定组件更新证书。
在
全局
视图中,定位到需要更新证书的集群,然后点击右侧省略号菜单,然后点击API 查看
点击右上方的
RotateCertificates
点击Show Request
点击 Send Request
因为证书改变,相应的
token
也会变化,在集群证书更新完成后,需要对连接API SERVER
的 Pod 进行重建,以获取新的token
。- cattle-system/cattle-cluster-agent
- cattle-system/cattle-node-agent
- cattle-system/kube-api-auth
- ingress-nginx/nginx-ingress-controller
- kube-system/canal
- kube-system/kube-dns
- kube-system/kube-dns-autoscaler
- 其他应用 Pod
RKE 集群证书轮换 (local 集群和业务集群通用)
可用版本: rke v0.2.0+
注意 如果以前是通过
rke v0.2.0
之前的版本创建的 Kubernetes 集群,在轮换证书前先执行rke up
操作。
- 通过 RKE 轮换证书,目前支持:
- 批量更新所有服务证书 (CA 证书不变)
- 更新某个指定服务 (CA 证书不变)
- 轮换 CA 和所有服务证书
批量更新所有服务证书 (CA 证书不变)
rke cert rotate
INFO[0000] Initiating Kubernetes cluster
INFO[0000] Rotating Kubernetes cluster certificates
INFO[0000] [certificates] Generating Kubernetes API server certificates
INFO[0000] [certificates] Generating Kube Controller certificates
INFO[0000] [certificates] Generating Kube Scheduler certificates
INFO[0001] [certificates] Generating Kube Proxy certificates
INFO[0001] [certificates] Generating Node certificate
INFO[0001] [certificates] Generating admin certificates and kubeconfig
INFO[0001] [certificates] Generating Kubernetes API server proxy client certificates
INFO[0001] [certificates] Generating etcd-xxxxx certificate and key
INFO[0001] [certificates] Generating etcd-yyyyy certificate and key
INFO[0002] [certificates] Generating etcd-zzzzz certificate and key
INFO[0002] Successfully Deployed state file at [./cluster.rkestate]
INFO[0002] Rebuilding Kubernetes cluster with rotated certificates
.....
INFO[0050] [worker] Successfully restarted Worker Plane..更新指定服务 (CA 证书不变)
rke cert rotate --service kubelet
INFO[0000] Initiating Kubernetes cluster
INFO[0000] Rotating Kubernetes cluster certificates
INFO[0000] [certificates] Generating Node certificate
INFO[0000] Successfully Deployed state file at [./cluster.rkestate]
INFO[0000] Rebuilding Kubernetes cluster with rotated certificates
.....
INFO[0033] [worker] Successfully restarted Worker Plane..轮换 CA 和所有服务证书
rke cert rotate --rotate-ca
INFO[0000] Initiating Kubernetes cluster
INFO[0000] Rotating Kubernetes cluster certificates
INFO[0000] [certificates] Generating CA kubernetes certificates
INFO[0000] [certificates] Generating Kubernetes API server aggregation layer requestheader client CA certificates
INFO[0000] [certificates] Generating Kubernetes API server certificates
INFO[0000] [certificates] Generating Kube Controller certificates
INFO[0000] [certificates] Generating Kube Scheduler certificates
INFO[0000] [certificates] Generating Kube Proxy certificates
INFO[0000] [certificates] Generating Node certificate
INFO[0001] [certificates] Generating admin certificates and kubeconfig
INFO[0001] [certificates] Generating Kubernetes API server proxy client certificates
INFO[0001] [certificates] Generating etcd-xxxxx certificate and key
INFO[0001] [certificates] Generating etcd-yyyyy certificate and key
INFO[0001] [certificates] Generating etcd-zzzzz certificate and key
INFO[0001] Successfully Deployed state file at [./cluster.rkestate]
INFO[0001] Rebuilding Kubernetes cluster with rotated certificates因为证书改变,相应的
token
也会变化,在集群证书更新完成后,需要对连接API SERVER
的 Pod 进行重建,以获取新的token
。- cattle-system/cattle-cluster-agent
- cattle-system/cattle-node-agent
- cattle-system/kube-api-auth
- ingress-nginx/nginx-ingress-controller
- kube-system/canal
- kube-system/kube-dns
- kube-system/kube-dns-autoscaler
- 其他应用 Pod
单容器 Rancher Server 证书更新
证书未过期
- v2.0.14+ 、v2.1.9+
正常升级 rancher 版本到 v2.0.14+ 、v2.1.9+;
执行以下命令:
rancher_server_id=xxx
docker exec -ti ${rancher_server_id} mv /var/lib/rancher/management-state/certs/bundle.json /var/lib/rancher/management-state/certs/bundle.json-bak
docker restart ${rancher_server_id}
- v2.2.0+
正常升级 rancher 版本到 v2.2.0+
执行以下命令:
rancher_server_id=xxx
docker exec -ti ${rancher_server_id} mv /var/lib/rancher/management-state/tls/localhost.crt /var/lib/rancher/management-state/tls/localhost.crt-bak
docker exec -ti ${rancher_server_id} mv /var/lib/rancher/management-state/tls/localhost.key /var/lib/rancher/management-state/tls/localhost.key-bak
docker restart ${rancher_server_id}
证书已过期
如果证书已过期,那么 rancher server 无法正常运行。即使升级到 Rancher v2.0.14+ 、v2.1.9+、v2.2.0+ 也不会更新证书。如果出现这种情况,可以把主机时间往后调整一些,ssl 证书有效时间验证是基于主机时间来验证。
执行以下命令调整主机时间:
# 关闭 ntp 同步,防止时间自动更新回来
timedatectl set-ntp false
# 修改节点时间
timedatectl set-time '2019-01-01 00:00:00'注意: 有的虚拟机安装了
vmtool
工具并开启了虚拟机与主机时间同步功能,这种情况下需要停止vmtool
进程,不然时间会自动更新回来。v2.0.14+ 、v2.1.9+
正常升级 rancher 版本到 v2.0.14+ 、v2.1.9+;
执行以下命令:
rancher_server_id=xxx
docker exec -ti ${rancher_server_id} mv /var/lib/rancher/management-state/certs/bundle.json /var/lib/rancher/management-state/certs/bundle.json-bak
docker restart ${rancher_server_id}
- v2.2.0+
正常升级 rancher 版本到 v2.2.0+
执行以下命令:
rancher_server_id=xxx
docker exec -ti ${rancher_server_id} mv /var/lib/rancher/management-state/tls/localhost.crt /var/lib/rancher/management-state/tls/localhost.crt-bak
docker exec -ti ${rancher_server_id} mv /var/lib/rancher/management-state/tls/localhost.key /var/lib/rancher/management-state/tls/localhost.key-bak
docker restart ${rancher_server_id}
故障处理
提示 CA 证书为空
如果执行更新证书后出现如下错误提示,因为没有执行集群更新操作
解决方法
选择对应问题集群,然后查看浏览器的集群 ID,如下图:
执行命令
kubectl edit clusters <clusters_ID>
- 如果 Rancher 是 HA 安装,直接在 local 集群中,通过
rke
生成的kube
配置文件执行以上命令; - 如果 Rancher 是单容器运行,通过
docker exec -ti <容器 ID> bash
进入容器中,然后执行apt install vim -y
安装 vim 工具,然后再执行以上命令;
- 如果 Rancher 是 HA 安装,直接在 local 集群中,通过
删除
spec.rancherKubernetesEngineConfig.rotateCertificates
层级下的配置参数:修改为
输入
:wq
保存 yaml 文件后集群将自动更新,更新完成后再进行证书更新。
证书已过期导致无法连接 K8S 进行证书轮换
如果集群证书已经过期,那么即使升级到 Rancher v2.0.14、v2.1.9
以及更高版本也无法轮换证书。rancher 是通过 Agent
去更新证书,如果证书过期将无法与 Agent
连接。
解决方法
可以手动设置节点的时间,把时间往后调整一些。因为 Agent
只与 K8S master
和 Rancher Server
通信,如果 Rancher Server 证书未过期,那就只需调整 K8S master
节点时间。
调整命令:
# 关闭 ntp 同步,不然时间会自动更新 |
然后再对 Rancher Server 进行升级,接着按照证书轮换步骤进行证书轮换,等到证书轮换完成后再把时间同步回来。
timedatectl set-ntp true |
检查证书有效期
openssl x509 -in /etc/kubernetes/ssl/kube-apiserver.pem -noout -dates |