如何将GitLab CI中的动态Helm部署迁移至ArgoCD?
从GitLab CI Helm部署迁移到ArgoCD适配方案
一、先拆解原部署逻辑
你的GitLab CI部署命令核心逻辑是:
- 拉取Helm仓库,加载基础配置
values.yaml+ 应用专属配置projects/${PROJECT}.yaml - 通过
--set传入动态参数:镜像地址、版本、内外网域名 - 以
${TARGET}-${PROJECT}为发布名,执行10分钟超时的原子化升级
二、ArgoCD适配步骤
方案1:单应用手动配置(适合少量应用)
1. 编写ArgoCD Application配置文件
针对每个应用(比如apigateway),创建对应ArgoCD应用配置,替换原CI中的变量:
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: test-apigateway # 对应原${TARGET}-${PROJECT} namespace: argocd spec: project: default # 替换为你的ArgoCD项目名 source: repoURL: "http://companygitlab/devops/helm.git" # 你的Helm仓库地址 targetRevision: main # 对应仓库分支 path: ./helm # Chart所在路径 helm: # 对应原helm命令的-f参数加载values文件 valueFiles: - values.yaml - projects/apigateway.yaml # 对应原--set参数的动态配置 parameters: - name: image.repository value: "registry.company.com/apigateway" # 原${DOCKER_IMAGE_URI} - name: appVersion value: "abc123" # 原${CI_COMMIT_SHORT_SHA} - name: ingress.hosts[0].host value: "apigw-internal.company.com" # 原${DOMAIN_PRIVATE} - name: ingress.hosts[1].host value: "apigw.company.com" # 原${DOMAIN_PUBLIC} destination: server: "https://kubernetes.default.svc" # 目标K8s集群地址 namespace: test-apigateway-ns # 应用部署的命名空间,可自动创建 syncPolicy: # 对应原--atomic的原子化同步,失败自动回滚 automated: prune: true # 自动清理不再需要的资源 selfHeal: true # 集群状态偏离时自动修复 syncOptions: - CreateNamespace=true # 自动创建目标命名空间 - Timeout=600 # 对应原--timeout 10m0s retry: limit: 2 # 同步失败重试次数 backoff: duration: 5s factor: 2 maxDuration: 30s
2. 修改GitLab CI流程
替换原helm upgrade步骤,改为生成并应用ArgoCD配置:
# 1. 生成ArgoCD Application配置文件 - | cat > argocd-app-${PROJECT}.yaml << EOF apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: ${TARGET}-${PROJECT} namespace: argocd spec: project: default source: repoURL: "http://companygitlab/devops/helm.git" targetRevision: main path: ./helm helm: valueFiles: - values.yaml - projects/${PROJECT}.yaml parameters: - name: image.repository value: ${DOCKER_IMAGE_URI} - name: appVersion value: ${CI_COMMIT_SHORT_SHA} - name: ingress.hosts[0].host value: ${DOMAIN_PRIVATE} - name: ingress.hosts[1].host value: ${DOMAIN_PUBLIC} destination: server: "https://kubernetes.default.svc" namespace: ${TARGET}-${PROJECT}-ns syncPolicy: automated: prune: true selfHeal: true syncOptions: - CreateNamespace=true - Timeout=600 EOF # 2. 安装ArgoCD CLI(如果CI环境未预装) - curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64 - chmod +x argocd-linux-amd64 - mv argocd-linux-amd64 /usr/local/bin/argocd # 3. 登录ArgoCD并同步应用 - argocd login ${ARGOCD_SERVER} --username ${ARGOCD_USER} --password ${ARGOCD_PASSWORD} --insecure - argocd app sync ${TARGET}-${PROJECT} --force
方案2:ApplicationSet批量管理(适合多应用场景)
如果需要批量管理projects目录下的所有应用,用ArgoCD ApplicationSet自动生成配置:
apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: helm-projects-appset namespace: argocd spec: generators: # 从Helm仓库的projects目录读取所有yaml文件,自动生成应用 - git: repoURL: http://companygitlab/devops/helm.git revision: main files: - path: "projects/*.yaml" template: projectName: "{{ .path.basename | trimSuffix \".yaml\" }}" template: metadata: name: "prod-{{ .projectName }}" # 这里prod对应原${TARGET},可根据环境调整 spec: project: default source: repoURL: http://companygitlab/devops/helm.git targetRevision: main path: ./helm helm: valueFiles: - values.yaml - projects/{{ .projectName }}.yaml # 动态参数可结合ArgoCD Image Updater自动更新镜像版本 parameters: - name: ingress.hosts[0].host value: "{{ .projectName }}-internal.company.com" - name: ingress.hosts[1].host value: "{{ .projectName }}.company.com" destination: server: https://kubernetes.default.svc namespace: "prod-{{ .projectName }}-ns" syncPolicy: automated: prune: true selfHeal: true syncOptions: - CreateNamespace=true - Timeout=600
三、优化建议
- 镜像版本自动更新:使用ArgoCD Image Updater组件,无需在CI中传入
CI_COMMIT_SHORT_SHA,自动检测镜像仓库的新标签并同步 - 环境隔离:不同环境(如test/prod)可创建独立的ArgoCD项目,或者在ApplicationSet中通过分支/目录区分环境配置
- 权限控制:给ArgoCD的ServiceAccount配置最小化权限,避免过度授权
- 同步验证:开启ArgoCD的健康检查和自动同步,确保应用状态符合预期
内容的提问来源于stack exchange,提问作者lagrance
相关产品推荐
相关产品推荐

