自建ArgoCD迁移至ACK One GitOps

本文介绍如何将自建ArgoCD主控集群迁移至分布式云容器平台 ACK One

概述

在自建ArgoCD环境迁移到ACK One GitOps时,由于涉及的集群、仓库和应用数量较多,手动逐个迁移耗时较长。因此,我们提供了onectl命令以支持快速将其迁移至ACK One。架构如下所示:

image
  • onectl根据您指定的舰队ID和自建ArgoCD主控集群的ACK集群ID(含注册集群),通过二者的KubeConfig,将自建ArgoCD主控集群中ArgoCD的Cluster Secret(s)、Repo Secret(s)及Application(s)资源迁移至ACK One Fleet实例

    说明

    若您的自建ArgoCD主控集群是IDC集群,请先将其接入注册集群。具体操作,请参见创建注册集群

  • 如果您对自建ArgoCD主控集群自定义配置了ConfigMap,请在迁移之前在ACK One Fleet实例中完成相应配置。

  • 如果您为Cluster Secret(s)添加了自定义标签,请在迁移集群后通过ACK One GitOps的ArgoCD UI进行相应配置。

  • onectl迁移完应用之后,您可以通过非级联删除的方式,删除自建ArgoCD主控集群的Application(s)来断开其与应用所在集群的联系,而仅由ACK One GitOps对其进行管理。

前提条件

步骤一:配置onectl RAM用户

RAM用户登录后,才能将自建ArgoCD应用中心的应用迁移到ACK One GitOps,onectl将使用该用户的AK和SK访问阿里云资源。因此,阿里云账号需要对RAM用户授予以下相关权限。

  1. 授予AliyunAdcpFullAccess权限。具体操作,请参见为RAM用户授予系统权限策略

  2. 授予AliyunCSReadOnly权限,或添加ACK Template权限,ACK Template权限策略内容如下。

    {
        "Action": [
            "cs:DescribeTemplates",
            "cs:DescribeTemplateAttribute",
            "cs:DescribeClusterUserKubeconfig"
        ],
        "Resource": [
            "*"
        ],
        "Effect": "Allow"
    }
  3. 授予自建ArgoCD集群的管理员权限。具体操作,请参见授予集群RBAC

  4. 执行以下命令,配置onectl RAM用户的AK、SK信息,仅需配置Access Key IdAccess Key Secret

    onectl configure

    预期输出:

    Configuring profile default ...
    Access Key Id [*********************NaY]: 
    Access Key Secret [***************************HUd]: 
    Ram Username []: 
    Default Kubeconfig Path (default is ~/.kube/config) []: 
    Saving profile[default] ...
    Done.

步骤二:迁移集群

  1. 为了简化迁移命令,需要将ACK One Fleet实例的ID和应用中心主控集群的ID设置为环境变量,onectl会根据clusterid自动获取两者KubeConfig,保存在~/.onectl/目录下。

    export ACKONE_HUB_CLUSTER_ID=ccc47ca148d0147519f229bba********
    export ARGOCD_CLUSTER_ID=ce4bb2004bb0e409eaa4c593d********
  2. 可通过以下两种方式迁移集群。

    1. 方式一:通过ACK One控制台将自建ArgoCD环境的子集群(非主控集群)关联至ACK One Fleet实例

    2. 方式二:通过onectl命令行迁移集群。

      1. 给自建ArgoCD主控集群中所有的Cluster Secret(s)添加标签ack_cluster_id: <your ack cluster id>,以指定其所对应的ACK集群。可以通过自建ArgoCD UI或kubectl修改Secret。

      2. 执行以下onectl命令,将自建ArgoCD主控集群中集群迁移到ACK One GitOps。

        onectl migrate clusters -n argocd
        说明

        如果您在自建ArgoCD环境中已对Cluster Secret(s)添加label或者annotation,可在本步骤完成后在ACK One GitOps的ArgoCD UI上进行添加。

步骤三:迁移Git仓库

  1. 执行以下命令,将应用中心主控集群中的仓库迁移到ACK One GitOps。

    onectl migrate repos -n argocd
  2. 执行以下命令,查看某一类或所有类资源状态。

    #onectl migrate status [clusters|repos|apps] -nargocd
    
    # 查看所有资源状态。
    onectl migrate status -nargocd
    
    # 查看单类资源状态。
    onectl migrate status clusters -nargocd
    onectl migrate status repos -nargocd
    onectl migrate status apps -nargocd

    预期输出:

    #################### Clusters Status ####################
    All 1 clusters were attached successfully to ACK One ccc47****** !
    CLUSTER       STATE    MESSAGE
    ce4b******    Succeed  
    
    #################### Repositories Status ####################
    All 1 repos were migrated successfully to ACK One ccc47****** !
    STATE    REPO                                     									TYPE  NAME              MESSAGE
    Succeed  https://github.com/AliyunContainerService/gitops-demo.git  git 
    
    #################### Applications Status ####################
    -------------------- Git/Helm Applications --------------------
    Total 'Git/Helm' type applications: 1, success to migrate: 0, pending to migrate: 1
    STATE    NAME       NAMESPACE  CLUSTER  STATUS  HEALTH  REPO  PATH  TARGET  MESSAGE
    Pending  app-git-2  argocd                                                  application has not been migrated to ACK One ccc47******
    
    -------------------- Template Applications --------------------
    STATE    NAME            NAMESPACE  TEMPLATEID                            TEMPLATEPATH  MESSAGE

步骤四:迁移应用

  1. onectl支持同时迁移一个或多个应用,也支持同时迁移所有应用,具体方式建议您根据自身情况进行选择。

    迁移所有应用

    执行以下命令,迁移所有应用。

    onectl migrate apps -n argocd --all

    预期输出:

    Applications in source cluster (ArgoCD or AppCenter cluster):
    NAME            NAMESPACE  TYPE      TEMPLATEID
    app-git-2       argocd     Git/Helm  
    will be migrated to ACK One ccc47******. Please checking the source cluster and ACK One cluster. Are you sure to migrate the Applications? [Y/n] y
    
    Total 1 applications will be migrated to ACK One ccc47****** ...
    -------------------- Git/Helm Applications --------------------
    Application argocd/app-git-2 was migrated succeessfully.
    All 1 'Git/Helm' type applications has been migrated successfully o ACK One ccc47******.
    STATE    NAME       NAMESPACE  CLUSTER                     STATUS  HEALTH   REPO                                     PATH                        TARGET  MESSAGE
    Succeed  app-git-2  argocd     https://172.16.**.**:6443  Synced  Healthy  git@github.com:**/gitops-demo.git  manifests/helm/echo-server  main    
    
    -------------------- Template Applications --------------------
    No 'Template' type applications need to be migrated.

    迁移一个或多个应用

    执行以下命令,迁移一个或多个应用。

    onectl migrate apps ${app1Name} -n argocd  
    # 将${app1Name}替换为您需要迁移的应用名称。

    预期输出:

    Applications in source cluster (ArgoCD or AppCenter cluster):
    NAME       NAMESPACE  TYPE      TEMPLATEID
    app-git-2  argocd     Git/Helm  
    will be migrated to ACK One ccc47******. Please checking the source cluster and ACK One cluster. Are you sure to migrate the Applications? [Y/n] y
    
    Total 1 applications will be migrated to ACK One ccc47****** ...
    -------------------- Git/Helm Applications --------------------
    Application argocd/app-git-2 was migrated succeessfully.
    All 1 'Git/Helm' type applications has been migrated successfully o ACK One ccc47ca148d0147519f229bbaea2963b6.
    STATE    NAME       NAMESPACE  CLUSTER                     STATUS  HEALTH   REPO                                     PATH                        TARGET  MESSAGE
    Succeed  app-git-2  argocd     https://172.16.**.**:6443   Synced  Healthy  git@github.com:**/gitops-demo.git  manifests/helm/echo-server  main    
    
    -------------------- Template Applications --------------------
    No 'Template' type applications need to be migrated.
  2. 在应用中心主控集群中执行以下命令,需要以非级联的方式移除自建ArgoCD中的Application资源,以确保不影响实际业务的运行。

    kubectl --kubeconfig ${ARGOCD_CLUSTER_KUBECONFIG_PATH} delete app ${appName}  -n argocd --cascade=false
    说明

    必须使用参数--cascade=false,否则在移除应用时,实际运行在目标集群中的K8s资源会随之被移除。

FAQ

向ACK One GitOps添加的Repo的CONNECTION STATUSFailed

  1. 连接到ACK One Fleet实例,并执行以下命令查看日志。

    kubectl -nargocd get pod
    
    kubectl -nargocd logs argocd-server-xx -c argocd-repo-server

    如果日志中出现context deadline exceeded (Client.Timeout exceeded while awaiting headers)相关信息,则可能是由于网络不通导致的。建议确认ACK One Fleet实例是否具有访问外网的能力。

  2. 确认VPC是否创建了公网NAT网关。

    1. 登录ACK One控制台,在左侧导航栏选择舰队 > 舰队信息

    2. 单击基础信息页签,找到虚拟专有网络VPC,单击右侧对应的VPC进入详情页。

    3. 专有网络详情页面,单击资源管理页签,查看公网访问服务

argocd-server中主要Container有哪些?

Container名称

说明

argocd-server

ArgoCD的API Server,用于暴露API给Web UI、CLI和CI/CD系统使用。

argocd-application-controller

是一个K8s Controller,用于协调集群中的Application和Project资源,并同步Application状态(从Git中同步到K8s集群中)。

argocd-applicationset-controller

用于协调集群中的ApplicationSet资源,ApplicationSet用于给多个集群分发应用。

argocd-repo-server

与Git仓库交互,并生成和返回Kubernetes manifests。

redis

主要用来为ArgoCD提供缓存层,减少发送到K8s的API Server和Git服务器的请求。

dex

ArgoCD依赖Dex来实现与外部OIDC提供商的身份验证。也可以使用其他工具代替Dex。

argocd-image-updater

用来检测被ArgoCD管理的K8s Workload(如Deployment)的容器镜像变化,并自动将其更新至最新版本。