Rancher 2.4.x 迁移自定义 k8s 集群的示例分析

本篇文章给大家分享的是有关Rancher 2.4.x 迁移自定义 k8s 集群的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

一、注意事项

  1. 在做操作前,先检查所有 Rancher 环境(源 Rancher 环境和目标 Rancher 环境)中节点的时间是不是已同步(重要)。

  2. 对于 Rancher 低于 v2.3.x 并且自定义 k8s 集群版本低于 v1.16 的环境,因为 K8S 集群 API 版本变化,迁移过去后会提示 API 版本不匹配,以及其他权限问题。在迁移之前,需要升级源 Rancher 环境和目标 Rancher 环境到 v2.4.x 版本,并升级自定义 k8s 集群到 v1.16 以上版本,然后再进行迁移。

  3. 不支持降级迁移。

  4. 集群导入到目标 Rancher 环境后,在没有确认集群迁移完全正常之前,保留源 Rancher 环境,以便集群回退。

二、基础配置(可选)

  1. 对于 docker run 单容器运行的源 Rancher 环境,为了操作方便,建议在源 Rancher 容器中执行以下命令安装文本编辑工具 vim,并配置自动补全,离线环境可忽略此步骤。

    sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    
    apt update && apt install -y vim bash-com* jq
    echo 'source <(kubectl completion bash)' >> ~/.bashrc
    echo 'source /etc/bash_completion' >> ~/.bashrc
    bash

     

  2. 对于源 Rancher 环境是 HA 架构的,可直接在 local 集群中操作。

  3. 准备待迁移集群的直连 kubecfg 文件所谓直连,就是不经过 Rancher Agent 代理直接与业务 K8S 通信。通过 Rancher UI 获取到的 kubecfg 配置文件默认是通过 Rancher Agent 进行代理。当集群迁移到目标 Rancher 环境后,如果 Agent 无法连接 Rancher server,那么后面将无法对自定义 K8S 集群做任何编辑操作。所以需要准备可以直连 K8S 的配置文件,以备不时之需。

    # 进入容器
    docker exec -ti <Rancher 容器 ID> bash
    
    # 待迁移集群 ID,可通过浏览器地址栏查询
    CLUSTER_ID=c-xxx
    
    kubectl get secret c-${CLUSTER_ID} -n cattle-system -o=jsonpath='{.data.cluster}' \
    | base64 --decode | jq .metadata.state | awk '{print substr($0,2,length($0)-2)}' \
    > ${CLUSTER_ID}-kube-config.yml
    
    sed -i 's/\\n/\n/g' ${CLUSTER_ID}-kube-config.yml && \
    sed -i 's/\\"/"/g' ${CLUSTER_ID}-kube-config.yml

     

三、导出源 Rancher 环境中的 CRD 资源( Rancher 容器中或者 local 集群中操作 )

clusters.management.cattle.io (必须)

  • 在源 Rancher UI 上查询并确定待迁移的集群 ID,通过浏览器地址栏可查看集群 ID。

  • 执行以下命令再次查看集群 ID。

    kubectl get --all-namespaces clusters.management.cattle.io
    
    NAME      AGE
    c-wskbw   43m

     

  • 执行以下命令导出 clusters YAML 资源。

    CLUSTER_ID='' # clusters id
    kubectl get clusters.management.cattle.io $CLUSTER_ID -oyaml > ${CLUSTER_ID}-clusters.yaml

     

projects.management.cattle.io (必须)

  • 执行以下命令查看环境中所有的项目,以及对应的集群 ID。

  1. 第一列的 NAMESPACE 对应 集群 ID

  2. 第二列 NAME 对应 项目 ID

    kubectl get projects.management.cattle.io --all-namespaces
    
    NAMESPACE   NAME      AGE
    c-bwl9m     p-l86x6   17m
    c-bwl9m     p-lvdjq   17m


  • 以集群 ID 为命名空间,执行以下命令导出单个集群全部项目资源。

    CLUSTER_ID=''
    kubectl -n $CLUSTER_ID get projects.management.cattle.io -oyaml > ${CLUSTER_ID}-projects.yaml

     

  • nodes.management.cattle.io (必须)

    • 执行以下命令查看集群对应的主机管理配置。

      NAMESPACE 为集群 ID

      kubectl get nodes.management.cattle.io --all-namespaces
      
      NAMESPACE   NAME             AGE
      c-bwl9m     m-59601d9748cf   14m

       

    • 以集群 ID 为命名空间,执行以下命令导出单个集群所有节点的 YAML 文件。

      CLUSTER_ID=''
      kubectl -n $CLUSTER_ID get nodes.management.cattle.io -oyaml > $CLUSTER_ID-nodes.yaml

       

    secrets (必须)

    • 创建集群会生成以下密文

      kubectl get secrets --all-namespaces
      
      NAMESPACE            NAME                  TYPE                                  DATA   AGE
      c-bwl9m              default-token-nl7mh   kubernetes.io/service-account-token   3      4m28s
      cattle-global-data   default-token-qgwn9   kubernetes.io/service-account-token   3      39m
      cattle-system        c-c-bwl9m             Opaque                                1      4m14s
      cattle-system        tls-rancher           kubernetes.io/tls                     2      39m
      default              default-token-rwm29   kubernetes.io/service-account-token   3      39m
      kube-public          default-token-6k2vc   kubernetes.io/service-account-token   3      39m
      kube-system          default-token-wg7rg   kubernetes.io/service-account-token   3      39m
      p-l86x6              default-token-bz2pg   kubernetes.io/service-account-token   3      4m28s
      p-lvdjq              default-token-7tbkn   kubernetes.io/service-account-token   3      4m28s
      user-vf5xr           default-token-ktvrm   kubernetes.io/service-account-token   3      21m

       

    • kube* 命名空间相关的可以忽略,service-account-token* 类型的可以忽略,tls-rancher 可以忽略。

    • 提取 cattle-system 命名空间下 集群 ID 相关的密文。

      kubectl -n cattle-system get secrets
      
      NAME                  TYPE                                  DATA   AGE
      c-c-bwl9m             Opaque                                1      8m15s
      default-token-xhl6d   kubernetes.io/service-account-token   3      43m
      tls-rancher           kubernetes.io/tls                     2      43m

       

      CLUSTER_ID=''
      kubectl -n cattle-system get secrets c-${CLUSTER_ID} -oyaml > $CLUSTER_ID-secrets.yaml

       

    apps.project.cattle.io (可选)

    如果迁移的集群启用了 cluster-monitoring 等应用商店 APP,需要导出 YAML 再导入目标 Rancher 环境,不然 Rancher 无法管理对应资源。

    • 查看所有集群项目下部署的应用商店 APP。

      kubectl get apps.project.cattle.io --all-namespaces
      
      NAMESPACE   NAME                  AGE
      p-tjfmp     wp-p-tjfmp            265d
      p-w49bx     demoma-p-w49bx        6m2s
      p-w49bx     mongodb-replicaset    19d
      p-wfdpj     cluster-monitoring    27d
      p-wfdpj     monitoring-operator   27d
      p-wfdpj     rancher-logging       47d
      p-zkhr5     cluster-alerting      122d
      p-zkhr5     cluster-monitoring    38d
      p-zkhr5     longhorn-system       81d
      p-zkhr5     monitoring-operator   38d
      p-zkhr5     nfs-provisioner       229d
      p-zkhr5     rabbitmq              18d
      p-zkhr5     rancher-logging       9d
      p-zkhr5     systemapp-demo        203d

       

    • 通过 集群 ID 获取 项目 ID,并提取所有项目对应的 APP 的 YAML 文件。

      CLUSTER_ID=xxx
      PROJECT_ID=$( kubectl get project -n $CLUSTER_ID | grep -v 'NAME' | awk '{print $1}' )
      
      APPS_NS=$( kubectl get apps.project.cattle.io --all-namespaces | awk '{ print $1 }' | grep -v 'NAMESPACE' )
      
      for project_id in ${PROJECT_ID};
      do
          if echo ${APPS_NS} | grep ${project_id};
              kubectl get app --all-namespaces | grep -v NAMESPACE | awk '{ print "kubectl get apps -n " $1" "$2 " -oyaml > " $1"-"$2".yaml" }' | sh -
          fi
      done;

       

    multiclusterapps.management.cattle.io (可选)

    与 apps.project.cattle.io 类型, 如果有多集群应用商店应用,也需要导出 YAML。

    kubectl get multiclusterapps.management.cattle.io --all-namespaces

    Pod(可选)安全策略

    kubectl get podsecuritypolicytemplates.management.cattle.io

    全局安全认证(可选)(authconfigs.management.cattle.io)

    • 执行以下命令查看对应的认证提供商

      kubectl get authconfigs.management.cattle.io --all-namespaces
      
      NAME              AGE
      activedirectory   259d
      adfs              259d
      azuread           259d
      freeipa           259d
      github            259d
      googleoauth       172d
      keycloak          259d
      local             259d
      okta              259d
      openldap          259d
      ping              259d

       

    • 根据实际配置导出对应提供商 yaml 文件

      AUTH_PROVIDER=''
      kubectl get authconfigs.management.cattle.io --all-namespaces \
      $AUTH_PROVIDER -oyaml > authconfigs-${AUTH_PROVIDER}.yaml

       

    users.management.cattle.io (可选)

    # 排除本地 admin
    USERS=$( kubectl get users.management.cattle.io --all-namespaces | \
    grep -v user- | grep -v NAME | awk '{print $1}' )
    
    # 轮训所有用户,分别导出每个用户的 YAML 文件
    for users in $USERS;
    do
        kubectl get users.management.cattle.io $users --all-namespaces -oyaml > user-${users}.yaml;
    done;

    注意: 用户、角色、角色绑定,如果要导出,则需一起导出。

    clusterrole.rbac.authorization.k8s.io (可选)

    • 创建用户时,会自动创建一个 clusterrole,比如 u-${user_id}-view,这个可以不用导出。

    • 如果有自定义集群角色,可通过 clusterrole 名称查询并导出。

    clusterrolebindings.rbac.authorization.k8s.io (可选)

    • 创建用户时,会自动创建一个 clusterrolebindings,比如 grb-${user_id}-view

    • 在 Rancher UI 上为集群添加成员的时候,会自动创建 clusterrolebindings。在集群迁移完成后可选择手动为集群添加成员。如果为大量用户配置了集群成员权限,为了减少手动操作的工作量,可以选择把这些 clusterrolebindings 一并导出,然后导入目的 Rancher local 集群。

    roles.rbac.authorization.k8s.io (可选)

    • 在 Rancher UI 上为项目添加成员的时候,会以 项目 ID 为命名空间自动创建对应权限的角色。在集群迁移完成后可选择手动为项目添加成员,这些角色也会自动重新创建。如果为大量用户配置了项目成员权限,为了减少手动操作的工作量,可以选择把这些角色一并导出,然后导入目的 Rancher local 集群。

    • 如果有自定义角色,可通过 role 名称查询并导出。

    • 以项目 ID 和集群 ID 来过滤 role

      kubectl get role.rbac.authorization.k8s.io -A|grep 6zjs5
      c-q4mfl              p-6zjs5-projectmember                  2021-03-04T08:26:54Z
      p-6zjs5              edit                                   2021-03-04T08:26:54Z
      p-6zjs5              project-member                         2021-03-04T08:26:54Z

       

    • 以集群 ID 和项目 ID 为 NAMESPACE 导出全部 yaml 文件

      # 指定需要迁移的集群 ID
      CLUSTER_ID=''
      
      PROJECT_ID=$( kubectl get project -n ${CLUSTER_ID} |grep -v NAME | awk '{print $1}' )
      NAMESPACE=$( echo ${CLUSTER_ID} ${PROJECT_ID} cattle-global-data )
      
      for ns in $NAMESPACE ;
      do
          kubectl -n $ns get roles.rbac.authorization.k8s.io -oyaml > roles-$ns.yaml
      done;

       

      注意: 用户、角色、角色绑定,如果要导出,则需一起导出。

    rolebindings.rbac.authorization.k8s.io (可选)

    与角色具有相同逻辑。

    • 以项目 ID 和集群 ID 来过滤 rolebindings

      kubectl get rolebindings.rbac.authorization.k8s.io -A | grep 6zjs5
      c-q4mfl     p-6zjs5-prtb-zqb6j-project-member             Role/project-member           2m8s
      c-q4mfl     p-6zjs5-u-6pz5k3vokn-member-project-member    Role/project-member           31m
      c-q4mfl     rolebinding-692hm                             Role/p-6zjs5-projectmember    2m8s
      c-q4mfl     rolebinding-fhrwt                             Role/p-6zjs5-projectmember    31m
      p-6zjs5     prtb-zqb6j-edit                               Role/edit                     2m8s
      p-6zjs5     prtb-zqb6j-project-member                     Role/project-member           2m8s
      p-6zjs5     u-6pz5k3vokn-member-edit                      Role/edit                     31m
      p-6zjs5     u-6pz5k3vokn-member-project-member            Role/project-member           31m

       

    • 以集群 ID 和项目 ID 为 NAMESPACE 导出全部 yaml 文件

      CLUSTER_ID=''
      
      PROJECT_ID=$( kubectl get project -n $CLUSTER_ID |grep -v NAME | awk '{print $1}' )
      NAMESPACE=$( echo ${CLUSTER_ID} ${PROJECT_ID} cattle-global-data )
      
      for ns in $NAMESPACE ;
      do
          kubectl -n $ns get rolebindings.rbac.authorization.k8s.io -oyaml > roles-$ns.yaml
      done;

       

      注意: 用户、角色、角色绑定,如果要导出,则需一起导出。

    四、目标 Rancher 环境中导入CRD 资源

    • 将上一步导出的 YAML 文件依次导入到目标 Rancher 环境,除密文(secrets)外其他 YAML 可使用 kubeclt apply -f xxx.yaml 去导入。

    • 因为密文(secrets)文件太大,需要通过 kubectl replace --force -f xxx 导入。

    五、目标 Rancher UI 操作

    创建 clusterregistrationtokens

    在 YAML 文件导入目标 Rancher 环境后,访问https://demo.xxxxx.com/v3/clusters/<cluster_id>/clusterregistrationtokens 可以看到并没有注册命令,这个时候需要手动去创建。

    • 访问 https://demo.xxxx.com/v3/clusters/<cluster_id>/clusterregistrationtokens 页面,点击右上角的 Create

    • 选择迁移的 集群 ID

    Rancher 2.4.x 迁移自定义 k8s 集群的示例分析

    • 点击Show Request,然后再点击 Send Request。如果显示状态码为201即执行成功;

    Rancher 2.4.x 迁移自定义 k8s 集群的示例分析

    • 执行完成后,在 clusterregistrationtokens 页面应该是可以看到如下的链接,复制自签名 ssl 证书 对应那条命令备用。

    Rancher 2.4.x 迁移自定义 k8s 集群的示例分析

    执行 Agent 导入命令

    回到源 Rancher 环境,这个时候 k8s 集群还是可以正常访问,前面的操作只是将必要的 CRD 资源迁移到目标 Rancher 环境。

    进入 需迁移集群 详情页面,然后点击 执行 kubectl 命令行 按钮,接着执行上一步骤中拷贝的 clusterregistrationtokens 命令。

    六、CRD 资源清单

    以下是 Rancher v2.4.13 的 CRD 资源清单,文章前面部分仅指出了常用的一些资源。如果有使用其他资源,可按照上述方法进行导出再导入目标集群。

    kubectl  get crd| grep management.cattle.io
    
    authconfigs.management.cattle.io                                2021-03-04T06:47:55Z
    catalogs.management.cattle.io                                   2021-03-04T06:47:55Z
    catalogtemplates.management.cattle.io                           2021-03-04T06:47:55Z
    catalogtemplateversions.management.cattle.io                    2021-03-04T06:47:55Z
    cisbenchmarkversions.management.cattle.io                       2021-03-04T06:47:56Z
    cisconfigs.management.cattle.io                                 2021-03-04T06:47:56Z
    clusteralertgroups.management.cattle.io                         2021-03-04T06:47:55Z
    clusteralertrules.management.cattle.io                          2021-03-04T06:47:55Z
    clusteralerts.management.cattle.io                              2021-03-04T06:47:55Z
    clustercatalogs.management.cattle.io                            2021-03-04T06:47:55Z
    clusterloggings.management.cattle.io                            2021-03-04T06:47:55Z
    clustermonitorgraphs.management.cattle.io                       2021-03-04T06:47:55Z
    clusterregistrationtokens.management.cattle.io                  2021-03-04T06:47:55Z
    clusterroletemplatebindings.management.cattle.io                2021-03-04T06:47:55Z
    clusters.management.cattle.io                                   2021-03-04T06:47:55Z
    clusterscans.management.cattle.io                               2021-03-04T06:47:55Z
    clustertemplaterevisions.management.cattle.io                   2021-03-04T06:47:56Z
    clustertemplates.management.cattle.io                           2021-03-04T06:47:56Z
    composeconfigs.management.cattle.io                             2021-03-04T06:47:55Z
    dynamicschemas.management.cattle.io                             2021-03-04T06:47:55Z
    etcdbackups.management.cattle.io                                2021-03-04T06:47:55Z
    features.management.cattle.io                                   2021-03-04T06:47:55Z
    globaldnses.management.cattle.io                                2021-03-04T06:47:56Z
    globaldnsproviders.management.cattle.io                         2021-03-04T06:47:56Z
    globalrolebindings.management.cattle.io                         2021-03-04T06:47:55Z
    globalroles.management.cattle.io                                2021-03-04T06:47:55Z
    groupmembers.management.cattle.io                               2021-03-04T06:47:55Z
    groups.management.cattle.io                                     2021-03-04T06:47:55Z
    kontainerdrivers.management.cattle.io                           2021-03-04T06:47:55Z
    monitormetrics.management.cattle.io                             2021-03-04T06:47:55Z
    multiclusterapprevisions.management.cattle.io                   2021-03-04T06:47:55Z
    multiclusterapps.management.cattle.io                           2021-03-04T06:47:55Z
    nodedrivers.management.cattle.io                                2021-03-04T06:47:55Z
    nodepools.management.cattle.io                                  2021-03-04T06:47:55Z
    nodes.management.cattle.io                                      2021-03-04T06:47:55Z
    nodetemplates.management.cattle.io                              2021-03-04T06:47:55Z
    notificationtemplates.management.cattle.io                      2021-03-04T06:47:55Z
    notifiers.management.cattle.io                                  2021-03-04T06:47:55Z
    podsecuritypolicytemplateprojectbindings.management.cattle.io   2021-03-04T06:47:55Z
    podsecuritypolicytemplates.management.cattle.io                 2021-03-04T06:47:55Z
    preferences.management.cattle.io                                2021-03-04T06:47:55Z
    projectalertgroups.management.cattle.io                         2021-03-04T06:47:55Z
    projectalertrules.management.cattle.io                          2021-03-04T06:47:55Z
    projectalerts.management.cattle.io                              2021-03-04T06:47:55Z
    projectcatalogs.management.cattle.io                            2021-03-04T06:47:55Z
    projectloggings.management.cattle.io                            2021-03-04T06:47:55Z
    projectmonitorgraphs.management.cattle.io                       2021-03-04T06:47:55Z
    projectnetworkpolicies.management.cattle.io                     2021-03-04T06:47:56Z
    projectroletemplatebindings.management.cattle.io                2021-03-04T06:47:56Z
    projects.management.cattle.io                                   2021-03-04T06:47:56Z
    rkeaddons.management.cattle.io                                  2021-03-04T06:47:56Z
    rkek8sserviceoptions.management.cattle.io                       2021-03-04T06:47:56Z
    rkek8ssystemimages.management.cattle.io                         2021-03-04T06:47:56Z
    roletemplates.management.cattle.io                              2021-03-04T06:47:56Z
    samltokens.management.cattle.io                                 2021-03-04T06:47:56Z
    settings.management.cattle.io                                   2021-03-04T06:47:56Z
    templatecontents.management.cattle.io                           2021-03-04T06:47:56Z
    templates.management.cattle.io                                  2021-03-04T06:47:56Z
    templateversions.management.cattle.io                           2021-03-04T06:47:56Z
    tokens.management.cattle.io                                     2021-03-04T06:47:56Z
    userattributes.management.cattle.io                             2021-03-04T06:47:56Z
    users.management.cattle.io                                      2021-03-04T06:47:56Z

    七、异常回退

    因为源 Rancher 环境保留了完整的配置信息,要想回退到源 Rancher 环境,只需将集群重新注册到源 Rancher 环境即可。

    1. 访问源 Rancher https://demo.cnrancher.com/v3/clusters/<cluster_id>/clusterregistrationtokens 页面 ;

    2. 定位到 insecureCommand,复制 insecureCommand 后面的命令,在需要迁移的 k8s 集群中执行。

    以上就是Rancher 2.4.x 迁移自定义 k8s 集群的示例分析,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。