本文永久链接: https://www.xtplayer.cn/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,则需要先做一次集群更新操作。

  1. 进入全局\集群视图;
  2. 选择目标集群右侧的省略号菜单,选择升级;
  3. 点击右侧显示高级选项,检查 ETCD 备份轮换功能是否开启,建议开启此功能;
  4. 授权集群访问地址中,检查功能是否已开启,建议开始此功能,下边的域名可以不用填写;
  5. 最后点击保存,集群将自动进行更新

轮换证书

  1. 进入全局\集群视图;

  2. 选择对应集群右侧的省略号菜单,选择更新证书有效期;

  3. 选择更新所有服务证书,并点击保存

  4. 集群将自动更新证书

  5. 因为证书改变,相应的 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 证书轮换将会同时对所有组件证书进行更新,不支持指定组件更新证书。

  1. 全局视图中,定位到需要更新证书的集群,然后点击右侧省略号菜单,然后点击 API 查看

  2. 点击右上方的 RotateCertificates

  3. 点击Show Request

  4. 点击 Send Request

  5. 因为证书改变,相应的 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 和所有服务证书
  1. 批量更新所有服务证书 (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..
  2. 更新指定服务 (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..
  3. 轮换 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
  4. 因为证书改变,相应的 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+
  1. 正常升级 rancher 版本到 v2.0.14+ 、v2.1.9+;

  2. 执行以下命令:

    rancher_server_id=xxx

    docker exec c -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+
  1. 正常升级 rancher 版本到 v2.2.0+

  2. 执行以下命令:

    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+

  1. 正常升级 rancher 版本到 v2.0.14+ 、v2.1.9+;

  2. 执行以下命令:

    rancher_server_id=xxx

    docker exec c -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+
  1. 正常升级 rancher 版本到 v2.2.0+

  2. 执行以下命令:

    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 证书为空

如果执行更新证书后出现如下错误提示,因为没有执行集群更新操作

解决方法

  1. 选择对应问题集群,然后查看浏览器的集群 ID,如下图: chimage-20190423133810076

  2. 执行命令 kubectl edit clusters <clusters_ID>

    • 如果 Rancher 是 HA 安装,直接在 local 集群中,通过 rke 生成的 kube 配置文件执行以上命令;
    • 如果 Rancher 是单容器运行,通过 docker exec -ti <容器 ID> bash 进入容器中,然后执行 apt install vim -y 安装 vim 工具,然后再执行以上命令;
  3. 删除 spec.rancherKubernetesEngineConfig.rotateCertificates 层级下的配置参数:

    修改为

  4. 输入 :wq 保存 yaml 文件后集群将自动更新,更新完成后再进行证书更新。

证书已过期导致无法连接 K8S 进行证书轮换

如果集群证书已经过期,那么即使升级到 Rancher v2.0.14、v2.1.9 以及更高版本也无法轮换证书。rancher 是通过 Agent 去更新证书,如果证书过期将无法与 Agent 连接。

解决方法

可以手动设置节点的时间,把时间往后调整一些。因为 Agent 只与 K8S masterRancher Server 通信,如果 Rancher Server 证书未过期,那就只需调整 K8S master 节点时间。

调整命令:

# 关闭 ntp 同步,不然时间会自动更新
timedatectl set-ntp false
# 修改节点时间
timedatectl set-time '2019-01-01 00:00:00'

然后再对 Rancher Server 进行升级,接着按照证书轮换步骤进行证书轮换,等到证书轮换完成后再把时间同步回来。

timedatectl set-ntp true

检查证书有效期:

openssl x509 -in /etc/kubernetes/ssl/kube-apiserver.pem -noout -dates