本文介绍如何将自建ArgoCD主控集群迁移至分布式云容器平台 ACK One。
概述
在自建ArgoCD环境迁移到ACK One GitOps时,由于涉及的集群、仓库和应用数量较多,手动逐个迁移耗时较长。因此,我们提供了onectl命令以支持快速将其迁移至ACK One。架构如下所示:
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对其进行管理。
前提条件
已开通分布式云容器平台ACK One。并开启多集群管理功能。具体操作,请参见开启舰队管理功能。
如果是IDC集群,请先将IDC集群接入注册集群。具体操作,请参见创建注册集群。
已在Fleet实例中开启GitOps功能,并通过ArgoCD CLI登录系统。具体操作,请参见GitOps快速入门。
步骤一:配置onectl RAM用户
RAM用户登录后,才能将自建ArgoCD应用中心的应用迁移到ACK One GitOps,onectl将使用该用户的AK和SK访问阿里云资源。因此,阿里云账号需要对RAM用户授予以下相关权限。
授予AliyunAdcpFullAccess权限。具体操作,请参见为RAM用户授予系统权限策略。
授予AliyunCSReadOnly权限,或添加ACK Template权限,ACK Template权限策略内容如下。
{ "Action": [ "cs:DescribeTemplates", "cs:DescribeTemplateAttribute", "cs:DescribeClusterUserKubeconfig" ], "Resource": [ "*" ], "Effect": "Allow" }
授予自建ArgoCD集群的管理员权限。具体操作,请参见授予集群RBAC。
执行以下命令,配置onectl RAM用户的AK、SK信息,仅需配置
Access Key Id
和Access 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.
步骤二:迁移集群
为了简化迁移命令,需要将ACK One Fleet实例的ID和应用中心主控集群的ID设置为环境变量,onectl会根据
clusterid
自动获取两者KubeConfig,保存在~/.onectl/
目录下。export ACKONE_HUB_CLUSTER_ID=ccc47ca148d0147519f229bba******** export ARGOCD_CLUSTER_ID=ce4bb2004bb0e409eaa4c593d********
可通过以下两种方式迁移集群。
方式一:通过ACK One控制台将自建ArgoCD环境的子集群(非主控集群)关联至ACK One Fleet实例。
方式二:通过onectl命令行迁移集群。
给自建ArgoCD主控集群中所有的Cluster Secret(s)添加标签
ack_cluster_id: <your ack cluster id>
,以指定其所对应的ACK集群。可以通过自建ArgoCD UI或kubectl修改Secret。执行以下onectl命令,将自建ArgoCD主控集群中集群迁移到ACK One GitOps。
onectl migrate clusters -n argocd
说明如果您在自建ArgoCD环境中已对Cluster Secret(s)添加
label
或者annotation
,可在本步骤完成后在ACK One GitOps的ArgoCD UI上进行添加。
步骤三:迁移Git仓库
执行以下命令,将应用中心主控集群中的仓库迁移到ACK One GitOps。
onectl migrate repos -n argocd
执行以下命令,查看某一类或所有类资源状态。
#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
步骤四:迁移应用
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.
在应用中心主控集群中执行以下命令,需要以非级联的方式移除自建ArgoCD中的Application资源,以确保不影响实际业务的运行。
kubectl --kubeconfig ${ARGOCD_CLUSTER_KUBECONFIG_PATH} delete app ${appName} -n argocd --cascade=false
说明必须使用参数
--cascade=false
,否则在移除应用时,实际运行在目标集群中的K8s资源会随之被移除。
FAQ
向ACK One GitOps添加的Repo的CONNECTION STATUS
为Failed
。
连接到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实例是否具有访问外网的能力。确认VPC是否创建了公网NAT网关。
登录ACK One控制台,在左侧导航栏选择 。
单击基础信息页签,找到虚拟专有网络VPC,单击右侧对应的VPC进入详情页。
在专有网络详情页面,单击资源管理页签,查看公网访问服务。
argocd-server中主要Container有哪些?
Container名称 | 说明 |
| ArgoCD的API Server,用于暴露API给Web UI、CLI和CI/CD系统使用。 |
| 是一个K8s Controller,用于协调集群中的Application和Project资源,并同步Application状态(从Git中同步到K8s集群中)。 |
| 用于协调集群中的ApplicationSet资源,ApplicationSet用于给多个集群分发应用。 |
| 与Git仓库交互,并生成和返回Kubernetes manifests。 |
| 主要用来为ArgoCD提供缓存层,减少发送到K8s的API Server和Git服务器的请求。 |
| ArgoCD依赖Dex来实现与外部OIDC提供商的身份验证。也可以使用其他工具代替Dex。 |
| 用来检测被ArgoCD管理的K8s Workload(如Deployment)的容器镜像变化,并自动将其更新至最新版本。 |