全部產品
Search
文件中心

Container Service for Kubernetes:自建ArgoCD遷移至ACK One GitOps

更新時間:Nov 21, 2024

本文介紹如何將自建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對其進行管理。

前提條件

步驟一:配置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 Gateway。

    1. 登入ACK One控制台,在左側導覽列選擇艦隊 > 艦隊資訊

    2. 單擊基礎資訊頁簽,找到Virtual Private Cloud絡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)的容器鏡像變化,並自動將其更新至最新版本。