16 - 轮换证书


    默认情况下,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年)。

    对于使用Rancher v2.0.14、v2.1.9之前版本安装的Kubernetes集群,证书即将到期,请尽快更新集群证书。

    可用版本: 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证书不变)
    • 进入全局\集群视图;
    • 选择目标集群右侧的省略号菜单,选择升级;
    • 点击右侧显示高级选项,检查Etcd快照轮换功能是否开启,建议开启此功能;image-20190423133224065
    • 授权集群访问地址中,检查功能是否已开启,建议开始此功能,下边的域名可以不用填写;
    • 最后点击保存,集群将自动进行更新image-20190423133309672
    • 进入全局\集群视图;
    • 选择对应集群右侧的省略号菜单,选择更新证书有效期;
    • 选择更新所有服务证书,并点击保存image-20190423132218317
    • 因为证书改变,相应的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 v2.0.14+ v2.1.9+

    对于以及更高版本,可通过API对集群证书进行更新。API证书轮换将会同时对所有组件证书进行更新,不支持指定组件更新证书。

    • 全局视图中,定位到需要更新证书的集群,然后点击右侧省略号菜单,然后点击API查看
    • 点击右上方的RotateCertificatesimage-20190527122838260
    • 点击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 v0.2.0+

    注意 如果以前是通过rke v0.2.0之前的版本创建的Kubernetes集群,在轮换证书前先执行rke up操作,参考: https://www.cnrancher.com/docs/rke/latest/cn/cert-mgmt/

    • 通过RKE轮换证书,目前支持:

      • 批量更新所有服务证书(CA证书不变)
      • 更新某个指定服务(CA证书不变)
      • 轮换CA和所有服务证书
    • 批量更新所有服务证书(CA证书不变)
    1. rke cert rotate --service kubelet
    2. INFO[0000] Initiating Kubernetes cluster
    3. INFO[0000] Rotating Kubernetes cluster certificates
    4. INFO[0000] [certificates] Generating Node certificate
    5. INFO[0000] Successfully Deployed state file at [./cluster.rkestate]
    6. INFO[0000] Rebuilding Kubernetes cluster with rotated certificates
    7. .....
    8. INFO[0033] [worker] Successfully restarted Worker Plane..
    • 轮换CA和所有服务证书
    • 因为证书改变,相应的token也会变化,在集群证书更新完成后,需要对连接API SERVER的Pod进行重建,以获取新的。

      • 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 v2.0.14+ 、v2.1.9+、v2.2.0+会自动检查证书有效期,如果发现证书过期,将会自动生成新的证书。所以独立容器运行的Rancher server只需把rancher版本升级到支持的版本,无需做其他操作。

    image-20190423133555060

    解决方法

    • 选择对应问题集群,然后查看浏览器的集群ID,如下图:
    • 执行命令 kubectl edit clusters <clusters_ID>
      • 如果Rancher是HA安装,直接在local集群中,通过rke生成的kube配置文件执行以上命令;
      • 如果Rancher是单容器运行,通过docker exec -ti <容器ID> bash进入容器中,然后执行apt install vim -y安装vim工具,然后再执行以上命令;
    • 删除spec.rancherKubernetesEngineConfig.rotateCertificates层级下的配置参数:image-20190423135522178修改为
    • 输入:wq保存yaml文件后集群将自动更新,更新完成后再进行证书更新。

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

    解决方法

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

    调整命令:

    1. # 关闭ntp同步,不然时间会自动更新
    2. timedatectl set-ntp false
    3. # 修改节点时间

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