• 无需重新搭建集群,轻松替换证书!


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

  • 相关阅读:
    Git SVN 版本控制 简介 总结 MD
    shape selector 背景 圆形 矩形 圆环 [MD]
    eclipse library jar包 使用总结 MD
    Visitor 访问者模式 [MD]
    BlazeMeter+Jmeter 搭建接口测试框架
    nGrinder 简易使用教程
    65个面试常见问题技巧回答(绝对实用)
    [面试技巧]16个经典面试问题回答思路
    质量模型测试电梯
    linux apache服务器优化建议整理(很实用)
  • 原文地址:https://www.cnblogs.com/rancherlabs/p/14681071.html
Copyright © 2020-2023  润新知