乐趣区

关于后端:无需重新搭建集群轻松替换证书

作者简介
王海龙,Rancher 中国社区技术经理,负责 Rancher 中国技术社区的保护和经营。领有 6 年的云计算畛域教训,经验了 OpenStack 到 Kubernetes 的技术改革,无论底层操作系统 Linux,还是虚拟化 KVM 或是 Docker 容器技术都有丰盛的运维和实践经验。

前 言

Rancher Server 的证书问题始终是 Rancher 技术社区里被频繁提到的问题。如果用户在首次搭建 Rancher 环境时没有思考充沛,前期须要替换证书时个别操作是从新搭建集群。

本文将介绍如何在原有集群中替换 Rancher 证书,从而免去从新搭建集群的操作。

撰写本文时应用的 Rancher 版本为 v2.5.x,其余版本操作可能略有不同。

下文将别离介绍单节点和高可用的 Rancher Server 如何替换证书。

替换单节点 Rancher Server 证书

本节将演示如何把单节点 Rancher 的默认证书替换为自签名证书。

后期筹备

假如你曾经搭建了一个单节点的 Rancher,并且创立了一个上游业务集群:

接下来,从浏览器查看 Rancher 证书为dynamic,颁发者为dynamiclistener-ca,这是 Rancher 生成的默认证书:

因为替换证书之后,Rancher Agent 须要应用域名连贯 Rancher Server,业务集群会呈现无奈连贯的状况,所以须要提前从 Rancher UI 下载业务集群的 kubeconfig,并且将 context 切换到demo-rancher-demo2。切换后,能够不通过 Rancher api 间接拜访 k8s api-server。

 1. # kubectl config get-contexts
 2. CURRENT   NAME                 CLUSTER              AUTHINFO  
  
 3. NAMESPACE
 4.         demo                 demo                 demo
          demo-rancher-demo2   demo-rancher-demo2   demo
 5. List item
 6. # kubectl config use-context demo-rancher-demo2
 7. Switched to context "demo-rancher-demo2".
 8. List item
 9. # kubectl config current-context
 10. demo-rancher-demo2
 11. List item
 12. # kubectl get nodes
 13. NAME            STATUS   ROLES                      AGE
 14. VERSION
 15. rancher-demo2   Ready    controlplane,etcd,worker   58m   v1.19.6

Rancher Server 替换为自签名证书

1、备份 Rancher Server

参考官网文档【降级单节点 Rancher】:

https://docs.rancher.cn/docs/rancher2/installation_new/other-installation-methods/single-node-docker/single-node-upgrades/_index/

 1. # docker ps
 2. CONTAINER ID        IMAGE               COMMAND             CREATED 
    STATUS              PORTS                                      NAMES
 3. b0e3062667a2        rancher/rancher     "entrypoint.sh"     2 hours
    ago         Up 2 hours          0.0.0.0:80->80/tcp,
    0.0.0.0:443->443/tcp   silly_swanson
 4. List item
 5. # docker stop silly_swanson
 6. silly_swanson
 7. List item
 8. # docker create --volumes-from silly_swanson --name rancher-data rancher/rancher
 9. aca6f6c791f7caa870e96e1c9f6370a6f015af62c65d73f1f6f80c56587a7542

2、基于备份,应用自定义证书启动 Rancher Server

docker run -d --privileged --volumes-from rancher-data \
           --restart=unless-stopped \
           -p 80:80 -p 443: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

留神:

  • 如果你的需要只是为了要替换证书,请不要批改 Rancher Server
    镜像的版本号,放弃和之前版本统一,本例为:rancher/rancher:v2.5.5,否则将执行降级的操作。
  • 本例是将证书替换为自签名证书,如果要替换为其余类型的证书,请参考【降级单节点 Rancher】里其余选项的参数。

从新登录 Rancher UI,上游集群的状态为Unavailable

并且,cluster-agent 容器报错:

kubectl logs -f cattle-cluster-agent-77cfbbff8b-ldt9n -n cattle-system

time="2021-02-09T09:32:08Z" level=error msg="Remotedialer proxy error" error="x509: cannot validate certificate for 192.168.64.55 because it doesn't contain any IP SANs"
W0209 09:32:15.106448       1 warnings.go:77] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
time="2021-02-09T09:32:18Z" level=info msg="Connecting to wss://192.168.64.55/v3/connect with token j6t7l2wkvz9k9xbdfnlf6kgxngfl89htl2svnmb4qgkrv7wl9ccp5m"
time="2021-02-09T09:32:18Z" level=info msg="Connecting to proxy" url="wss://192.168.64.55/v3/connect"
time="2021-02-09T09:32:18Z" level=error msg="Failed to connect to proxy. Empty dialer response" error="x509: cannot validate certificate for 192.168.64.55 because it doesn't contain any IP SANs"

3、通过 kubectl 删除 daemonset.apps/cattle-node-agent 和 deployment.apps/cattle-cluster-agent

 1. kubectl -n cattle-system delete daemonset.apps/cattle-node-agent
    deployment.apps/cattle-cluster-agent
 2. daemonset.apps "cattle-node-agent" deleted
 3. deployment.apps "cattle-cluster-agent" deleted

4、进入到 Setting-> Advanced Settings 页面,批改 server-url 的地址为你定义的域名,本例为: rancher-demo.kingsd.top

5、导出集群 YAML

在 Rancher UI 上创立 API token(用户 -> API & Keys)并保留Bearer Token

抉择集群后,在 Rancher UI(格局为 c-xxxxx)中找到其 clusterid,并在地址栏中找到它。

依据以上获取的变量替换:RANCHERURL、CLUSTERID、TOKEN(主机须要装置 curljq

 1. # Rancher URL
 2. RANCHERURL="https://192.168.64.55"
 3. # Cluster ID
 4. CLUSTERID="c-sxjz5"
 5. # Token
 6. TOKEN="token-89z7s:lmg8cszl69vjj9pqr5bjst6shs6mht2n5wxtx6hlz8xpl962hxkprf"
 7. # Valid certificates
 8. curl -s -H "Authorization: Bearer ${TOKEN}"
 "${RANCHERURL}/v3/clusterregistrationtokens?clusterId=${CLUSTERID}"
    | jq -r '.data[] | select(.name !="system") | .command'
 9. # Self signed certificates  curl -s -k -H "Authorization: Bearer ${TOKEN}"
 
 10. "${RANCHERURL}/v3/clusterregistrationtokens? 
         clusterId=${CLUSTERID}"| jq -r'.data[] | select(.name !=
              "system") | .insecureCommand'

以上命令执行胜利后,将返回导入集群的命令:

curl --insecure -sfL https://rancher-demo.kingsd.top/v3/import/rc2gb9qgl4wxm7tjwr5d6krqb9c8d8pkm8bt9fmtj8hrhx62fvqkgk.yaml | kubectl apply -f -

而后,能够在具备 kubeconfig 的主机上执行,该命令会从新生成cattle-cluster-agent:

 1. curl --insecure -sfL https://rancherdemo.kingsd.top/v3/import/rc2gb9qgl4wxm7tjwr5d6krqb9c8d8pkm8bt9fmtj8hrhx62fvqkgk.yaml
    | kubectl apply -f -
 2. clusterrole.rbac.authorization.k8s.io/proxy-clusterrole-kubeapiserver
    unchanged
 3. clusterrolebinding.rbac.authorization.k8s.io/proxy-role-binding-kubernetes-master
    unchanged
 4. namespace/cattle-system unchanged
 5. serviceaccount/cattle unchanged
 6. clusterrolebinding.rbac.authorization.k8s.io/cattle-admin-binding
    unchanged
 7. secret/cattle-credentials-cfff3df unchanged
 8. clusterrole.rbac.authorization.k8s.io/cattle-admin unchanged
    deployment.apps/cattle-cluster-agent created

验证

稍等片刻,cattle-cluster-agentcattle-node-agent 将会从新运行:

kubectl -n cattle-system get pods
NAME                                   READY   STATUS    RESTARTS   AGE
cattle-cluster-agent-c9774fcdd-rwdk5   1/1     Running   2          2m14s
cattle-node-agent-r58w4                1/1     Running   0          2m13s

业务集群状态从新变为Active

此时,再次查看 Rancher Server 的证书,曾经替换为自签名的证书:

替换 Rancher HA 证书

本节将演示如何将 Rancher HA 从自 签名证书 替换为 可信证书

本例 Rancher HA 的采纳 L4 的搭建形式,如果 L7 形式搭建的 Rancher HA,从 LB 中替换证书即可。

后期筹备

假如你曾经搭建了一个高可用的自签名 Rancher 集群,并且创立了一个上游业务集群:

接下来,从浏览器查看 Rancher 证书为自签的rancher.kingsd.top,颁发者为ca-rancher.kingsd.top

将自签名证书替换为可信证书

1、从 secret 中移除自签名证书

 1. kubectl -n cattle-system delete secret tls-rancher-ingress
 2. kubectl -n cattle-system delete secret tls-ca

2、应用可信证书从新创立 tls-rancher-ingress

 1. kubectl -n cattle-system create secret tls tls-rancher-ingress \  
 2. --cert=rancher.kingsd.top.pem \
 3. --key=rancher.kingsd.top.key

3、从以后装置的 Rancher Helm chart 中获取用 –set 传递的值。

 1. # helm get values rancher -n cattle-system
 2. USER-SUPPLIED VALUES:
 3. hostname: rancher.kingsd.top
 4. ingress:
 5. tls:
 
 6. source: secret
 7. privateCA: true

4、将上一步中的所有值用 –set key=value 追加到命令中。

 1. # helm upgrade rancher rancher-latest/rancher \
 2. --namespace cattle-system \
 
 3. --set hostname=rancher.kingsd.top \
 4. --set ingress.tls.source=secret

因为只有自签名证书才须要应用参数:privateCA: true,所以更新集群为可信证书时,须要删除该参数

以上是一个例子,可能有更多上一步的值须要追加。另外,也能够将以后的值导出到一个文件中,并在降级时援用该文件。

参考中文文档中【高可用降级指南】局部:

https://docs.rancher.cn/docs/rancher2/installation_new/install-rancher-on-k8s/upgrades/_index/

本例是将证书替换为可信证书,如果要替换为其余类型的证书,请参考【高可用降级指南】里其余选项的参数。

验证

稍等片刻,Rancher pod 更新胜利之后即可通过浏览器拜访 Rancher Server。

此时,再次查看 Rancher Server 的证书,曾经替换为可信证书:

后 记

无论是单节点还是高可用的 Rancher Server 替换证书,思路基本一致,都是应用新的证书去更新原集群,如果替换证书过程中域名有变更或呈现业务集群 agent 无奈连贯 Rancher Server 的状况,能够参考本文中替换单节点 Rancher Server 证书的步骤批改 server-url,而后从新创立cattle-cluster-agent 即可。

退出移动版