GitOps FAQ

本文介绍使用GitOps时的常见问题及解决方案。

GitOps如何连接私有Git仓库?

私有Git仓库通常因安全问题无法开通公网访问,因此使用ACK One GitOps连接私有Git仓库时,需解决网络连通问题,并完成相关配置。

步骤一、配置域名解析,使GitOps可访问私有Git仓库

以下以Git仓库域名git.abc.cn为例进行配置。

  1. 连通云下和云上ACK One VPC网络。连接方式,请参见连接本地IDC和云上VPC

  2. 使用内网DNS解析来实现VPC内域名解析。

    1. 登录云解析 DNS控制台,在内网DNS解析 (PrivateZone)页面单击用户域名页签,然后单击添加域名(Zone),在弹出的面板中配置以下参数,单击确定

      • 内置权威域名 (Zone)abc.cn(以Git仓库域名git.abc.cn为例)

      • 子域名递归解析代理开启

      • 域名生效范围 > 阿里云VPC内网:选择ACK One绑定的VPC

    2. 在域名列表中找到刚刚创建的PrivateZone,在其操作列单击解析记录,进入解析记录页面。

    3. 解析记录页面单击添加记录,在弹出的面板中配置以下参数,然后单击确定

      • 记录类型A

      • 主机记录git(以Git仓库域名git.abc.cn为例)

      • 记录值:填写内部Git仓库的IP地址

步骤二、通过控制台或CLI连接Git仓库

域名解析配置完成后,ACK One GitOps就可以访问到对应的私有Git仓库,您可以通过GitOps控制台/CLI连接Git仓库,用于发布应用。具体操作请参见Private Repositories

GitOps控制台上的Applications如何展示分组?

Applications数量较多时,分组展示可提升使用体验。在GitOps控制台左侧菜单栏,您可以:

  • Favorites OnlySYNC STATUSHEALTH STATUS筛选;

  • LABELSPROJECTSCLUSTERSNAMESPACESAUTO SYNC分组展示。

image

运维人员如何控制应用发布?

在应用发布过程中,尤其在自动化CI/CD流水线中,往往需要控制发布,您可以通过以下方式进行控制:

  • 使用ManualSync模式的应用。运维人员在代码推送后,检查和确认应用是否符合要求,符合要求后手动点击Sync同步应用到目标集群。

  • 修改应用部署仓库中的镜像版本:在非自动化监测镜像仓库镜像变化时,运维人员需要对镜像进行确认。确认无误后,可以手动修改应用部署仓库中的镜像版本,以自动触发ArgoCD的应用同步。

  • 建立code review机制:在自动化CI/CD流水线中,对业务代码仓库建立code review机制。运维人员code review通过后合并代码,自动触发CI build&push镜像,ArgoCD自动监测镜像变更,并自动发布到配置AutoSync的环境,您也可以手动发布到ManualSync的环境。

AgroCDrepo-server出现Out of diskspace报错怎么办?

问题现象

通过kubectl -nargocd logs xxxx命令查看日志,看到repo-server出现如下报错信息:

'git checkout --force xxx' failed exit status 128: error: unable to write file templates/deployment.yaml\nfat al: sha1 file '/tmp/_argocd-repo/xxx/.git/index.lock' write error. Out of diskspace...

解决方案

该问题是.git/index.lock 文件写入失败是由于磁盘空间不足引起的,可通过增加ACK One GitOps ArgoCD组件的Pod的临时存储来解决。当前ACK One GitOps ArgoCD组件使用ECI运行,默认具有30GiB的临时存储空间,增加临时存储空间的步骤如下,具体费用请参见临时存储空间计费

  1. ACK One控制台获取舰队实例的KubeConfig,并通过Kubectl连接至舰队实例。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群

  2. 在对应DeploymentPod Template中,为Pod添加annotation k8s.aliyun.com/eci-extra-ephemeral-storage: "20Gi",其中临时存储空间大小可自定义。

    • 如果GitOps处于默认模式,在Deployment argocd-server中添加。

      kubectl edit deployment -nargocd argocd-server
    • 如果GitOps处于高可用模式,在Deployment argocd-dex-imageupdate-repo-server中添加。

      kubectl edit deployment -nargocd argocd-dex-imageupdate-repo-server
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      ...
    ...
    spec:
      template:
        metadata:
          annotations:
            # 在默认30GiB的基础上增加20GiB,共50GiB。增加的临时存储空间大小可自定义。
            k8s.aliyun.com/eci-extra-ephemeral-storage: "20Gi"
          ...
        ...
      ...

如何避免GitOps Application跟踪到非应用资源?

背景信息

Argo CD使用labelapp.kubernetes.io/instance来追踪K8s资源,当资源有这个label,并且值和Application Name一致,就会被Application追踪到,造成应用的状态一直处于OutOfSync,也可能会一直删除这个非应用资源,为了避免这类非预期行为,有以下两种解决方案。

解决方案

  • 方案1:在舰队的argocd/argocd-cm中添加resource.exclusions来忽略被追踪到的非应用资源,如下配置可忽略CiliumIdentity资源。

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
  labels:
    app.kubernetes.io/name: argocd-cm
    app.kubernetes.io/part-of: argocd
data:
  ...
  resource.exclusions: |
    - apiGroups:
      - cilium.io
      kinds:
      - CiliumIdentity
      clusters:
      - "*"
  • 方案2:在舰队的argocd/argocd-cm中添加自定义标签application.instanceLabelKey: argocd.argoproj.io/instance。添加后,使用Argo CD下发的应用的资源则会包含labelargocd.argoproj.io/instance,从而不会追踪到仅有labelapp.kubernetes.io/instance的资源。配置生效后,现有的Application状态可能显示为OutOfSync

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: argocd-cm
      labels:
        app.kubernetes.io/name: argocd-cm
        app.kubernetes.io/part-of: argocd
    data:
      ...
      application.instanceLabelKey: argocd.argoproj.io/instance

修改Argo CD ConfigMap后如何重启相应的Argo CD组件?

Argo CD中,修改ConfigMap后,可能需要重启对应的Argo CD组件才能生效。

以下是可能较多修改的几个configmap:

配置项

说明

是否需要重启Argo CD组件

argocd-cm

用于配置自定义OIDC、自定义访问urlLocal User等。

通常无需重启Argo CD组件,如发现配置未生效可以重启argocd-server。

argocd-cmd-params-cm

用于配置Argo CD各组件的环境变量。

需要重启相应组件或argocd-server生效。

argocd-rbac-cm

用于配置Argo CDRBAC权限。

通常无需重启组件。

argocd-image-updater-config

用于管理 image-updater相关配置。

需要重启相应组件或argocd-server生效。

argocd-notifications-cm

用于管理argocd-notification-controller相关配置。

需要重启相应组件或argocd-server生效。

说明

ACK One GitOps2种模式:

  1. 默认模式:所有组件都在1Deployment中。如需重启,则需要重启argocd-server。

  2. 高可用模式:组件分布在以下几个Deployment,如需重启,可以单独重启相应组件。

    1. argocd-server。

    2. argocd-application-controller:包含application-controllerapplicationset-controller。

    3. argocd-repo-server。

    4. argocd-dex-imageupdate-notification:包含image-updater、notification-controller、dex。

    5. argocd-redis。

您需要通过以下步骤对组件进行重启:

  1. 多集群GitOps页面的GitOps折叠块部分找到Argo CD 组件

  2. 单击Argo CD 组件后的重启

  3. 在弹出框中的选择待重启应用下拉框选择需要重启的组件名称,例如argocd-server,单击确定

ApplicationSet使用git generator时,不支持变更Git仓库目录吗?

问题现象

在使用Argo CD ApplicationSetGit生成器(Git Generator)时,当Git仓库中新增或重命名了被生成器所依赖的目录后,即便立即更新ApplicationSet资源指向新的目录路径,有时也无法触发预期的Application资源的创建。

解决方案

该问题是Argo CD在变更目录名后不会自动更新缓存导致。如果您需要修改目录名,可以在包含Git生成器的ApplicationSet上添加一个注解来解决此问题:argocd.argoproj.io/application-set-refresh="true"。示例如下:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  ···
  annotations:
    ···
    argocd.argoproj.io/application-set-refresh: "true"
spec:
  ···
  generators:
    - git:
        ···     
  template:
    ···