首页 > 其他分享 >[成] ArgoCD + "ArgoCD Image Updater小工具" 实现镜像仓库tag变更自动触发持续集成

[成] ArgoCD + "ArgoCD Image Updater小工具" 实现镜像仓库tag变更自动触发持续集成

时间:2024-10-12 17:22:06浏览次数:1  
标签:ArgoCD Image argocd yaml tag updater 镜像 image

部署思路踩坑整理

  • ArgoCD和ArgoCD Image Updater是2个不同的程序。"ArgoCD Image Updater小工具"没有集成在ArgoCD中需要单独部署。

    单独的ArgoCD能够实现基于git仓库变更作为应用部署的事实来源 [参考子页:argocd根据镜像tag变化实现自动发布的2种方式];

  • ArgoCD +"ArgoCD Image Updater小工具"能够实现以镜像仓库中镜像tag变更作为应用部署的事实来源。
  • ArgoCD Image Updater小工具"部署略显繁琐,并不只是apply官方提供的yaml让pod运行就可以了,需要打通和argocd的认证操作。
  • ArgoCD 或"ArgoCD Image Updater小工具"按照官方提供的install.yaml 部署后,如果修改其中的cm或者参数,不要采取在原yaml修改后再提交的方式,应该 用命令修改。因为yaml太长太复杂了!
  • 配置了回写时,ArgoCD Image Updater 并不会直接修改git仓库yaml 文件的tag,而是会创建一个.开头的yaml 文件(此例为".argocd-source-dev-smart-doc.yaml

    "),每次更新都会覆盖此文件的images内容。

  • 其它
    • argocd 配置gitlab,http用户名密码方式可以实现认证并回写。
    • harbor公开仓库配置的时候不需要用户名和密码,可以使用http请求。
    • "ArgoCD Image Updater小工具"会每隔2分钟检索配置的镜像仓库是否有新的镜像需要拉取部署,但是UI页面刷新会有延时,如果要看最新的状态需要点击下"REFRESH"按钮。 

ArgoCD + "ArgoCD Image Updater小工具" 部署步骤:

1、安装ArgoCD

# kubectl create namespace argocd
# kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

   

安装 Argo CD CLI 命令行工具

要与 Argo CD API Server 进行交互,我们需要安装 CLI 命令:

# wget https://github.com/argoproj/argo-cd/releases/download/v1.7.10/argocd-linux-amd64

或者用win访问 https://github.com/argoproj/argo-cd/releases 选择合适的版本下载 argocd-linux-amd64 文件

# cp argocd-linux-amd64 /usr/local/bin/argocd

# chmod +x /usr/local/bin/argocd

# argocd version:

   

修改密码:

方法一:登录argocd UI 会强制修改密码。

方法二: 使用CLI工具修改默认密码

参考:https://www.cnblogs.com/hahaha111122222/p/17462812.html

   

2、部署"ArgoCD Image Updater小工具"(部署略显繁琐)

官方文档: https://argocd-image-updater.readthedocs.io/en/stable/

==================== 2.1、在argocd中创建本地用户并为用户创建访问令牌 ======================

# kubectl -n argocd edit cm argocd-cm

data:

accounts.image-updater: apiKey

   

##打开后没有data字段,在最后顶格补入以上字段。注意:apiKey中的K为大写!!!

##修改保存后,再查看格式大概如下,验证多了data字段

=================== 2.1.1 为用户创建访问令牌,保存备用(下面配置API访问令牌秘钥会用到此处生成的令牌)===============

用argocd命令登录认证argocd(地址为argocd-server SVC暴露的端口),需要交互输入y,忽略tls证书。

# argocd login 10.244.10.55:15471 --username admin --password argocd123

WARNING: server certificate had error: tls: failed to verify certificate: x509: cannot validate certificate for 10.244.10.55 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y

'admin:login' logged in successfully

Context '10.244.10.55:15471' updated

   

执行下面命令的前提是上面已经用argocd命令登录了argocd

# argocd account generate-token --account image-updater --id image-updater

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJpbWFnZS11cGRhdGVyOmFwaUtleSIsIm5iZiI6MTcyODUyNDUyMCwiaWF0IjoxNzI4NTI0NTIwLCJqdGkiOiJpbWFnZS11cGRhdGVyIn0.QecneA-yvcbU7Eoyi8egWwiAxN4zrf9FCWJXPeu0ick

   

=================== 2.2、在Argo CD中授予RBAC权限 =====================

# kubectl -n argocd edit cm argocd-rbac-cm

data:

policy.default: role:readonly

policy.csv: |

p, role:image-updater, applications, get, */*, allow

p, role:image-updater, applications, update, */*, allow

g, image-updater, role:image-updater

   

##打开后没有data字段,在最后顶格补入以上字段。

##修改保存后,再查看验证多了data字段。

================= 2.3、安装Argo CD Image Update =====================

建议在运行 Argo CD 的同一个 Kubernetes 命名空间集群中运行 Argo CD Image Updater,但这不是必需的。事实上,甚至不需要在 Kubernetes 集群中运行 Argo CD Image Updater 或根本不需要访问任何 Kubernetes 集群。但如果不访问 Kubernetes,某些功能可能无法使用,所以强烈建议使用第一种安装方法。

运行镜像更新程序的最直接方法是将其作为 Kubernetes 工作负载安装到运行 Argo CD 的命名空间中。这样就不需要任何配置,也不会对你的工作负载产生任何影响。

# kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml

或者地址:https://github.com/argoproj-labs/argocd-image-updater/tree/master/manifests

   

================= 2.4、配置镜像仓库(此例为harbor,之前ecr有过实践) ===============

即使您不打算使用私有镜像仓库,您也需要至少配置一个empty registries.conf:

   

# kubectl -n argocd edit cm argocd-image-updater-config

data:

registries.conf: ""

   

##没有此条目argocd-image-updater pod将无法启动。

   

如果使用私有镜像仓库可参考以下配置,以harbor镜像仓库为例:

   

data:

argocd.insecure: "true"

log.level: debug

registries.conf: |

registries:

- name: harbor

api_url: http://reg1.ka.zkj.com

prefix: reg1.ka.zkj.com

ping: yes

insecure: yes

   

##打开后没有data字段,在最后顶格补入以上字段。

##修改保存后,再查看验证多了data字段。如果url是域名要保证k8s中能够解析到ip。

   

================= 2.5、配置API访问令牌秘钥 ============

根据上面生成的令牌设置变量

#YOUR_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJpbWFnZS11cGRhdGVyOmFwaUtleSIsIm5iZiI6MTcyODUyNDUyMCwiaWF0IjoxNzI4NTI0NTIwLCJqdGkiOiJpbWFnZS11cGRhdGVyIn0.QecneA-yvcbU7Eoyi8egWwiAxN4zrf9FCWJXPeu0ick

   

创建并应用于现有资源,特别注意:命令中的命名空间要修改为服务实际部署的NS

# kubectl create secret generic argocd-image-updater-secret \

> --from-literal argocd.token=$YOUR_TOKEN --dry-run -o yaml |

> kubectl -n argocd apply -f -

W1010 09:48:58.532655 3478 helpers.go:703] --dry-run is deprecated and can be replaced with --dry-run=client.

secret/argocd-image-updater-secret configured

   

更改后必须重启服务

# kubectl -n argocd rollout restart deployment argocd-image-updater

deployment.apps/argocd-image-updater restarted

   

   

3、在gitlab仓库中建立编排文件

   

说明:gitlab仓里有4个文件。

回写文件

.argocd-source-dev-smart-doc.yaml 是argocd 回写后的文件,这个是argocd image updater 应用建立后才会生成的!

编排文件:

dp-smart-doc.yaml

svc-smart-doc.yaml

Kustomize工具文件:

kustomization.yaml

   

---------文件内容如下 -------------------

kustomization.yaml

1     namePrefix: kustomize-
2     apiVersion: kustomize.config.k8s.io/v1beta1
3     kind: Kustomization
4     resources:
5     - dp-smart-doc.yaml
6         - svc-smart-doc.yaml

 

------------------------------------

dp-smart-doc.yaml

 1     apiVersion: apps/v1
 2     kind: Deployment
 3     metadata:
 4       name: smart-doc
 5       namespace: wa
 6       labels:
 7         group: service
 8     spec:
 9       replicas: 1
10       selector:
11         matchLabels:
12           app: smart-doc
13           tier: backend
14       template:
15         metadata:
16           annotations: {}
17           labels:
18             app: smart-doc
19             tier: backend
20         spec:
21           nodeSelector:
22             smart: "true"
23           dnsPolicy: ClusterFirst
24           containers:
25             - image: reg1.ka.zkj.com/dev/smart-doc:v1.241008-68-002
26               imagePullPolicy: IfNotPresent
27               name: smart-wealth
28               ports:
29                 - containerPort: 9800
30               #command: ["sleep","10000"]
31               env:
32                 - name: TZ
33                   value: Asia/Shanghai
34               resources:
35                 limits:
36                   cpu: 1000m
37                   memory: 4Gi
38                 requests:
39                   cpu: 1000m
40                   memory: 4Gi
41               volumeMounts:
42                 - mountPath: /logs/smart-doc
43                   name: smart-doc
44           terminationGracePeriodSeconds: 60
45           volumes:
46             - hostPath:
47                 path: "/home/zkj/wealth/logs/smart-doc"
48                 type: DirectoryOrCreate
49           name: "smart-doc"

 

-----------------------------

svc-smart-doc.yaml

 1     apiVersion: v1
 2     kind: Service
 3     metadata:
 4       name: smart-doc
 5       namespace: wa
 6     spec:
 7       type: NodePort
 8       ports:
 9         - port: 9800
10           targetPort: 9800
11           nodePort: 48528
12       selector:
13         app: smart-doc
14     tier: backend

 

   4、登录argocd UI,建立argocd应用。

   

4.1 首先setting一个gitlab仓库地址,填入箭头所指的内容。

   

因为gitlab地址是http的,千万别忘了勾选忽略https验证。

   

4.2 创建一个app,Applications -- +NEW APP -- EDIT AS YAML --清空后贴如如下内容(此文件支持注释):

 

 1     apiVersion: argoproj.io/v1alpha1
 2     kind: Application
 3     metadata:
 4       annotations:
 5         argocd-image-updater.argoproj.io/image-list: myalias=reg1.ka.zkj.com/dev/smart-doc   # harbor镜像仓库地址
 6         argocd-image-updater.argoproj.io/myalias.allow-tags: regexp:^.*$                     # tag的正则表达
 7         argocd-image-updater.argoproj.io/myalias.update-strategy: latest                     # 镜像更新策略,详见下节应用文件配置项注释
 8         argocd-image-updater.argoproj.io/write-back-method: git                              # 回写的对象
 9         argocd-image-updater.argoproj.io/git-branch: master                                  # 仓库分支
10         argocd-image-updater.argoproj.io/myalias.force-update: "true"                        # 是否强制更新
11       name: dev-smart-doc                                                                    # Argo CD 应用程序的名称
12       namespace: argocd                                                                      # argocd部署的命名空间,注意不是程序的!
13       #finalizers:
14         #- resources-finalizer.Argo CD.argoproj.io
15     spec:
16       destination:                                                                           # Kubernetes 集群中的目标
17         namespace: wa                                                                        # 被部署app的命名空间
18         server: https://kubernetes.default.svc
19       project: default                                                   # 应用程序将被配置的项目名称,这是在 Argo CD 中应用程序的一种组织方式
20       source:
21         path:  dev/smart-doc                                             # Kubernetes 资源清单在仓库中的路径。
22         repoURL: http://10.244.8.185:30080/CD/wealth-helper.git          # gitlab源代码的仓库地址。
23         targetRevision: master                                           # 想要使用的 git 分支。
24       syncPolicy:                 # 指定自动同步策略和频率,不配置时需要手动触发同步。
25         automated:
26           prune: true             # 默认情况下,当 Argo CD 检测到 Git 中不再定义资源时,自动同步将不会删除该资源。如果要允许打开自动修剪删除设置为: true。
27           selfHeal: true          # 自动自愈
28           allowEmpty: false       # 默认情况下,当没有目标资源时,可以防止应用程序出现空资源。 如果要允许应用程序出现空资源设置为:true。
29         syncOptions:
30         - Validate=false
31         - CreateNamespace=true
32         retry:
33           limit: 5
34           backoff:
35             duration: 5s           # 持续时间
36             factor: 2              
37             maxDuration: 3m        # 最大持续时间

 

-------------------------------------------------

CI执行后会将新构建的应用镜像推送到镜像仓库中去。

然后 Argo CD Image Updater 将会每 2m0s(日志时间戳可以确定[argocd扫描git库的频率是3m不要混了])从镜像仓库去检索镜像版本变化(暂时没有查到在哪能修改这个时间),一旦发现有新的镜像版本,它将自动使用新版本来更新集群内工作负载的镜像,并将镜像版本回写到 Git 仓库。我们可以去查看 Argo CD Image Updater 的日志变化:

# kubectl logs -f argocd-image-updater-78f46ff74-dtb9l -n argocd

。。。。。。

-------------------------------------

4.3、以上4.2应用文件配置项注释

中文官方文档参考: https://argocd.devops.gold/user-guide/auto_sync/

ArgoCD Image Updater 通过 Application Annotations 标签来实现对应的功能,这里注释一下每一个标签的作用。

   

  • argocd-image-updater.argoproj.io/image-list:指定需要监听的镜像,这里的别名非常重要,会影响下面所有的设置。myalias可以用任何字符代替,镜像地址这里不写tag。
  • argocd-image-updater.argoproj.io/update-strategy:指定镜像更新策略。注意,latest 并不代表监听 latest 镜像版本,而是以最新推送的镜像作为更新策略。此外,semver 策略可以识别最高语义化版本的标签,digest 策略可以用来区分同一 Tag 下不同镜像 digest 的变更。

    更新策略。此策略确定 Argo CD Image Updater 如何识别要更新的新镜像版本。目前支持四种方法:'semver'、'latest'、'digest' 和 'name'。

    在查看它们之前,了解 "可变" 和 "不可变" 镜像标记的含义很重要。可变存储库具有可以被新镜像覆盖的标记,而当存储库配置规定标记必须不可被新镜像覆盖时,标记就是不可变的。以下选项假定使用 "不可变" 标记。如果使用了可变标记,则应使用 "digest" 策略。

       

    semver:此策略将应用程序更新到镜像注册表中的最新镜像版本,同时考虑语义版本控制约束(例如,X.Y.Z 格式,其中 X 为主版本、Y 为次版本,Z 为修补版本)。该选项可配置为仅升级到新的次要或修补版本,还支持通过附加配置支持预发布版本。在下面的示例中,应用程序将使用较新的修补版本进行更新,但不会升级到新的次要或主要版本。

    latest:此策略将应用程序更新为具有最新构建日期的镜像。当特定构建具有多个标记时,Argo CD Image Updater 会选择列表中以字母顺序降序排序的最后一个标记。如果只想考虑特定标记,可以使用带有正则表达式的注释。类似地,可以使用注释来忽略标记列表。

    digest:此策略基于注册表中可变标签的更改来更新应用程序。当使用此策略时,将使用镜像摘要来更新应用程序,因此集群上的镜像将显示为 <repository-name>/<image-name>@sha256:<hash>。

    name:此策略根据镜像标签的字母排序并使用列表中排序的最后一个标签来更新应用程序。当使用日期/时间为镜像标记时,可以使用此方法。类似于 "latest" 策略,可以使用正则表达式来考虑特定标记。

       

  • argocd-image-updater.argoproj.io/write-back-method:表示将镜像版本回写到镜像仓库。注意,这里对仓库的写权限来源于使用 argocd repo add 命令为 ArgoCD 配置的仓库访问权限。
  • argocd-image-updater.argoproj.io/<镜像别名>.pull-secret:为不同的镜像别名指定镜像拉取凭据,公开仓库不需要配置。
  • argocd-image-updater.argoproj.io/<镜像别名>.allow-tags:配置符合更新条件的镜像 Tag,在这里我们使用正则表达式匹配那些镜像。

       

下面2个在Kustomize工具时暂时没有用到。

  • argocd-image-updater.argoproj.io/<镜像别名>.helm.image-name:配置 Helm Chart values.yaml 镜像名称所在的节点,在示例应用中,backend.image 和 frontend.image 是values.yaml 配置镜像名称的节点,ArgoCD 在回写仓库时会覆盖这个值。
  • argocd-image-updater.argoproj.io/<镜像别名>.helm.image-tag:配置 Helm Chart values.yaml 镜像版本所在的节点,在示例应用中,backend.tag 和 frontend.tag 是 values.yaml 配置镜像版本的节点,ArgoCD 在回写仓库时将会覆盖这个值。

   

   

=======================================================

综合参考:

https://cloudpods.csdn.net/657807ccb8e5f01e1e447b15.htmlKubeSphere对接ArgoCD

https://kubesphere.io/zh/blogs/kubesphere-argocd/KubeSphere + Argo CD,实现真正的 GitOps!

https://mp.weixin.qq.com/s/cCKYaFCZ513djFfms-d1uA(阳明)使用 Argo CD 进行 GitOps 流水线改造

https://argocd.devops.gold/operator-manual/resource_actions/ Argo CD 中文文档平台工程 Devops

标签:ArgoCD,Image,argocd,yaml,tag,updater,镜像,image
From: https://www.cnblogs.com/golaris/p/18460977

相关文章

  • Armitage:MSF图形界面神器
    原创自然嗨嗨嗨安全免责声明请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者无关。ArmitageArmitage是一款Java写的Metasploit图形界面化的攻击软件,可以用它结合Metasploit中已知的exploit来针对主机存在的漏洞自动化攻击。通过命令行的方式......
  • MySQL命令rebootClusterFromCompleteOutage重启集群注意事项
    rebootClusterFromCompleteOutage()是MySQLShell中的一个实用命令,用于在InnoDB集群遇到完全中断(例如,当组复制在所有成员实例上停止时)后重新配置和恢复集群。这个命令允许你连接到集群中的一个MySQL实例,并使用该实例的元数据来恢复整个集群。在MySQLShell中使用rebootClust......
  • [The 3rd Ucup. Stage 10 West Lake] Generated String
    题意维护一个字符串集合,支持动态插入,动态删除,查询同时具有前缀\(s_1\)与后缀\(s_2\)的串的个数,所有字符串用如下方式给出:先给定一个全局模板串\(S\),每一个字符串都是\(S\)的若干个下标区间对应的字符串拼接而成的。即给出若干个区间\([l_1,r_1],[l_2,r_2],\dots,[l_k,r_k......
  • ArgoCD + ArgoCD Image Updater 部署实现
    部署思路踩坑整理1、ArgoCD和ArgoCDImageUpdater是2个不同的程序。"ArgoCDImageUpdater小工具"没有集成在ArgoCD中需要单独部署。2、单独的ArgoCD能够实现基于git仓库变更作为应用部署的事实来源[参考子页:argocd根据镜像tag变化实现自动发布的2种方式];ArgoCD+"ArgoCD......
  • DATAGERRY REST API身份验证绕过漏洞(CVE-2024-46627)
    0X01产品描述:        ‌DATAGERRY是一个灵活的开源CMDB和资产管理工具,它完全将数据模型的定义留给用户。‌用户只需在一个易于使用的webfrontend中定义自己的对象类型(如服务器、路由器、租赁线路、位置等)。通过DATAGERRY的导出API,存储在DATAGERRY中的CMDB对象可以轻......
  • WPF Image display webp via BitMapImgae BeginInit UriSource EndInit in MVVM
    privatevoidGenenerateBitMapImageViaUrl(stringurl){BitmapImagebmi=newBitmapImage();bmi.BeginInit();bmi.UriSource=newUri(url,UriKind.RelativeOrAbsolute);bmi.EndInit();if(bmi.CanFreeze){bmi.Freeze();}......
  • 鸿蒙初学001-构建第一个ArkTS应用(Stage模型)
    https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/application-dev-guide-V5HarmonyOSSDK介绍:从HarmonyOSNEXTDeveloperPreview1(API11)版本开始,HarmonyOSSDK以Kit维度提供丰富、完备的开放能力,涵盖应用框架、系统、媒体、图形、应用服务、AI六大领域,例如......
  • FreeImage裁剪输出
    #include<iostream>#include"FreeImage.h"bool   SaveToFile(intm_originW,intm_originH,char*FileName,BYTE*pBuf,intnWidth,intnHeight){         FIBITMAP*bitmap=NULL;   FREE_IMAGE_FORMATfif=FIF_JPEG;   int       flag......
  • GeoKR系列--Geographical Knowledge-Driven Representation Learning for Remote Sens
    一、abstract1.绝大多数遥感图像仍未标注,想要充分利用这些未标注的图像,本文提出了一种基于地理知识驱动的表示学习方法,使得提升遥感图像的网络性能+减少对标注数据的需求。2.本文将全球地表覆盖产品和与每张遥感图像相关的地理位置视为地理知识,为了消除遥感图像与地理知识之......
  • The 2023 ICPC Asia Hangzhou Regional Contest (The 2nd Universal Cup. Stage 22: H
    The2023ICPCAsiaHangzhouRegionalContest(The2ndUniversalCup.Stage22:Hangzhou)M.V-Diagram题意:给定一个“v图”,求平均值最大的子"v图"思路:原图的最低点以及左右两个点必须取,如何先取满左边或者右边在贪心即可voidsolve(){lln;cin>>n;vect......