【GitOps系列】使用 ArgoCD 快速打造GitOps工作流

文章目录

      • ArgoCD简介
      • ArgoCD安装
      • 访问ArgoCD
      • GitOps 工作流总览
        • 创建 ArgoCD 应用
        • 检查 ArgoCD 同步状态
        • 访问应用
      • 连接 GitOps 工作流
      • 体验 GitOps 工作流
      • 生产建议
        • 1)修改默认密码
        • 2)配置 Ingress 和 TLS
        • 3)使用 Webhook 触发 ArgoCD
        • 4)将源码仓库和应用定义仓库分离
        • 5)加密 GitOps 中存储的秘钥

ArgoCD简介

官网:https://argo-cd.readthedocs.io/en/stable/

ArgoCD安装

$ kubectl create namespace argocd$ kubectl apply -n argocd -f https://ghproxy.com/https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml~# kubectl wait --for=condition=Ready pods --all -n argocd --timeout 300s
pod/argocd-application-controller-0 condition met
pod/argocd-applicationset-controller-6dd887f766-gv2gk condition met
pod/argocd-dex-server-89774cfc6-v2dhc condition met
pod/argocd-notifications-controller-79c985586c-xkt7q condition met
pod/argocd-redis-74f98b85f-dvhjc condition met
pod/argocd-repo-server-9cb997c7b-vjzrn condition met
pod/argocd-server-749879d78d-hcc6v condition met

访问ArgoCD

可以通过ingress或者nodeport方式暴露进行访问!
user:admin
passwd:$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

GitOps 工作流总览

在这里插入图片描述
我们可以把这个完整的 GitOps 工作流分成三个部分来看。
第一部分:开发者推送代码到 GitHub 仓库,然后触发 GitHub Action 自动构建。
第二部分:GitHub Action 自动构建,它包括下面三个步骤:

  1. 构建示例应用的镜像。
  2. 将示例应用的镜像推送到 Docker Registry 镜像仓库。
  3. 更新代码仓库中 Helm Chart values.yaml 文件的镜像版本。

第三部分:核心是 ArgoCD,它包括下面两个步骤:

  1. 通过定期 Poll 的方式持续拉取 Git 仓库,并判断是否有新的 commit。
  2. 从 Git 仓库获取 Kubernetes 对象,与集群对象进行实时比较,自动更新集群内有差异的资源。

前边的环境已经准备好,现在准备创建 GitOps 工作流中的第三部分,也就是创建 ArgoCD 应用,实现 Kubernetes 资源的自动同步。

创建 ArgoCD 应用

以示例应用为例子来创建 ArgoCD 应用,这里主要分成两个步骤。

  1. 配置仓库访问权限。
  2. 创建 ArgoCD 应用。

其中,如果你的示例应用仓库是公开的,可以跳过第一步。
配置 ArgoCD 仓库访问权限(可选)

$ argocd login 127.0.0.1:8080 --insecure    #更换地址
Username: admin
Password:
'admin:login' logged in successfully

添加示例应用仓库:

~# argocd repo add https://github.com/Hugh-yw/kubernetes-example.git --username $USERNAME  --password $PASSWORD

将 $USERNAME 替换为 GitHub 账户 ID,将 $PASSWORD 替换为 GitHub Personal Token,Token创建链接:https://github.com/settings/tokens/new

创建 ArgoCD 应用
ArgoCD 同时支持使用 Helm Chart、Kustomize 和 Manifest 来创建应用,本次实践以示例应用的 Helm Chart 为例。
通过argocd app create命令来创建应用:

$ argocd app create example --sync-policy automated --repo https://github.com/Hugh-yw/kubernetes-example.git --revision main --path helm --dest-namespace gitops-example --dest-server https://kubernetes.default.svc --sync-option CreateNamespace=true
application 'example' created

–sync-policy 参数代表设置自动同步策略。automated 的含义是自动同步,也就是说当集群内的资源和 Git 仓库 Helm Chart 定义的资源有差异时,ArgoCD 会自动执行同步操作,实时确保集群资源和 Helm Chart 的一致性。
–repo 参数表示 Helm Chart 的仓库地址。这里的值是示例应用的仓库地址,注意需要替换成你实际的 Git 仓库地址。
–revision 参数表示需要跟踪的分支或者 Tag,这里我们让 ArgoCD 跟踪 main 分支的改动。
–path 参数表示 Helm Chart 的路径。在示例应用中,存放 Helm Chart 的目录是 helm 目录。
–dest-namespace 参数表示命名空间。这里指定了 gitops-example 命名空间,注意,这是一个不存在的命名空间,所以我们额外通过--sync-option参数来让 ArgoCD 自动创建这个命名空间。
最后,–dest-server 参数表示要部署的集群, https://kubernetes.default.svc 表示 ArgoCD 所在的集群。

检查 ArgoCD 同步状态

在这里插入图片描述
在应用详情页面,需要重点关注三个状态。

  1. APP HEALTH: 应用整体的健康状态,它包含下面三个值。
    1. Progressing:处理中
    2. Healthy:健康状态
    3. Degraded:宕机
  2. CURRENT SYNC STATUS: 应用定义和集群对象的差异状态,也包含下面三个值。
    1. Synced:完全同步
    2. OutOfSync:存在差异
    3. Unknown:未知
  3. LAST SYNC RESULT: 最后一次同步到 Git 仓库的信息,包括 Commit ID 和提交者信息。

访问应用

当应用健康状态变为 Healthy 之后,我们就可以访问应用了。

~# kubectl get ingressroute -n gitops-example 
NAME               AGE
frontend-service   70m

访问应用链接:http://frontend.demo.com

连接 GitOps 工作流

在完成 ArgoCD 的应用配置之后,我们就已经将示例应用的 Helm Chart 定义和集群资源关联起来了,但整个 GitOps 工作流还缺少非常重要的一部分,就是上面提到的自动更新 Helm Chart values.yaml 文件镜像版本的部分,在下面这张示意图中用“❌”把这个环节标记了出来。
在这里插入图片描述
在这部分工作流没有打通之前,提交的新代码虽然会构建出新的镜像,但是 Helm Chart 定义的镜像版本并不会产生变化, 这会导致 ArgoCD 不能自动更新集群内工作负载的镜像版本。
要解决这个问题,我们还需要在 GitHub Action 中添加自动修改 Helm Chart 并重新推送到仓库操作。
接下来,我们修改示例应用的.github/workflows/build.yaml文件,在“Build frontend and push”阶段后面添加一个新的阶段,代码如下:

- name: Update helm values.yamluses: fjogeleit/yaml-update-action@mainwith:valueFile: 'helm/values.yaml'commitChange: truebranch: mainmessage: 'Update Image Version to ${{ steps.vars.outputs.sha_short }}'changes: |{"backend.tag": "${{ steps.vars.outputs.sha_short }}","frontend.tag": "${{ steps.vars.outputs.sha_short }}"}

使用了 GitHub Action 中yaml-update-action插件来修改 values.yaml 文件并把它推送到仓库。如果你是使用 GitLab 或者 Tekton 构建镜像,可以调用 jq 命令行工具来修改 YAML 文件,再使用 git 命令行将变更推送到仓库。
到这里, 一个完整的 GitOps 工作流就建立好了。

体验 GitOps 工作流

尝试修改 frontend/src/App.js 文件,例如修改文件第 49 行的“Hi! I am a geekbang”。修改完成后, 将代码推送到 GitHub 仓库 main 分支,此时,GitHub Action 会自动构建镜像,并且还会更新代码仓库中 Helm values.yaml 文件的镜像版本。

这里遇到一点小插曲,在GitHub Action自动构建镜像时报异常:

HttpError: Resource not accessible by integration

参考解决资料:https://www.drixn.com/3074.html

ArgoCD 默认每 3 分钟会拉取仓库检查是否有新的提交,你也可以在 ArgoCD 控制台手动点击 Sync 按钮来触发同步。
在这里插入图片描述
ArgoCD 同步完成后,我们可以在“LAST SYNC RESULT”一栏中看到 GitHub Action 修改 values.yaml 的提交记录,当应用状态为 Healthy 时,我们就可以访问新的应用版本了。

生产建议

1)修改默认密码

注:
修改密码前,先使用 argocd login 登录到 ArgoCD 服务端。
$ argocd account update-password
*** Enter password of currently logged in user (admin):
*** Enter new password for user admin:

2)配置 Ingress 和 TLS

前提:
需要安装 Cert-manager!!!
> ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: argocd-server-ingressnamespace: argocdannotations:cert-manager.io/cluster-issuer: letsencrypt-prodkubernetes.io/ingress.class: nginxkubernetes.io/tls-acme: "true"nginx.ingress.kubernetes.io/ssl-passthrough: "true"nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:rules:- host: argocd.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: argocd-serverport:name: httpstls:- hosts:- argocd.example.comsecretName: argocd-secret # do not change, this is provided by Argo CD

3)使用 Webhook 触发 ArgoCD

我们在创建应用的时候提供了参数 --sync-policy=automated。这时候,ArgoCD 会默认以 3 分钟一次的频率来自动拉取仓库的更改,在生产环境下,这个同步频率可能并不能满足快速发布的要求。
如果 ArgoCD 可以在公网进行访问,建议使用 ArgoCD 提供的 Webhook 触发方式来解决这个问题了,如下图所示:
在这里插入图片描述
和主动 Poll 模型不同的是,源码仓库在收到开发者推送代码的事件后,将实时通过 HTTP 请求来通知 ArgoCD,也就是图中红色字体的部分。
要使用 Webhook 通知的方式,首先你需要在源码仓库进行配置。以 GitHub 为例,首先进入仓库的“Settings”页面,点击左侧的“Webhook”菜单进入配置页面,如下图:
在这里插入图片描述
在 Payload URL 中输入你的 ArgoCD Server 外网访问域名,/api/webhook ArgoCD 专门用于接收外部 Webhook 消息的固定路径。
Content type 选择 application/json,并在 Secret 中输入你要配置的 Webhook 的密钥,这个密钥需要提供给 ArgoCD 来校验 Webhook 来源是否合法?
接下来,你还需要为 ArgoCD 提供 GitHub Webhook 密钥,使用下面的命令来编辑 argocd-secret 对象。

$ kubectl edit secret argocd-secret -n argocd
apiVersion: v1
kind: Secret
metadata:name: argocd-secretnamespace: argocd
type: Opaque
data:
...
stringData:# 加入这一项webhook.github.secret: my-secret

注意,stringData 可以直接输入 Webhook Secret 内容而不需要进行 Base64 编码。
如果你使用的是其他的代码托管平台,例如 GitLab,可以参考 https://argo-cd.readthedocs.io/en/stable/operator-manual/webhook/进行配置。

4)将源码仓库和应用定义仓库分离

本次实践将示例应用的源码和 Helm Chart 存储在了同一个 Git 仓库,实际上, 这并不是一个好的实践。
这种方案有两个比较大的问题。首先,当我们手动修改 Helm Chart 并推送到 Git 仓库之后,在业务代码不变的情况下也会触发应用镜像构建,这个过程是没有必要的。
其次,在有一定规模的团队中,开发和发布过程是分开的,应用定义仓库一般只有基础架构部门或者 SRE 部门具有修改权限,将源码和应用定义放在同一个 Git 仓库不利于权限控制,开发者也很容易误操作。
所以,基于上面这两个问题,强烈建议将业务代码和应用定义分开存储管理。

5)加密 GitOps 中存储的秘钥

本次实践使用的是 DockerHub 公开仓库,所以 Kubernetes 集群不需要镜像拉取凭据就可以拉取到镜像。
在实际生产环境下,一般我们会使用内部自建例如 Harbor 私有仓库。所以在大部分情况下,我们会在 Helm Chart 里增加一个包含镜像拉取凭据的 Secret 对象。

apiVersion: v1
kind: Secret
metadata:name: regcred
type: kubernetes.io/dockerconfigjson
data:.dockerconfigjson: >-eyJhdXRocyI6eyJodHRwczovL2luZGV4LmRvY2tlcxxxxS8iOnsidXNlcm5hbWUiOiJseXpoYW5nMTk5OSIsInBhc3N3b3JkIjoibXktdG9rZW4iLCJhdXRoIjoiYkhsNmFHRnVaekU1T1RrNmJYa3RkRzlyWlc0PSJ9fX0=

当 ArgoCD 部署应用时,会一并将拉取凭据部署到集群中,这就解决了镜像拉取权限的问题。
但是,Secret 对象并没有加密功能, 这可能会导致凭据泄露。 所以,我们需要对这些敏感信息进行加密处理。关于如何加密秘钥,是一个遗留项!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DoIP学习笔记系列:(二)VN5620 DoIP测试配置实践笔记

文章目录 1. 添加.cdd2. CAPL中调用接口发送DoIP请求3. “Ethernet Packet Builder”的妙用4. CANoe也可以做交互界面在进行测试前,先检查车载以太网硬件连线是否正确,需要注意连接两端的Master、Slave,100M、1000M等基本情况,在配置VN5620的时候就可以灵活处理了。成功安装…

数学建模-MATLAB三维作图

导出图片用无压缩tif会更清晰 帮助文档:doc 函数名 matlab代码导出为PDF 新建实时脚本或右键文件转换为实时脚本实时编辑器-全部运行-内嵌显示保存为PDF

【TypeScript】接口类型 Interfaces 的使用理解

导语: 什么是 类型接口? 在面向对象语言中,接口(Interfaces)是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类(classes)去实现(implement&#x…

JVM-类加载

1.了解冯诺依曼计算机结构 1.1计算机处理数据过程 (1)提取阶段:由输入设备把原始数据或信息输入给计算机存储器存起来 (2)解码阶段:根据CPU的指令集架构(ISA)定义将数值解译为指令 (3)执行阶段:再由控制器把需要处理或计算的数据调入运算器 (4)最终阶段:由输出设备把最后运…

区间预测 | MATLAB实现基于QRF随机森林分位数回归时间序列区间预测模型

区间预测 | MATLAB实现基于QRF随机森林分位数回归时间序列区间预测模型 目录 区间预测 | MATLAB实现基于QRF随机森林分位数回归时间序列区间预测模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRF随机森林分位数回归时间序列区间预测模型&#xff1…

Dooring-Saas低代码技术详解

hello, 大家好, 我是徐小夕, 今天和大家分享一下基于 H5-Dooring零代码 开发的全新零代码搭建平台 Dooring-Saas 的技术架构和设计实现思路. 背景介绍 3年前我上线了第一版自研零代码引擎 H5-Dooring, 至今已迭代了 300 多个版本, 主要目的是快速且批量化的生产业务/营销过程中…

empty module导致的lvs问题

write_verilog时-exclude empty_modules即可 这里也分享一下ICC2 write lvs netlist的命令 write_verilog -exclude {scalar_wire_declarations leaf_module_declarations empty_modules well_tap_cells filler_cells supply_statements} -hierarchy all -force_no_referenc…

手风琴案例(jQuery)

案例效果 代码实现 jQuery代码(两种方法) 方法一:hover版 $(function () {$(".king li").hover(function() {$(this).addClass("current").siblings().removeClass("current");}, function() {$(".king…

单机部署NGINX

​ 1、找到合适的nginx资源包,可以去官网下载 这里用的是 nginx-1.24.0.tar.gz 2、上传下载下来的nginx软件包,并解压 tar zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0/ 3、安装nginx 编译 ./configure --prefix/usr/local/nginx --with-http_ssl…

哈希表的简单模拟实现

文章目录 底层结构哈希冲突闭散列定义哈希节点定义哈希表**哈希表什么情况下进行扩容?如何扩容?**Insert()函数Find()函数二次探测HashFunc()仿函数Erase()函数全部的代码 开散列定义哈希节点定义哈希表Insert()函数Find()函数Erase()函数总代码 初识哈希…

UG\NX二次开发 获取2D制图视图中可见的对象,并获取类型

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 使用UF_VIEW_ask_visible_objects获取2D制图视图中可见的对象,并获取类型。 下面是将一个六面体以不同的视图投影,获取视图对象和类型的效果。 效果: 1个部件事例,1个体,4条边 1个部件事…

springboot创建并配置环境(一) - 创建环境

文章目录 一、介绍二、启动环境Environment的分析三、进入源码四、创建环境1. 如何确定应用类型2. 测试 一、介绍 在springboot的启动流程中,启动环境Environment是可以说是除了应用上下文ApplicationContext之外最重要的一个组件了,而且启动环境为应用…

MySQL主从复制

1.理解MySQL主从复制原理。 1.1MySQL支持的复制类型 MySQL支持以下几种常见的复制类型: 基于语句的复制(Statement-based Replication,SBR):基于语句的复制是MySQL最早支持的复制方式,它通过复制和执行S…

CSS3 实现边框圆角渐变色渐变文字效果

.boder-txt {width: 80px;height: 30px; line-height: 30px;padding: 5px;text-align: center;border-radius: 10px;border: 6rpx solid transparent;background-clip: padding-box, border-box;background-origin: padding-box, border-box;/*第一个linear-gradient表示内填充…

C++动态内存管理

目录 C语言中的动态内存管理C动态内存管理动态管理内置类型动态管理自定义类型 new和delete的实现原理operator new和operator delete函数new和delete对内置类型的实现原理new和delete对自定义类型的实现原理 malloc/free和new/delete区别 C语言中的动态内存管理 之前学习了C语…

Nginx系列之 一 负载均衡

目录 一、Nginx概述 1.1 负载均衡概述 1.2 负载均衡的作用 1.3 四/七层负载均衡 1.3.1 网络模型简介 1.3.2 四层和七层负载均衡对比 1.3.3 Nginx七层负载均衡实现 1.4 Nginx负载均衡配置 1.5 Nginx负载均衡状态 1.6 Nginx负载均衡策略 二、负载均衡实战 2.1 测试服…

算法通关村第一关——链表白银挑战笔记

文章目录 两个链表的第一个重合节点判断回文链表 两个链表的第一个重合节点 同LeetCode 160.相交链表 解法一:Hash和Set(集合),此处用Set合适。 把其中一个链表的所有节点引用放入set,再从头遍历另一个链表第一次重合的地方就是答…

Android性能优化之SharedPreference卡顿优化

下面的源码都是基于Android api 31 1、SharedPreference使用 val sharePref getPreferences(Context.MODE_PRIVATE) with(sharePref.edit()) { putBoolean("isLogin", true)putInt("age", 18)apply() } val isLogin sharePref.getBoolean("isLogi…

windows环境下docker数据迁移到其他盘

docker安装在C盘,使用一段时间后,C盘爆满。因此想把C盘中的数据迁移到其他盘,以释放C盘空间。分为以下步骤: 1、启动docker软件,打开PowerShell并切换到Docker Compose配置文件的目录。 Docker Compose配置文件的目录…

通过社区参与解锁早期增长:Maven 远程医疗平台概览

Maven通过用户导向的渐进式验证,找到了一个被忽视的巨大女性医疗服务市场,作为女性医疗保健的先行者,已服务超过1500万用户,目前估值已达$14亿。本文将深入探索Maven实现产品市场匹配的三个阶段,从如何验证初始的市场机…