【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 自动构建,它包括下面三个步骤:
- 构建示例应用的镜像。
- 将示例应用的镜像推送到 Docker Registry 镜像仓库。
- 更新代码仓库中 Helm Chart values.yaml 文件的镜像版本。
第三部分:核心是 ArgoCD,它包括下面两个步骤:
- 通过定期 Poll 的方式持续拉取 Git 仓库,并判断是否有新的 commit。
- 从 Git 仓库获取 Kubernetes 对象,与集群对象进行实时比较,自动更新集群内有差异的资源。
前边的环境已经准备好,现在准备创建 GitOps 工作流中的第三部分,也就是创建 ArgoCD 应用,实现 Kubernetes 资源的自动同步。
创建 ArgoCD 应用
以示例应用为例子来创建 ArgoCD 应用,这里主要分成两个步骤。
- 配置仓库访问权限。
- 创建 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 同步状态
在应用详情页面,需要重点关注三个状态。
- APP HEALTH: 应用整体的健康状态,它包含下面三个值。
- Progressing:处理中
- Healthy:健康状态
- Degraded:宕机
- CURRENT SYNC STATUS: 应用定义和集群对象的差异状态,也包含下面三个值。
- Synced:完全同步
- OutOfSync:存在差异
- Unknown:未知
- 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 对象并没有加密功能, 这可能会导致凭据泄露。 所以,我们需要对这些敏感信息进行加密处理。关于如何加密秘钥,是一个遗留项!
相关文章:

【GitOps系列】使用 ArgoCD 快速打造GitOps工作流
文章目录 ArgoCD简介ArgoCD安装访问ArgoCDGitOps 工作流总览创建 ArgoCD 应用检查 ArgoCD 同步状态访问应用 连接 GitOps 工作流体验 GitOps 工作流生产建议1)修改默认密码2)配置 Ingress 和 TLS3)使用 Webhook 触发 ArgoCD4)将源…...

C#|无法打开cs文件设计窗口
报错信息:To prevent possible data loss before loading the designer, the following errors must be resolved: 解决方案:实不相瞒我把项目解决方案名称改短了就可以了。。有其他原因或者解决方案望不吝赐教。。...

【SpringBoot笔记36】SpringBoot自定义WebSocketHandler集成WebSocket
这篇文章,主要介绍SpringBoot自定义WebSocketHandler集成WebSocket。 目录 一、SpringBoot集成WebSocket 1.1、添加WebSocket依赖 1.2、自定义WebSocketHandler 1.3、注册WebSocket服务端...

flutter 图片相关
官方链接:https://api.flutter.dev/flutter/widgets/Image-class.html 图片基本使用 显示本地图片时,要在pubspec.yaml文件里面添加如:(注意空格) assets: - assets/images/logo.png Fit属性: BoxFit.cover最常用 显示可能拉伸,可能裁…...

将上位机程序从PC的window系统迁移至Intel NUC的无桌面版ubuntu系统问题记录
将上位机程序从PC的window系统迁移至Intel NUC的无桌面版ubuntu系统 问题一 网口失效 问题描述:NUC关机状态下,将网口与路由器连接,网络指示灯闪烁;NUC开机后,网络指示灯熄灭,使用ping命令,既…...

CHI中的error处理
Error Handling Error types 包含两种sub-packet级别的error, 和两种packe级别的error; Packet level error Data Error, DERR □ 访问的地址是正确的,但是访问的数据有错误;通常是在数据崩溃的时候使用,例如ECC…...

如何使用 PHP 进行数据库缓存处理?
当你想要让你的PHP应用程序更快时,数据库缓存是一个重要的工具。它可以帮助你避免频繁地查询数据库,提高应用程序的响应速度。不过,在进行数据库缓存处理时,需要注意一些细节,否则可能会得到相反的结果。下面ÿ…...

新版巨量广告投放技巧分析
新版广告系统,计划出价40,转化成本特别低只有21,同时消耗也比较慢 为什么刚开始成本都比较低,跑着跑着成本就高了,像这种情况一般如何操作? 一: 为什么会出现成本和出价差这么多 1: 系统对账…...

Vue3 导出excel
🙂博主:锅盖哒 🙂文章核心:导出excel 目录 首先,你需要安装xlsx库。可以使用npm或yarn来安装: 在Vue组件中,你可以使用xlsx库来生成Excel文件并提供一个导出按钮供用户下载。 在Vue 3中&…...

vue 使用vue-json-viewer 展示 JSON 格式的数据
npm install vue-json-viewer --save<el-button type"primary" click"previewClick">预览</el-button><el-dialog title"预览" :visible.sync"previewVisible" width"70%"><viewer ref"viewer&qu…...

14.python设计模式【模板方法模式】
内容:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法某特定步骤。 角色: 抽象类(AbstractClass):定义抽象的原子操作(钩子…...

谷粒商城第六天-实现功能的前序工作(网关的配置 跨域配置)
目录 一、为什么要做这项工作 1.1 为什么要配置网关 1.2 为什么要使用网关统一配置跨域 二、网关配置 三、统一跨域配置 四、总结 一、为什么要做这项工作 1.1 为什么要配置网关 我们知道网关的作用其实主要就是进行路由的,也就是根据前端发送到网关的请求&…...

为什么说国内数字孪生平台gis架构采用Cesium是不错的选择?
Gis作为数字孪生平台开发中重要的一环对数字孪生平台是否好用是一个重要的判定方式,国内数字孪生软件在融合GIS系统方面采取了多种方式,例如Unity或Unreal Engine等游戏引擎,以增强数字孪生的空间感知和空间分析能力,提供更全面、…...

前端面试的性能优化部分(1)每篇10题
1. 懒加载的概念 懒加载(Lazy Loading)是一种优化技术,它用于延迟加载页面资源,只在需要时才加载特定的内容,而不是在页面初始加载时一次性加载所有资源。懒加载的目的是提高页面加载速度和性能,尤其对于单…...

GitLab备份升级
数据备份(默认的备份目录在/var/opt/gitlab/backups/下,生成一个以时间节点命名的tar包。) gitlab-rake gitlab:backup:create新建repo源,升级新版本的gitlab vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] namegitlab-ce baseurlhttps://mirrors.…...

Matlab实现遗传算法仿真(附上40个仿真源码)
遗传算法(Genetic Algorithm,GA)是一种基于生物进化理论的优化算法,通过模拟自然界中的遗传过程,来寻找最优解。 在遗传算法中,每个解被称为个体,每个个体由一组基因表示,每个基因是…...

git使用(由浅到深)
目录流程图 1. 分布式版本控制与集中式版本控制 1.1 集中式版本控制 集中式版本控制系统有:CVS和SVN它们的主要特点是单一的集中管理的服务器,保存所有文件的修订版本;协同开发人员通过客户端连接到这台服务器,取出最新的文件或者提交更新…...

NAT协议(网络地址转换协议)详解
NAT协议(网络地址转换协议)详解 为什么需要NATNAT的实现方式静态NAT动态NATNAPT NAT技术的优缺点优点缺点 NAT协议是将IP数据报头中的IP地址转换为另外一个IP地址的过程,主要用于实现私有网络访问公有网络的功能。这种通过使用少量的IP地址代…...

pytorch(续周报(1))
文章目录 2.1 张量2.1.1 简介2.1.2 创建tensor2.1.3 张量的操作2.1.4 广播机制 2.2 自动求导Autograd简介2.2.1 梯度 2.3 并行计算简介2.3.1 为什么要做并行计算2.3.2 为什么需要CUDA2.3.3 常见的并行的方法:网络结构分布到不同的设备中(Network partitioning)同一层…...

el-table 树形结构数据 设置某一层,新增按钮不展示
<template><div><el-table:data"tableData":row-class-name"rowClassName":tree-props"{ children: children, hasChildren: hasChildren }"><!-- 表格列定义 --><!-- ... --><el-table-column label"操作…...

【Unity2D】粒子特效
为什么要使用粒子特效 Unity 的粒子系统是一种非常强大的工具,可以用来创建各种各样的游戏特效,如火焰、烟雾、水流、爆炸等等。使用粒子特效可以使一些游戏动画更加真实或者使游戏效果更加丰富。 粒子特效的使用 在Hierarchy界面右键添加Effects->…...

第九十六回 网络综合示例:获取天气信息
文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了dio库中转换器相关的内容,本章回中将介绍网络综合示例:获取天气信息.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在前面章回中介绍了网络操作相关的内容,本章…...

Shell中获取昨天和多天前日期
1、获取今天日期 $ date -d now %Y-%m-%d 或者 $ date %F2、获取明天日期 $ date -d next-day %Y-%m-%d $ date -d tomorrow %Y-%m-%d3、获取昨天日期 $ date -d yesterday %Y-%m-%d 或者 $ date -d last-day %Y-%m-%d 或者 $ date -d "1 days ago" %Y-%m-%d …...

golang静态编译及编译失败排查步骤
文章目录 一、背景前提 二、静态编译概述1、执行静态编译设置CGO_ENABLED方式指定link方式 2、编译报错分析(1)确认系统上有没有安装libopus(2)设置LD_LIBRARY_PATH 三、详细排查过程1、下载bpf排查工具bcc, bcc-tools,python-bcc…...

2023年7月第4周大模型荟萃
2023年7月第4周大模型荟萃 2023.7.31版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 1、Cerebras推出全球最强AI超算 AI芯片初创公司Cerebras Systems和总部位于阿联酋的技术控股集团G42于7月20日宣布,携手打造一个由互联的超…...
Meta分析的选题与文献计量分析CiteSpace应用丨R语言Meta分析【数据清洗、精美作图、回归分析、诊断分析、不确定性及贝叶斯应用】
目录 专题一、Meta分析的选题与文献计量分析CiteSpace应用 专题二、Meta分析与R语言数据清洗及相关应用 专题三、R语言Meta分析与精美作图 专题四、R语言Meta回归分析 专题五、R语言Meta诊断分析与进阶 专题六、R语言Meta分析的不确定性及贝叶斯应用 专题七、深度拓展…...

vscode eslint配置
1. 全局安装 eslint npm install -g eslint 2. control shift p 输入 settings 打开设置进行配置 3. 添加配置 {"workbench.colorTheme": "One Dark Pro","eslint.debug": true,"eslint.execArgv": null,"eslint.alwaysShow…...

C++ 对象模型 C++ Object Model
C 对象模型 C Object Model 文章目录 C 对象模型 C Object ModelC语言的数据及函数C的类C对象模型 C语言的数据及函数 C语言中,数据和函数是分开声明的。 数据 typedef struct point2d {float x;float y; } Point2d;函数 打印Point2d的数值 void Point2d_print…...

leetcode做题笔记47
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 思路一:回溯 int* Source NULL; int Source_Size 0;int** Result NULL; int* Retcolsizes NULL; int Result_Index 0;int* Path NULL; int Path_Index 0;bool* Used …...

Linux Day04
目录 一、文件压缩与解压命令 1.1 tar cvf 文件名 ---打包命令生成.tar 1.2 tar xvf 文件名 ----解开包 生成文件 1.3 gzip .tar 压缩 生成.tar.gz压缩包 1.4 gzip -d .tar.gz 解压成包 1.5 直接把压缩包解压成文件 tar zxf .tar.gz 二、Linux 系统上 C 程序的…...