极狐GitLab 和 ArgoCD 集成实现 GitOps

目录

ArgoCD 和 GitOps 概述

极狐GitLab 与 ArgoCD 的集成

ArgoCD 的安装

sops 介绍

探秘 gpg

sops 和 gpg 的结合

ArgoCD 的使用

极狐GitLab 仓库的添加

gpg public key 的添加

ArgoCD Project 创建

ArgoCD Project 配置

ArgoCD GitOps workflow 验证


ArgoCD 和 GitOps 概述


ArgoCD 是一款开源且主要针对 Kubernetes 来做 GitOps 的持续交付工具。现在是 CNCF 的孵化项目。其整体架构图如下:

图片

ArgoCD 是以 Kubernetes Controller 的形式来实现的,它会对运行在 Kubernetes 集群上的应用程序进行监听,并将实际运行状态和期望状态(在部署清单文件中指定,且存储在版本控制系统中,诸如极狐GitLab)进行对比,当两者状态不一致的时候,则提示 OutOfSync,此时可以通过自动或者手动的方式来完成同步操作,以让两者状态再次保持一致。存储在极狐GitLab 仓库中的任何变更都会被自动同步至集群侧。

这其实就是实现 GitOps 的核心原理。所有对于应用程序或者基础设施的变更仅仅需对极狐GitLab 仓库做一些 MR(Merge Request)或者 Push 操作即可实现,变更会自动部署。所以,虽然GitOps 的核心不是 Git,但是却与 Git 息息相关。

关于 GitOps 的详细分析可以查看本公众号的过往文章GitOps系列|云原生时代,你还不懂GitOps?

极狐GitLab 与 ArgoCD 的集成


极狐GitLab 将作为存储部署清单文件的版本控制系统,与 ArgoCD 做集成,实现 GitOps workflow。整体示意图如下

图片

因此,实现上述流程,需要

  • 极狐GitLab 实例(推荐使用 极狐GitLab SaaS 服务,https://gitlab.cn)

  • 一个运行正常ArgoCD 运行实例

ArgoCD 的安装


ArgoCD 的安装比较简单,可以按照官方给的命令进行安装。

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

但是,为了方便安装 ArgoCD,并使用 Kustomize 来完成对部署清单文件的编排,同时用 sops 来处理敏感信息在极狐GitLab 上的存储(敏感信息的处理是实现 GitOps 很重要的一点)问题。我将 ArgoCD、Kustomize、sops 进行了集成,修改后的安装代码存放在极狐GitLab 的这个仓库。

安装之前,先给大家介绍一下 sops。

sops 介绍

sops 是一款开源的加密文件的编辑器,支持 YAML、JSON、ENV、INI 和 BINARY 格式,同时可以用 AWS KMS、GCP KMS、Azure Key Vault、age 和 PGP 进行加密。由于 PGP(Pretty Good Priva)带有商业性质,所以我使用 GPG(Gnu Privacy Guard)来进行加密。

sops 利用 GPG 生成的一对 key 来完成文件的加解密工作,所以首先探秘 gpg。

探秘 gpg

以 Mac 上的操作为例,先用如下命令安装 gpg

$ brew install gnupg

查看 gpg 的版本以确定是否安装成功

$ gpg --version
gpg (GnuPG/MacGPG2) 2.2.27
libgcrypt 1.8.7
Copyright (C) 2021 Free Software Foundation, Inc.
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /Users/xiaomage/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

接下来用 gpg 命令行生成一对 key

$ gpg --full-generate-key
gpg (GnuPG/MacGPG2) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
  (14) Existing key from card
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 5y
Key expires at Sat Aug 22 16:19:02 2026 CST
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: xiaomage
Email address: devops008@sina.com
Comment: sops and gpg demo
You selected this USER-ID:
    "xiaomage (sops and gpg demo) <devops008@sina.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: key 05A11CD02E66FF4B marked as ultimately trusted
gpg: revocation certificate stored as '/Users/xiaomage/.gnupg/openpgp-revocs.d/ED2A6947C44F9228B39E65B705A11CD02E66FF4B.rev'
public and secret key created and signed.

pub   rsa4096 2021-08-23 [SC] [expires: 2026-08-22]
      ED2A6947C44F9228B39E65B705A11CD02E66FF4B
uid                      xiaomage (sops and gpg demo) <devops008@sina.com>
sub   rsa4096 2021-08-23 [E] [expires: 2026-08-22]

此时,的 private 和 public key 已经生成,其 fingerprint 为 ED2A6947C44F9228B39

E65B705A11CD02E66FF4B。

接着就可以和 sops 做集成了。

关于 gpg 更多的用法,可以用 gpg -h 来查看。

sops 和 gpg 的结合

sops 的安装可以使用下述命令行

$ brew install sops

也可以参考sops 官网进行安装。通过下述命令来查看安装是否成功

$ sops --version
sops 3.7.1 (latest)

接下来就将 gpg 作为加密方式来使用 sops 对存储敏感信息的文件进行加解密演示。对 gpg 的使用有两种方式

  • 将 fingerprint 作为环境变量注入当前环境,sops 会根据 SOPS_PGP_FP 所指定的 fingerprint 去查找对应的 key

  • 创建 .sops.yaml 文件,在里面指定所需的 fingerprint 以及需要加密的字段

本文使用第二种方式来进行演示,而且可以将 .sops.yaml 存储到极狐GitLab 上。将如下内容写到 .sops.yaml 中

$ cat >> .sops.yaml << EOF
> creation_rules:
>   - encrypted_regex: '^(username|title|)$'
>     pgp: 'ED2A6947C44F9228B39E65B705A11CD02E66FF4B'
> EOF

encrypted_regex 代表加密规则,规定需要对哪些字段的值进行加密;gpg 是加密所需的 fingerprint,以本文为例则是 ED2A6947C44F9228B39E65B705A11CD02E66FF4B。

然后创建一个存放敏感信息的文件,诸如

$ cat >> secret.yaml << EOF
> apiVersion: v1
> data:
>     username: eGlhb21hZ2UK=
>     company: SmlIdShHaXRMYWIp=
> kind: Secret
> metadata:
>     labels:
>         app: demo
>     name: sops-demo
>     namespace: jihu-gitlab
> type: Opaque
> EOF

随后执行加密命令

$ sops -e secret.yaml
apiVersion: v1
data:
    username: ENC[AES256_GCM,data:/DqHU5DuhnWsnS3OoA==,iv:y8EQa6JOl+wElUeNaBUJyqRrVLMUOzVWiBqaXTi0yr4=,tag:8LcJ874DhdJJP5YO3bIzxQ==,type:str]
    company: ENC[AES256_GCM,data:ilwgbIQ9QN80gA0RuruQpVU=,iv:C/DVvZjr/E0cPSkpmzxZSNhiFYHRa6CdVPEqlGzj+s0=,tag:pj70zGTpYWomV8kCU5XeYQ==,type:str]
kind: Secret
**内容较长,只截取加密部分**

可以看到敏感信息 username: eGlhb21hZ2UK=(username: xiaomage)以及 company: SmlIdShHaXRMYWIp=(company: JiHu(GitLab))都被加密了。

至此我们就可以使用这个仓库的指导来完成 ArgoCD 的安装。

以在 Desktop Kubernetes 上安装为例

$ kubectl get nodes
NAME             STATUS   ROLES                  AGE   VERSION
docker-desktop   Ready    control-plane,master   20d   v1.21.2

clone 上述代码至本地

$ git clone git@gitlab.cn:xiaomage/argocd.git

创建安装 argocd 的 namespace:argocd

$ kubectl create ns argocdnamespace/argocd created

将前面生成的 gpg private key 导出

$ gpg --armor --export-secret-keys <your gpg identity key id > deploy-key.asc

将上述导出的 gpg private key 创建为 secret,只要是为了在 ArgoCD 中集成 sop

$ kubectl -n argocd create secret generic deploy-pgp-key --from-file=deploy-key.asc

执行安装命令

$ kubectl -n argocd apply -f install.yaml

查看安装结果

$ kubectl -n argocd get pods 
NAME                                 READY   STATUS    RESTARTS   AGE
argocd-application-controller-0      1/1     Running   0          33s
argocd-dex-server-f8b64d975-6zshw    1/1     Running   0          34s
argocd-redis-9567956cd-qsvsm         1/1     Running   0          34s
argocd-repo-server-b79fb8c7b-qhtwn   1/1     Running   0          34s
argocd-server-6db46c865b-44482       1/1     Running   0          33s

然后用下面的命令来暴露 argocd 的服务

$ kubectl -n argocd port-forward pods/argocd-server-6db46c865b-qqnbl 8080:8080

获取登陆密码

$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
RDMpJRKRfsmkcgbP

紧接着就可以用 http://localhost:8080 来进行访问并用用户名 admin 及上述密码进行登陆了。

ArgoCD 的使用


接下来就是配置 ArgoCD 了,大体分为以下几步:

图片

极狐GitLab 仓库的添加

图片

gpg public key 的添加

使用如下命令导出 gpg public key 并进行添加

$ gpg --armor --export 852CD8F0188F5521200DAD49D5104ECDA82480F1

图片

ArgoCD Project 创建

图片

ArgoCD Project 配置

图片

接下来就是最后的压轴环节:在 ArgoCD Project 下面添加 application,来让 GitOps 飞起来。

此时在 gitops-argocd namespace 下面可以查看运行的应用程序

$ kubectl -n gitops-argocd get pods
NAME                      READY   STATUS    RESTARTS   AGE
deploy-766c4cbbfc-m8dz6   1/1     Running   0          53m

查看此应用程序的输出

$ kubectl -n gitops-argocd port-forward pods/deploy-766c4cbbfc-m8dz6 9999:9999
$ curl localhost:9999/jihu
Hello JiHu GitLab,this is xiaomage,version is v6.1.0

至此 ArgoCD 的安装配置已经完成,且此 ArgoCD 实例已经在监听配置的极狐GitLab 的仓库。如果上述仓库的配置文件发生了变化,则变化会被自动同步至Kubernetes 集群侧。

ArgoCD GitOps workflow 验证


修改仓库的配置文件,比如修改 deployment.yaml 文件中的 image,则 ArgoCD 会监听到此次变更,并对 deployment 进行更新升级。

此时,再查看应用程序的输出

$ kubectl -n gitops-argocd port-forward pods/deploy-8587d5b58d-ffxqj 9999:9999
$ $ curl localhost:9999/jihu
Hello JiHu GitLab,this is xiaomage,version is v5.1.0

返回信息中的 V6.1.0 已经变成了 v5.1.0 说明变更已经被同步到了 Kubernetes 集群侧。

至此,极狐GitLab 和 ArgoCD 完美集成,并实现了 GitOps workflow:

  • 极狐GitLab 作为单一可信源,存储部署清单文件

  • ArgoCD 作为 GitOps 工具

两者实现了:只要极狐GitLab 仓库中的文件发生变化,则变更会在 ArgoCD 的操作下自动(也可手动)同步至 Kubernetes 集群侧。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小航助学2023年6月GESP_Scratch三级真题(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号 单选题2.00分 删除编辑附件图文 答案:D 第1题高级语言编写的程序需要经过以下&#xff08; &#xff09;操作&#xff0c;可以生成在计算机上运行的可执行代码。 A、编辑B…

jQuery ajax读取本地json文件 三级联动下拉框

步骤 1&#xff1a;创建本地JSON文件 {"departments": [{"name": "会计学院","code": "052"},{"name": "金融学院","code": "053"},{"name": "财税学院",&qu…

python爬虫基础html内容解析库BeautifulSoup

我们通过Requests请求url获取数据&#xff0c;请求把数据返回来之后就要提取目标数据&#xff0c;不同的网站返回的内容通常有多种不同的格式&#xff0c;一种是 json 格式&#xff0c;我们可以直接通过json.loads转换python的json对象处理。另一种 XML 格式的&#xff0c;还有…

Facebook引流脚本的优势与编写教程!

在当今的数字化时代&#xff0c;社交媒体已经成为企业进行营销和推广的重要渠道之一&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;拥有数十亿的用户&#xff0c;为企业提供了无限的引流可能性。 然而&#xff0c;对于企业来说&#xff0c;在Facebook上吸引…

Java se之类和对象

目录 类的定义格式如何去自定义this的引用如何初始化对象构造方法的定义和使用 类的定义格式 class ClassName{ //属性(成员变量) //行为(成员方法) } 1>变量与方法 1.成员变量:普通成员变量 静态成员变量 2.成员方法:普通成员方法 静态成员方法 其中的静态变量与方法,在后…

传输层之TCP协议

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

最优化理论复习--对偶理论及灵敏度分析(一)

文章目录 上一篇对偶表示对偶问题的基本性质对偶问题的经济学解释&#xff1a;影子价格下一篇 上一篇 最优化理论复习–单纯形方法 对偶表示 一般情况&#xff1a; 对偶问题与原问题的字母表示: 对偶表示运用表格&#xff1a; m i n ⇒ m a x min \Rightarrow max min⇒m…

AI创作系统ChatGPT网站源码,AI绘画,支持GPT联网提问/即将支持TSS语音对话功能

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

【sgAutocomplete】自定义组件:基于elementUIel-autocomplete组件开发的自动补全下拉框组件(带输入建议的自动补全输入框)

特性&#xff1a; 1、支持本地保存选中过的记录 2、支持动态接口获取匹配下拉框内容 3、可以指定对应的显示label和字段组件key 4、自动生成速记符字段&#xff08;包含声母和全拼两种类型&#xff09;&#xff0c;增强搜索匹配效率 sgAutocomplete源码 <template><!…

【Linux】无法使用 screenfetch 查看系统信息,报错 command not found: screenfetch

问题描述 screenfetch是一个命令行工具&#xff0c;用于在终端显示系统的硬件和软件信息。它会收集各种系统和环境的信息&#xff0c;并以彩色 ASCII 艺术的形式在终端中展示出来。 当你在终端中运行screenfetch命令时&#xff0c;它会检测你的操作系统、主机名、内核版本、C…

利用eclipse导入外部java工程

利用eclipse导入外部java工程&#xff0c;打开eclipse&#xff0c;依次点击File-Import&#xff0c;…按下图依次执行…

vue中使用video.js播放m3u8格式的视频

文章目录 一、前言1.1、[官网](https://docs.videojs.com/)1.2、[Github](https://github.com/videojs/video.js) 二、实现2.1、安装依赖2.2、main.js2.3、video.vue2.4、其它 三、最后 一、前言 实时推送的视频流的需求&#xff0c;vue中就可以使用video.js播放m3u8格式的视频…

在 Mac 上使用浅色或深色外观

在 Mac 上&#xff0c;选取苹果菜单 >“系统设置”&#xff0c;然后点按边栏中的“外观” 。&#xff08;你可能需要向下滚动。&#xff09;选择右侧的“浅色”、“深色”或“自动”。 “浅色”表示不会发生变化的浅色外观。 “深色”表示不会发生变化的深色外观。“深色模式…

火狐浏览器无法打开有道云笔记网页解决

User-Agent Switcher and Manager 安装插件&#xff1a;User-Agent Switcher and Manager 可以直接在火狐插件管理中搜索&#xff0c;或者打开 https://addons.mozilla.org/zh-CN/firefox/addon/user-agent-string-switcher/?utm_sourceaddons.mozilla.org&utm_mediumre…

Spring MVC详解、静态资源访问、拦截器

1. Spring MVC概述 1.1 Spring MVC是什么 SpringMVC是Spring的一个模块&#xff0c;是一个基于MVC设计模式的web框架。 1.2 Spring MVC执行流程。 1.3 组件分析 前端控制器&#xff08;默认配置&#xff09;Dispatcher Servlet 作用&#xff1a;只负责分发请求。可以很好的对…

做题笔记:SQL Sever 方式做牛客SQL的题目--查询每天刷题通过数最多的前二名用户

----查询每天刷题通过数最多的前二名用户id和刷题数 现有牛客刷题表questions_pass_record&#xff0c;请查询每天刷题通过数最多的前二名用户id和刷题数&#xff0c;输出按照日期升序排序&#xff0c;查询返回结果名称和顺序为&#xff1a; date|user_id|pass_count 表单创建…

二十一章网络通信

计算机网络实现了多台计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#xff0c;相互之间可以交换数据。编写网络应用程序前&#xff0c;首先必须明确所要使用的网络协议…

如何搭建废品上门回收小程序

如今&#xff0c;随着环境保护意识的增强&#xff0c;废品的回收和再利用变得越来越重要。为了方便人们进行废品回收&#xff0c;搭建一个废品上门回收的小程序成为了一个不错的选择。本文将介绍如何从零开始搭建一个废品上门回收小程序。 …

JavaSE50题:16.(递归)按顺序打印一个数字的每一位(例如 1234,打印出 1 2 3 4)

文章目录 概述代码执行过程执行结果 概述 按顺序打印一个数字的每一位&#xff08;例如 1234&#xff0c;打印出 1 2 3 4&#xff09;。 因为我们是要按顺序打印1 2 3 4&#xff0c;所以&#xff0c;递归过程的流程图&#xff0c;如图所示&#xff1a; 代码 public static v…

HL 7 是什么

HL7 指的是一组用于在各种医疗服务提供者所使用之软件应用程序之间&#xff0c;传输临床和管理数据的国际标准。这些标准侧重于应用层&#xff0c;即OSI模型中的“第7层”。 HL7标准由国际标准组织Health Level Seven International制作&#xff0c;并被美国国家标准协会和国际…