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

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

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

部署思路踩坑整理

  1. ArgoCD和ArgoCD Image Updater是2个不同的程序。“ArgoCD Image Updater小工具”没有集成在ArgoCD中需要单独部署。
    单独的ArgoCD能够实现基于git仓库变更作为应用部署的事实来源。 参考子页:argocd根据镜像tag变化实现自动发布的2种方式。
  2. ArgoCD +“ArgoCD Image Updater小工具”能够实现以镜像仓库中镜像tag变更作为应用部署的事实来源。
  3. ArgoCD Image Updater小工具”部署略显繁琐,并不只是apply官方提供的yaml让pod运行就可以了,需要打通和argocd的认证等操作。
  4. ArgoCD 或“ArgoCD Image Updater小工具”按照官方提供的install.yaml 部署后,如果修改其中的cm或者参数,不要采取在原yaml修改后再提交的方式,应该 用命令修改。因为yaml太长太复杂了!
  5. 配置了回写时,ArgoCD Image Updater 并不会直接修改git仓库yaml 文件的tag,而是会创建一个.开头的yaml 文件(此例为".argocd-source-dev-smart-doc.yaml"),每次更新都会覆盖此文件的images内容。
  6. 其它
    1. argocd 配置gitlab,http用户名密码方式可以实现认证并回写。
    2. harbor公开仓库配置的时候不需要用户名和密码,可以使用http请求。
    3. “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 命令行工具

# 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](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

namePrefix: kustomize-
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- dp-smart-doc.yaml
- svc-smart-doc.yaml

dp-smart-doc.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: smart-doc
  namespace: wa
  labels:
    group: service
spec:
  replicas: 1
  selector:
    matchLabels:
      app: smart-doc
      tier: backend
  template:
    metadata:
      annotations: {}
      labels:
        app: smart-doc
        tier: backend
    spec:
      nodeSelector:
        smart: "true"
      dnsPolicy: ClusterFirst
      containers:
        - image: reg1.ka.zkj.com/dev/smart-doc:v1.241008-68-002
          imagePullPolicy: IfNotPresent
          name: smart-wealth
          ports:
            - containerPort: 9800
          #command: ["sleep","10000"]
          env:
            - name: TZ
              value: Asia/Shanghai
          resources:
            limits:
              cpu: 1000m
              memory: 4Gi
            requests:
              cpu: 1000m
              memory: 4Gi
          volumeMounts:
            - mountPath: /logs/smart-doc
              name: smart-doc
      terminationGracePeriodSeconds: 60
      volumes:
        - hostPath:
            path: "/home/zkj/wealth/logs/smart-doc"
            type: DirectoryOrCreate
          name: "smart-doc"

svc-smart-doc.yaml

apiVersion: v1
kind: Service
metadata:
  name: smart-doc
  namespace: wa
spec:
  type: NodePort
  ports:
    - port: 9800
      targetPort: 9800
      nodePort: 48528
  selector:
    app: smart-doc
    tier: backend

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

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

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

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

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

[!NOTE] 中文官方文档参考
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 的变更。

[!NOTE] 更新策略。此策略确定 Argo CD Image Updater 如何识别要更新的新镜像版本。目前支持四种方法:‘semver’、’latest’、‘digest’ 和 ’name’。
在查看它们之前,了解 “可变” 和 “不可变” 镜像标记的含义很重要。可变存储库具有可以被新镜像覆盖的标记,而当存储库配置规定标记必须不可被新镜像覆盖时,标记就是不可变的。以下选项假定使用 “不可变” 标记。如果使用了可变标记,则应使用 “digest” 策略。
semver:此策略将应用程序更新到镜像注册表中的最新镜像版本,同时考虑语义版本控制约束(例如,X.Y.Z 格式,其中 X 为主版本、Y 为次版本,Z 为修补版本)。该选项可配置为仅升级到新的次要或修补版本,还支持通过附加配置支持预发布版本。在下面的示例中,应用程序将使用较新的修补版本进行更新,但不会升级到新的次要或主要版本。
latest:此策略将应用程序更新为具有最新构建日期的镜像。当特定构建具有多个标记时,Argo CD Image Updater 会选择列表中以字母顺序降序排序的最后一个 标记。如果只想考虑特定标记,可以使用带有正则表达式的注释。类似地,可以使用注释来忽略标记列表。
digest:此策略基于注册表中可变标签的更改来更新应用程序。当使用此策略时,将使用镜像摘要来更新应用程序,因此集群上的镜像将显示为 /@sha256: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.html           KubeSphere对接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/18472675

相关文章

  • 2024 最新 jetbrains DataGrip 2024.1.6 激活(亲测可用)
    注意:接下来本文分享免费激活 IDEA 等Jetbrains全家桶工具,一直支持到最新版本2024.1.6。 1.下载安装IDEA (mac、window、linux都支持)大家直接在官网下载最新版本,登陆官网,下载最新版本2024.1.4。一步一步确定安装,然后打开这里提示输入激活码,先关闭应用!!!2.下载激活工具打......
  • 但是将一个项目构建成image的挑战有很多: 依赖、环境变量、绝对路径、网路配置、打包
    但是将一个项目构建成image的挑战有很多:依赖、环境变量、绝对路径、网路配置.比如我具体遇到的报错:1.依赖问题:有一个pythonpackage使用的是github安装而不是pypi的包,所以需要自定义一下conda导出的依赖2. 环境变量问题:后台需要读取环境变量中的文件,如token、ap......
  • ORB-SLAM ---- Frame::ComputeImageBounds和Frame::AssignFeaturesToGrid()
    文章目录一、Frame::ComputeImageBounds()1.函数作用及讲解2.源码及标注二、Frame::AssignFeaturesToGrid()1.函数作用及讲解2.源码及标注3.调用的函数三、总结一、Frame::ComputeImageBounds()该函数的作用为计算函数边界,仅在第一帧或者标定参数变化后进行图......
  • The 1st Universal Cup. Stage 22: Shaanxi
    Preface时隔一周之后难得开了场训练,然后犯了一堆弱智错误给自己搞红温了,最后感觉啥难题也没写就混着混着就结束了赛后想补题经典找不到题解,只搜到哥哥的题解结果搞不懂细节还是写不来一点,直接开摆D.AliceandBob首先博弈部分的结论很好猜,若第一次操作开头的数为\(x\),则若......
  • Splatt3R: Zero-shot Gaussian Splatting from Uncalibrated Image Pairs 论文解读
    目录一、概述二、相关工作1、近期工作2、DUSt3R3、MASt3R三、Splatt3R1、MASt3R的Backbone 2、高斯预测头3、点云与3D高斯参数结合4、3D高斯渲染5、损失函数四、实验 1、对比实验2、消融实验一、概述    该论文首次提出了一种无需任何相机参数和深......
  • POLIR-Society-Organization-Psychology-Relationship关系-Dating Stages阶段: Questi
    https://www.verywellmind.com/questions-to-ask-your-partner-dating-stages-5270161Relationships>StrengtheningRelationships>RelationshipQuestionstoAskYourPartnertoTakeYourConnectionNextLevelRelationshipQuestionstoAskYourPartner......
  • [成] ArgoCD + "ArgoCD Image Updater小工具" 实现镜像仓库tag变更自动触发持续集成
    部署思路踩坑整理ArgoCD和ArgoCDImageUpdater是2个不同的程序。"ArgoCDImageUpdater小工具"没有集成在ArgoCD中需要单独部署。单独的ArgoCD能够实现基于git仓库变更作为应用部署的事实来源[参考子页:argocd根据镜像tag变化实现自动发布的2种方式];ArgoCD+"ArgoCDImage......
  • 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......