無需重新搭建集群,輕松替換證書!


作者簡介
王海龍,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即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM