[GitOps]微服务版本控制:使用ArgoCD 部署Grafana Loki
背景介绍
请回答:你们是如何保证线上部署的服务,从服务版本到参数配置,都是和测试通过的版本是一致的呢?
本文将介绍GitOps的基本原理以及ArgoCD的使用:ArgoCD部署Grafana Loki 到k8s集群。
本文项目地址:郭麻花的Azure Devops argo-cd - Repos (azure.com)
什么是GitOps
GitOps通常作为k8s集群中的一项基础设施。它将Git仓库中的服务清单作为唯一版本来源,并且提供自动部署机制。
GitOps提供了高度自动化和审计朔源能力来管理集群服务,大大提高团队交付效率与安全一致性。
ArgoCD
ArgoCD是一个用于Kubernetes集群的开源且强大的GitOps工具。

ArgoCD可以做什么
- ArgoCD可以管理各种Kubernetes原生资源,如Deployment、Service、ConfigMap、Secret等;
- ArgoCD还可以管理Helm Chart,Kubernetes CRD等;
- ArgoCD还可以管理有状态服务,如PersistentVolumeClaim等。
总之,你可以将ArgoCD看作是集群的管家,它可以严格按照Git仓库中的清单文件,时刻监视清单与集群资源的差异,并提供自动/手动 同步机制。
ArgoCD Application
Application是由ArgoCD创建的一种Kubernetes CRD。一个k8s服务通常包含多种资源,例如:deployment, secret, configmap 或者CRD等等,而ArgoCD 可以将这些资源视为一个Application进行管理。
假如你们的服务已经被打包成了Helm Chart,更容易通过ArgoCD Application来进行管理。
注意:ArgoCD在部署Helm Chart时会将Chart重新拆解为各项资源文件进行部署,因此你无法通过Helm来管理ArgoCD部署的Helm Chart。
另外:Application可以包含其它Application。你可以在ArgoCD中对集群中的服务进行逻辑划分,将多个Application聚合到一个Application下进行管理。
使用Helm安装ArgoCD
使用helm安装ArgoCD非常简单,但是需要注意:
即使在具有充分的Cluster Role的情况下,ArgoCD 默认也只允许资源部署到它所在的命名空间。我们可以通过指定server参数 --application-namespaces="*",让ArgoCD允许资源部署到其他命名空间。
helm repo add argo https://argoproj.github.io/argo-helmhelm install my-release argo/argo-cd
我们可以通过port-forward argocd-server 8080端口,并使用init-secret中的admin密码访问Argocd。
创建Git清单仓库
Grafana Loki是一个开源的高性能的集群日志聚合服务,它的原理与Promthus相似,与Grafana结合使用,可以获得与EFK解决方案相同的集群日志聚合可视化能力。
我将使用ArgoCD来部署Grafana Loki到集群中,请参考: argo-cd - sample (azure.com)
例如,下面是包含了 Loki helm chart的ArgocCD Application:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:name: lokinamespace: argocd
spec:syncPolicy:syncOptions:- ServerSideApply=trueproject: defaultsource:chart: lokirepoURL: https://grafana.github.io/helm-chartstargetRevision: 5.9.2helm:releaseName: lokivalues: |loki:auth_enabled: falsecommonConfig:replication_factor: 1storage:type: 'filesystem'singleBinary:replicas: 1destination:server: "https://kubernetes.default.svc"namespace: loki
添加Repositories和certificates
现在,我们需要将Helm Chart仓库和Apps Git仓库以及它们的访问凭证添加到ArgoCD当中。
我所用到的是公开的Helm Chart仓库和Git仓库,假如你使用的是私有仓库,你需要为它指定连接所必须的凭证。对于Azure Git来说,只需要一个PAT(personal access token)

创建Grafana Loki App
我们用上面创建好的Git Repo地址,创建一个名为grafana-loki的App.
该Application包含了三个Application:Promtail, Loki, Grafana。
此时,这三个App的状态是Missing,意味着在集群中不存在;如果是集群版本与Git版本不一致,状态应该是OutSync;集群服务与Git仓库一致,则是Synced。

Application状态图例


让ArgoCD管理自己
最后,我要介绍一下如何让ArgoCD管理它自己。我们前面使用Helm安装了ArgoCD,因此当前集群中ArgoCD服务是由Helm来管理的,这意味着集群服务现在有着两种不同的管理模式。
1. 我们需要在Git仓库中创建一个Application表示当前ArgoCD服务:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:name: argo-cdnamespace: argocdfinalizers:- resources-finalizer.argocd.argoproj.io
spec:destination:server: https://kubernetes.default.svcnamespace: argocdproject: defaultsource:chart: argo-cdrepoURL: https://argoproj.github.io/argo-helmtargetRevision: 5.43.3helm:values: |server:extraArgs:- --application-namespaces="*"- --insecuresyncPolicy:automated:prune: trueselfHeal: true
2. 如上,使用上面的Application yaml,在ArgoCD中为它自己创建一个App。
3. 等待app状态自己变为Synced,我们可以看到ArgoCD相关的pod将被重新创建出来,之后ArgoCD将管理它自己的状态。

4. 移除ArgoCD的Helm标记,之后我们将无法再通过Helm管理集群中的ArgoCD服务,而是由ArgoCD自己来管理自己。
kubectl delete secret -l owner=helm,name=argo-cd -n argocd
总结
当然,能够实现GitOps的技术还有很多,GitOps的价值也不仅仅是自动化,可溯源。
例如:我们还可以使用ArgoCD的ApplicationSet为不同环境下的app定制不同的参数;我们也可以利用Git仓库的分支和pr策略,在CI阶段进行smoke test,或者其它更有价值的Actions。
总之,我们应尽可能采取科学的,优雅的技术来不断优化软件工程。
相关文章:
[GitOps]微服务版本控制:使用ArgoCD 部署Grafana Loki
背景介绍 请回答:你们是如何保证线上部署的服务,从服务版本到参数配置,都是和测试通过的版本是一致的呢? 本文将介绍GitOps的基本原理以及ArgoCD的使用:ArgoCD部署Grafana Loki 到k8s集群。 本文项目地址࿱…...
什么是单例模式
什么是单例模式 文章目录 什么是单例模式1. 单例(单个的实例)2. 单例模式应用实例3. 饿汉式 VS 懒汉式 1. 单例(单个的实例) 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一…...
【Linux从入门到精通】动静态库的原理与制作详解
本篇文章主要是围绕动静态库的原理与制作进行展开讲解的。其中涉及到了inode的概念引入和软硬连接的讲解。会结合实际操作对这些抽象的概念进行解释,希望会对你有所帮助。 文章目录 一、inode 概念 二、软硬链接 2、1 软连接 2、2 硬链接 三、动静态库概念 3、1 静态…...
【mybatis】mapper.xml中foreach的用法,含批量查询、插入、修改、删除方法的使用
一、xml文件中foreach的主要属性 foreach元素的属性主要有 collection,item,index,separator,open,close。 collection: 表示集合,数据源 item :表示集合中的每一个元素 index :用于…...
c#扩展方法的使用
扩展方法可以向现有类型“添加”方法,无需创建新的派生类型、重新编译或以其他方式修改原始类型,用起来很方便,下面是我写的例子,为string这个常用的类型添加一个showmes方法,以下是扩展方法的代码: public…...
rhel 8.7 部署 keepalived+haproxy 实现 mysql 双主高可用场景
文章目录 [toc]部署 mysql关闭防火墙关闭 selinux创建相关目录创建 mysql 用户配置 PATH 变量验证 mysql 命令切换到 mysql 用户在 172.72.0.116 生成配置文件在 172.72.0.137 生成配置文件mysql 初始化启动 mysql 服务修改 mysql 的 root 用户密码配置主从关系172.72.0.137 配…...
常见指令以及权限理解
常见指令以及权限理解 命令格式: command [-options] parameter1 parameter1 命令 选项 参数1 参数2 1.command为命令名称,例如变化目录的cd等 2.中括号[ ]实际在命令中是不存在的,这个中括号代表可选,通常选项前面会添加一个符号…...
OpenCV基础知识(6)— 滤波器
前言:Hello大家好,我是小哥谈。在尽量保留原图像信息的情况下,去除图像内噪声、降低细节层次信息等一系列过程,被叫做图像的平滑处理(或者叫图像的模糊处理)。实现平滑处理最常用的工具就是滤波器。通过调节…...
IOC容器的基础功能设计模式
构造模式 构造器的目的和构造函数一样,但是构造器可以提供丰富的api来简化对象的构造 构造模式用于简化被构造对象的创建,通过提供一大堆的api来丰富简化构造过程,增加调用者的体验。 构造者需要提供一个Build方法用于构建和返回将要构造的…...
FFmpeg参数说明FFmpegAndroid饺子视频播放器
FFmpegAndroid https://github.com/xufuji456/FFmpegAndroid https://github.com/lipangit/JiaoZiVideoPlayer/tree/develop 饺子视频播放器 ffmpeg 不是内部或外部命令,也不是可运行的程序 或批处理文件 http://www.360doc.com/content/21/0204/15/54508727_9606…...
DNS入门学习:DNS解析生效问题(中科三方)
在修改域名解析记录或DNS服务器之后,DNS解析并不会立即生效,这给很多网站管理者带来了很多困扰,了解DNS解析生效原理以及不同情况下DNS解析生效时间,对于网站管理工作有很大帮助。本文中科三方针对不同情况下DNS解析生效时间做下简…...
Ubuntu22.04编译安装Mysql5.7.35
新升级的ubuntu22.04版本,该版本默认openssl已经升级到3.0,所以编译过程遇到一些问题记录一下。 编译步骤: 安装依赖 gcc g已经安装过就不需要再安装了。 apt-get install cmake apt-get install libaio-dev apt-get install libncurses5…...
C++音乐播放系统
C音乐播放系统 音乐的好处c发出声音乐谱与赫兹对照把歌打到c上 学习c的同学们都知道,c是一个一本正经的编程语言,因该没有人用它来做游戏、做病毒、做…做…做音乐播放系统吧!! 音乐的好处 提升情绪:音乐能够影响我们…...
Django笔记之log日志记录详解
以下是一个简单的 logging 模块示例,可以先预览一下,接下来会详细介绍各个模块的具体功能: LOGGING {version: 1,disable_existing_loggers: False,formatters: {verbose: {format: %(levelname)s %(message)s,}},handlers: {file_1: {leve…...
vue局部打印多页面pdf
技术背景 html打印程pdf,使用的官方提供的window.print()打印的样式 media print {} 方法一 const printContent this.$refs.bodyright;var textInput printContent.getElementsByTagName("input");for (var i 0; i < textInput.length; i) {textInput[i].se…...
指定或降低Rust 工具链的版本
要更改 Rust 工具链的版本,您可以使用以下命令之一: rustup default stable:使用 stable 版本的 Rust 工具链作为默认版本。rustup default beta:使用 beta 版本的 Rust 工具链作为默认版本。rustup default nightly:使…...
数据驱动成功:商城小程序分析与改进
在当今数字化时代,商城小程序成为了企业与消费者之间互动的重要途径。然而,一个成功的商城小程序不仅仅是一个购物平台,更需要通过数据分析不断进行改进和优化,以提升用户体验和营销效果。本文将深入探讨如何利用数据驱动的方式进…...
基于GUI的卷积神经网络和长短期神经网络的语音识别系统,卷积神经网的原理,长短期神经网络的原理
目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 长短期神经网络的原理 基于GUI的卷积神经网络和长短期神经网络的语音识别系统 代码下载链接:基于MATLABGUI编程的卷积神经网络和长短期…...
Docker环境安装elasticsearch和kibana
一、安装elasticsearch 创建es-network,让es、kibana在同一个网段: docker network create --driverbridge --subnet192.168.1.10/24 es-network运行elasticsearch docker run -d \ --name elasticsearch \ # 容器名 --hostname elasticsearch # 主机…...
【剖析STL】vector
vector的介绍及使用 1.1 vector的介绍 cplusplus.com/reference/vector/vector/ vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效。但是…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...

