本文介绍使用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地址

    完成配置后,ACK One GitOps可以访问到上面配置的私有Git仓库,您可以通过GitOps控制台/CLI连接仓库,用于发布应用。

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

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

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

当GitOps控制台上的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的环境。

AgroCD的repo-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...

解决方案

该问题可通过增加ACK One GitOps ArgoCD组件的Pod的临时存储来解决。

当前ACK One GitOps ArgoCD组件使用ECI运行,默认具有30GiB的临时存储空间,增加临时存储空间的步骤如下,具体费用请参见临时存储空间计费

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

  2. 在对应Deployment的Pod 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