作者简介王海龙,Rancher中国社区技术经理,负责Rancher中国技术社区的维护和运营。拥有6年的云计算领域经验,经历了OpenStack到Kubernetes的技术变革,无论底层操作系统Linux,还是虚拟化KVM或是Docker容器技术都有丰富的运维和实践经验。
RancherServer的证书问题一直是Rancher技术社区里被频繁提到的问题。如果用户在首次搭建Rancher环境时没有考虑充分,后期需要替换证书时一般操作是重新搭建集群。
本文将介绍如何在原有集群中替换Rancher证书,从而免去重新搭建集群的操作。
撰写本文时使用的Rancher版本为v2.5.x,其他版本操作可能略有不同。
下文将分别介绍单节点和高可用的RancherServer如何替换证书。
本节将演示如何把单节点Rancher的默认证书替换为自签名证书。
前期准备
假设你已经搭建了一个单节点的Rancher,并且创建了一个下游业务集群:
接下来,从浏览器查看Rancher证书为dynamic,颁发者为dynamiclistener-ca,这是Rancher生成的默认证书:
因为替换证书之后,RancherAgent需要使用域名连接RancherServer,业务集群会出现无法连接的情况,所以需要提前从RancherUI下载业务集群的kubeconfig,并且将context切换到demo-rancher-demo2。切换后,可以不通过Rancherapi直接访问k8sapi-server。
1.#kubectlconfigget-contexts2.CURRENTNAMECLUSTERAUTHINFO3.NAMESPACE4.demodemodemodemo-rancher-demo2demo-rancher-demo2demo5.Listitem6.#kubectlconfiguse-contextdemo-rancher-demo27.Switchedtocontext"demo-rancher-demo2".8.Listitem9.#kubectlconfigcurrent-context10.demo-rancher-demo211.Listitem12.#kubectlgetnodes13.NAMESTATUSROLESAGE14.VERSION15.rancher-demo2Readycontrolplane,etcd,worker58mv1.19.6RancherServer替换为自签名证书
1、备份RancherServer
参考官方文档【升级单节点Rancher】:
1.#dockerps2.CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES3.b0e3062667a2rancher/rancher"entrypoint.sh"2hoursagoUp2hours0.0.0.0:80->80/tcp,0.0.0.0:443->443/tcpsilly_swanson4.Listitem5.#dockerstopsilly_swanson6.silly_swanson7.Listitem8.#dockercreate--volumes-fromsilly_swanson--namerancher-datarancher/rancher9.aca6f6c791f7caa870e96e1c9f6370a6f015af62c65d73f1f6f80c56587a75422、基于备份,使用自定义证书启动RancherServer
dockerrun-d--privileged--volumes-fromrancher-data\--restart=unless-stopped\-p80:80-p443:443\-v$PWD/certs/cert.pem:/etc/rancher/ssl/cert.pem\-v$PWD/certs/key.pem:/etc/rancher/ssl/key.pem\-v$PWD/certs/ca.pem:/etc/rancher/ssl/cacerts.pem\--privileged\rancher/rancher:v2.5.5注意:
并且,cluster-agent容器报错:
kubectllogs-fcattle-cluster-agent-77cfbbff8b-ldt9n-ncattle-systemtime="2021-02-09T09:32:08Z"level=errormsg="Remotedialerproxyerror"error="x509:cannotvalidatecertificatefor192.168.64.55becauseitdoesn'tcontainanyIPSANs"W020909:32:15.1064481warnings.go:77]apiextensions.k8s.io/v1beta1CustomResourceDefinitionisdeprecatedinv1.16+,unavailableinv1.22+;useapiextensions.k8s.io/v1CustomResourceDefinitiontime="2021-02-09T09:32:18Z"level=infomsg="Connectingtowss://192.168.64.55/v3/connectwithtokenj6t7l2wkvz9k9xbdfnlf6kgxngfl89htl2svnmb4qgkrv7wl9ccp5m"time="2021-02-09T09:32:18Z"level=infomsg="Connectingtoproxy"url="wss://192.168.64.55/v3/connect"time="2021-02-09T09:32:18Z"level=errormsg="Failedtoconnecttoproxy.Emptydialerresponse"error="x509:cannotvalidatecertificatefor192.168.64.55becauseitdoesn'tcontainanyIPSANs"3、通过kubectl删除daemonset.apps/cattle-node-agent和deployment.apps/cattle-cluster-agent
1.kubectl-ncattle-systemdeletedaemonset.apps/cattle-node-agentdeployment.apps/cattle-cluster-agent2.daemonset.apps"cattle-node-agent"deleted3.deployment.apps"cattle-cluster-agent"deleted4、进入到Setting->AdvancedSettings页面,修改server-url的地址为你定义的域名,本例为:rancher-demo.kingsd.top
5、导出集群YAML
在RancherUI上创建APItoken(用户->API&Keys)并保存BearerToken
选择集群后,在RancherUI(格式为c-xxxxx)中找到其clusterid,并在地址栏中找到它。
根据以上获取的变量替换:RANCHERURL、CLUSTERID、TOKEN(主机需要安装curl和jq)
稍等片刻,cattle-cluster-agent和cattle-node-agent将会重新运行:
kubectl-ncattle-systemgetpodsNAMEREADYSTATUSRESTARTSAGEcattle-cluster-agent-c9774fcdd-rwdk51/1Running22m14scattle-node-agent-r58w41/1Running02m13s业务集群状态重新变为Active:
此时,再次查看RancherServer的证书,已经替换为自签名的证书:
本节将演示如何将RancherHA从自签名证书替换为可信证书
本例RancherHA的采用L4的搭建方式,如果L7方式搭建的RancherHA,从LB中替换证书即可。
假设你已经搭建了一个高可用的自签名Rancher集群,并且创建了一个下游业务集群:
接下来,从浏览器查看Rancher证书为自签的rancher.kingsd.top,颁发者为ca-rancher.kingsd.top:
将自签名证书替换为可信证书
1、从secret中移除自签名证书
1.kubectl-ncattle-systemdeletesecrettls-rancher-ingress2.kubectl-ncattle-systemdeletesecrettls-ca2、使用可信证书重新创建tls-rancher-ingress
1.kubectl-ncattle-systemcreatesecrettlstls-rancher-ingress\2.--cert=rancher.kingsd.top.pem\3.--key=rancher.kingsd.top.key3、从当前安装的RancherHelmchart中获取用--set传递的值。
1.#helmgetvaluesrancher-ncattle-system2.USER-SUPPLIEDVALUES:3.hostname:rancher.kingsd.top4.ingress:5.tls:6.source:secret7.privateCA:true4、将上一步中的所有值用--setkey=value追加到命令中。
1.#helmupgraderancherrancher-latest/rancher\2.--namespacecattle-system\3.--sethostname=rancher.kingsd.top\4.--setingress.tls.source=secret因为只有自签名证书才需要使用参数:privateCA:true,所以更新集群为可信证书时,需要删除该参数
以上是一个例子,可能有更多上一步的值需要追加。另外,也可以将当前的值导出到一个文件中,并在升级时引用该文件。
参考中文文档中【高可用升级指南】部分:
本例是将证书替换为可信证书,如果要替换为其他类型的证书,请参考【高可用升级指南】里其他选项的参数。
验证
稍等片刻,Rancherpod更新成功之后即可通过浏览器访问RancherServer。
此时,再次查看RancherServer的证书,已经替换为可信证书:
无论是单节点还是高可用的RancherServer替换证书,思路基本一致,都是使用新的证书去更新原集群,如果替换证书过程中域名有变更或出现业务集群agent无法连接RancherServer的情况,可以参考本文中替换单节点RancherServer证书的步骤修改server-url,然后重新创建cattle-cluster-agent即可。