本文介绍使用GitOps时的常见问题及解决方案。
GitOps如何连接私有Git仓库?
私有Git仓库通常因安全问题无法开通公网访问,因此使用ACK One GitOps连接私有Git仓库时,需解决网络连通问题,并完成相关配置。
步骤一、配置域名解析,使GitOps可访问私有Git仓库
以下以Git仓库域名git.abc.cn
为例进行配置。
连通云下和云上ACK One VPC网络。连接方式,请参见连接本地IDC和云上VPC。
使用内网DNS解析来实现VPC内域名解析。
登录云解析 DNS控制台,在内网DNS解析 (PrivateZone)页面单击用户域名页签,然后单击添加域名(Zone),在弹出的面板中配置以下参数,单击确定。
内置权威域名 (Zone):abc.cn(以Git仓库域名
git.abc.cn
为例)子域名递归解析代理:开启
:选择ACK One绑定的VPC
在域名列表中找到刚刚创建的PrivateZone,在其操作列单击解析记录,进入解析记录页面。
在解析记录页面单击添加记录,在弹出的面板中配置以下参数,然后单击确定。
记录类型:A
主机记录:git(以Git仓库域名
git.abc.cn
为例)记录值:填写内部Git仓库的IP地址
步骤二、通过控制台或CLI连接Git仓库
域名解析配置完成后,ACK One GitOps就可以访问到对应的私有Git仓库,您可以通过GitOps控制台/CLI连接Git仓库,用于发布应用。具体操作请参见Private Repositories。
GitOps控制台上的Applications如何展示分组?
当Applications数量较多时,分组展示可提升使用体验。在GitOps控制台左侧菜单栏,您可以:
按Favorites Only、SYNC STATUS、HEALTH STATUS筛选;
按LABELS、PROJECTS、CLUSTERS、NAMESPACES、AUTO SYNC分组展示。
运维人员如何控制应用发布?
在应用发布过程中,尤其在自动化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...
解决方案
该问题是.git/index.lock
文件写入失败是由于磁盘空间不足引起的,可通过增加ACK One GitOps ArgoCD组件的Pod的临时存储来解决。当前ACK One GitOps ArgoCD组件使用ECI运行,默认具有30GiB的临时存储空间,增加临时存储空间的步骤如下,具体费用请参见临时存储空间计费。
从ACK One控制台获取舰队实例的KubeConfig,并通过Kubectl连接至舰队实例。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
在对应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
修改Argo CD ConfigMap后如何重启相应的Argo CD组件?
在Argo CD中,修改ConfigMap后,可能需要重启对应的Argo CD组件才能生效。
以下是可能较多修改的几个configmap:
配置项 | 说明 | 是否需要重启Argo CD组件 |
argocd-cm | 用于配置自定义OIDC、自定义访问 | 通常无需重启Argo CD组件,如发现配置未生效可以重启argocd-server。 |
argocd-cmd-params-cm | 用于配置Argo CD各组件的环境变量。 | 需要重启相应组件或argocd-server生效。 |
argocd-rbac-cm | 用于配置Argo CD的RBAC权限。 | 通常无需重启组件。 |
argocd-image-updater-config | 用于管理 image-updater相关配置。 | 需要重启相应组件或argocd-server生效。 |
argocd-notifications-cm | 用于管理argocd-notification-controller相关配置。 | 需要重启相应组件或argocd-server生效。 |
ACK One GitOps有2种模式:
默认模式:所有组件都在1个Deployment中。如需重启,则需要重启argocd-server。
高可用模式:组件分布在以下几个Deployment,如需重启,可以单独重启相应组件。
argocd-server。
argocd-application-controller:包含application-controller和applicationset-controller。
argocd-repo-server。
argocd-dex-imageupdate-notification:包含image-updater、notification-controller、dex。
argocd-redis。
您需要通过以下步骤对组件进行重启:
在多集群GitOps页面的GitOps折叠块部分找到Argo CD 组件。
单击Argo CD 组件后的重启。
在弹出框中的选择待重启应用下拉框选择需要重启的组件名称,例如argocd-server,单击确定。
ApplicationSet使用git generator时,不支持变更Git仓库目录吗?
问题现象
在使用Argo CD ApplicationSet的Git生成器(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:
···