本文介绍使用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地址
完成配置后,ACK One GitOps可以访问到上面配置的私有Git仓库,您可以通过GitOps控制台/CLI连接仓库,用于发布应用。
步骤二、通过控制台或CLI连接Git仓库
域名解析配置完成后,ACK One GitOps就可以访问到对应的私有Git仓库,您可以通过GitOps控制台/CLI连接Git仓库,用于发布应用。具体操作,请参见Private Repositories。
GitOps控制台上的Applications如何展示分组?
当GitOps控制台上的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...
解决方案
该问题可通过增加ACK One GitOps ArgoCD组件的Pod的临时存储来解决。
当前ACK One GitOps ArgoCD组件使用ECI运行,默认具有30GiB的临时存储空间,增加临时存储空间的步骤如下,具体费用请参见临时存储空间计费。
从ACK One控制台获取舰队实例的KubeConfig,并通过Kubectl连接至舰队实例。具体操作,请参见通过kubectl连接Kubernetes集群。
在对应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