使用Argo CD和GitOps持续部署到Kubernetes

2023-10-08 19:20

本文主要是介绍使用Argo CD和GitOps持续部署到Kubernetes,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

使用Kubernetes部署你的应用程序可以提供显著的基础设施优势,例如灵活的伸缩、分布式组件的管理以及对应用程序不同版本的控制。然而,随着控制的增加,复杂性也随之增加。持续集成和持续部署(CI/CD)系统通常工作在高抽象级别,以便提供版本控制、更改日志记录和回滚功能。此方法称为GitOps。

GitOps最初是由Weaveworks在2017年的一篇博客文章中提出的,它使用Git作为CI/CD过程的唯一来源,将代码更改集成到每个项目的单个共享存储库中,并使用Pull请求来管理基础设施和部署。

在本篇文章中,你将学习使用Argo CD,这是一种声明式持续交付工具。Argo CD提供了持续交付工具,只要Git存储库中发生更改,该工具就会自动同步和部署你的应用程序。通过管理应用程序的部署和生命周期,它为Kubernetes环境中的版本控制、配置和应用程序定义提供了解决方案,通过易于理解的用户界面组织复杂的数据。它可以处理多种类型的Kubernetes 部署方式,包括Jsonnet、kustomize应用程序、Helm Charts和YAML/json文件,并支持来自GitHub、GitLab和BitBucket的WebHook通知。

下面,你将使用Argo CD从Git仓库中部署和同步应用程序。

第 0 步 - 拥有k8s环境

如果你已拥有 k8s 环境可跳过此步骤

本教程采用CSDN 开发云提供了k8s学习环境,一键创建了k8s环境。CSDN 开发云k8s 学习环境按小时付费使用,每小时仅 0.1元。学习完毕后可以释放主机资源即会停止计费。

点这里一键拥有 k8s 环境。
你也可以使用其他方法创建自己的k8s集群。

在这里插入图片描述
点击【立即购买】后,几分钟后你可以拥有自己的k8s集群。
在这里插入图片描述

在本地计算机上安装kubectl命令行工具,配置为连接到你的集群。kubectl 你可以在官方文档中阅读有关安装的更多信息。

第1步 - 在你的群集上安装Argo CD

要安装Argo CD,你应该首先使用kubectl 检查Kubernetes配置,从中可以ping通你的工作节点。你可以通过运行kubectl get nodes来测试:

kubectl get nodes

此命令返回状态为Ready的节点列表:

NAME         STATUS   ROLES                  AGE   VERSION
k8s-master   Ready    control-plane,master   10d   v1.24.2+k3s1

接下来,在你的集群中创建argocd命名空间

kubectl create namespace argocd

运行AgroCD提供的安装脚本,安装ArgoCD 到上步创建的命名空间

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

命令输出如下

customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/applicationsets.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
serviceaccount/argocd-application-controller created
serviceaccount/argocd-applicationset-controller created
serviceaccount/argocd-dex-server created
serviceaccount/argocd-notifications-controller created
serviceaccount/argocd-redis created
serviceaccount/argocd-repo-server created
serviceaccount/argocd-server created
role.rbac.authorization.k8s.io/argocd-application-controller created
role.rbac.authorization.k8s.io/argocd-applicationset-controller created
role.rbac.authorization.k8s.io/argocd-dex-server created
role.rbac.authorization.k8s.io/argocd-notifications-controller created
role.rbac.authorization.k8s.io/argocd-server created
clusterrole.rbac.authorization.k8s.io/argocd-application-controller created
clusterrole.rbac.authorization.k8s.io/argocd-server created
rolebinding.rbac.authorization.k8s.io/argocd-application-controller created
rolebinding.rbac.authorization.k8s.io/argocd-applicationset-controller created
rolebinding.rbac.authorization.k8s.io/argocd-dex-server created
rolebinding.rbac.authorization.k8s.io/argocd-notifications-controller created
rolebinding.rbac.authorization.k8s.io/argocd-redis created
rolebinding.rbac.authorization.k8s.io/argocd-server created
clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller created
clusterrolebinding.rbac.authorization.k8s.io/argocd-server created
configmap/argocd-cm created
configmap/argocd-cmd-params-cm created
configmap/argocd-gpg-keys-cm created
configmap/argocd-notifications-cm created
configmap/argocd-rbac-cm created
configmap/argocd-ssh-known-hosts-cm created
configmap/argocd-tls-certs-cm created
secret/argocd-notifications-secret created
secret/argocd-secret created
service/argocd-applicationset-controller created
service/argocd-dex-server created
service/argocd-metrics created
service/argocd-notifications-controller-metrics created
service/argocd-redis created
service/argocd-repo-server created
service/argocd-server created
service/argocd-server-metrics created
deployment.apps/argocd-applicationset-controller created
deployment.apps/argocd-dex-server created
deployment.apps/argocd-notifications-controller created
deployment.apps/argocd-redis created
deployment.apps/argocd-repo-server created
deployment.apps/argocd-server created
statefulset.apps/argocd-application-controller created
networkpolicy.networking.k8s.io/argocd-application-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-dex-server-network-policy created
networkpolicy.networking.k8s.io/argocd-redis-network-policy created
networkpolicy.networking.k8s.io/argocd-repo-server-network-policy created
networkpolicy.networking.k8s.io/argocd-server-network-policy created

安装成功后,你可以使用-w参数查看你的Kubernetes实例的状态:

kubectl get pods -n argocd -w

大概 10 分钟左右,应该有七个Pod最终状态变为Running

NAME                                                READY   STATUS    RESTARTS   AGE
argocd-redis-558cfbbf7-wqzdj                        1/1     Running   0          17m
argocd-applicationset-controller-57fb5db8b8-lzqh5   1/1     Running   0          17m
argocd-notifications-controller-6bd6776bd7-4pd47    1/1     Running   0          17m
argocd-server-dcfd4d4b9-fqjmn                       1/1     Running   0          17m
argocd-application-controller-0                     1/1     Running   0          17m
argocd-repo-server-85559669dd-trkjz                 1/1     Running   0          17m
argocd-dex-server-6546bffb9f-szjwq                  1/1     Running   0          17m

你可以按Ctrl+C退出watch界面。现在你已经在你的Kubernetes集群中运行了Argo CD!然而,Argo CD 的服务没有对外直接暴露,你无法直接访问它。下面你将通过集群内部转发的方式访问它。

第2步 - 转发端口以访问Argo CD

由于Kubernetes将服务部署到集群内的集群内网络地址,因此你需要转发相关端口才能从本地计算机访问它们。你可以用kubectl -n argocd get svc查看 Argo CD 提供的服务

argocd-applicationset-controller          ClusterIP   10.43.79.106    <none>        7000/TCP,8080/TCP            9m14s
argocd-dex-server                         ClusterIP   10.43.76.26     <none>        5556/TCP,5557/TCP,5558/TCP   9m14s
argocd-metrics                            ClusterIP   10.43.138.214   <none>        8082/TCP                     9m14s
argocd-notifications-controller-metrics   ClusterIP   10.43.87.76     <none>        9001/TCP                     9m13s
argocd-redis                              ClusterIP   10.43.69.17     <none>        6379/TCP                     9m13s
argocd-repo-server                        ClusterIP   10.43.187.43    <none>        8081/TCP,8084/TCP            9m13s
argocd-server                             ClusterIP   10.43.42.15     <none>        80/TCP,443/TCP               9m13s
argocd-server-metrics                     ClusterIP   10.43.239.140   <none>        8083/TCP                     9m13s

Argo CD在443端口启动了一个名为argocd-server的服务。我们使用kubectl port-forward将服务argocd-server映射到本地的 8080 端口:

kubectl port-forward svc/argocd-server -n argocd 8080:443

命令运行后开始进行端口转发,程序不会退出,下面在终端中的操作你将在新终端窗口中进行。当你想要停止转发端口时,可以按Ctrl+C退出端口转发。

你可以在Web浏览器中访问localhost:8080来访问Argo CD。但是,系统将提示你输入登录密码,你需要在下一步中使用命令行获得该密码。你可能需要单击安全警告,因为Argo CD尚未配置有效的SSL证书。

image-20220723111400701

注意:在Kubernetes中使用LetsEncrypt HTTPS证书推荐使用工具 Cert-Manager。详细设置过程参考博文:如何在Kubernetes 上部署安装PHP + Nginx 多容器应用

第3步 - 从命令行使用Argo CD

在接下来的步骤中,你需要在本地安装argocd命令,以便与Argo CD实例交互并更改其中的设置。建议你通过Homebrew包管理器进行安装,其他方法的安装可以参考Argo CD的官方文档。

在MacOS上管理命令行工具时,Homebrew非常流行,最近它也被移植到了Linux上,就是说在 Linux 上同样可以使用Homebrew安装工具。

如果你尚未安装Homebrew,可以使用一行命令安装它:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

在安装过程中,系统可能会提示你输入密码。之后,你可以在你的终端上使用brew命令安装Argo CD:

brew install argocd

这又提供了argocd命令。在使用之前,你需要再次使用kubectl来获取安装过程中自动生成的管理员密码,以便你可以使用它进行登录。你将向它传递使用Kubernetes Secret存储的特定JSON文件的路径,并提取相关的值:

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

命令输出如下

raPLOYzdmugjxFWD

这时,你可以通过在浏览器中返回到localhost:8080并以admin用户身份和上步得到的密码登录到你的Argo CD控制台:

image-20220723111521282

一切正常后,你可以使用相同的密码通过命令行运行argocd login登录Argo CD。这将是稍后从命令行部署所必需的:

argocd login localhost:8080

命令执行情况如图

image-20220723111757854

你将在此处的命令行上再次收到等同的证书警告,并应在出现提示时输入y以继续。如果需要,你可以通过运行argocd count update-password将你的密码更改为更安全或更容易记住的密码。

接下来你将学习如何使用Argo来实际部署一些示例应用程序。

第4步 - 处理多个群集的情况(可选)

在部署应用程序之前,你应该检查你实际想要将其部署到哪里。默认情况下,Argo CD会将应用程序部署到Argo CD本身运行的同一集群中,这对于演示来说很好,但在生产中可能不是你想要的。为了列出你当前已知的所有集群,你可以使用kubectl config

kubectl config get-contexts -o name
test-deploy-cluster
test-target-cluster

假设你已经将Argo CD安装到test-dploy-cluster中,并且你想使用它将应用部署到test-target-cluster上,则可以通过运行argocd cluster addtest-Target-cluster注册到Argo CD:

argocd cluster add target-k8s

这会将其他集群的详细信息添加到Argo CD,并使Argo CD能够在该集群上部署服务。

第5步 - 部署示例应用程序

现在你已经运行了Argo CD,并且了解了如何将应用程序部署到不同的Kubernetes集群,是时候将其付诸实践了。Argo CD项目维护了一个示例应用程序存储库,这些示例应用程序的架构旨在展示GitOps基础知识。

下面你将部署示例程序guestbook

你将使用argocd app create命令,提供Git仓库的路径,helm-guestbook示例的目录,并传递你的默认服务器和命名空间。

argocd app create guestbook --repo https://gitcode.net/hjue/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default

命令输出如下

application 'guestbook' created

在Argo CD创建应用程序后,可以通过argocd app get查看其状态:

argocd app get guestbook

命令输出如下

Name:               guestbook
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          default
URL:                https://localhost:8080/applications/guestbook
Repo:               https://gitcode.net/hjue/argocd-example-apps.git
Target:
Path:               guestbook
SyncWindow:         Sync Allowed
Sync Policy:        <none>
Sync Status:        OutOfSync from  (53e28ff)
Health Status:      MissingGROUP  KIND        NAMESPACE  NAME          STATUS     HEALTH   HOOK  MESSAGEService     default    guestbook-ui  OutOfSync  Missing
apps   Deployment  default    guestbook-ui  OutOfSync  Missing

状态OutOfSync表示你已经从代码仓库检索到了应用程序的部署文件,并在Argo CD中为其创建了一个条目,但是你还没有为它创建任何Kubernetes资源。为了实际部署应用程序,你需要运行argocd app sync

argocd app sync guestbook

sync在这里和部署是同义词,符合GitOps的原则。使用Argo CD时的目标是让你的应用程序始终与其仓库中的配置一致。

TIMESTAMP                  GROUP        KIND   NAMESPACE                  NAME    STATUS    HEALTH        HOOK  MESSAGE
2022-07-23T11:58:26+08:00   apps  Deployment     default          guestbook-ui  OutOfSync  Missing
2022-07-23T11:58:26+08:00            Service     default          guestbook-ui  OutOfSync  Missing
2022-07-23T11:58:26+08:00            Service     default          guestbook-ui    Synced  Healthy
2022-07-23T11:58:26+08:00            Service     default          guestbook-ui    Synced   Healthy              service/guestbook-ui created
2022-07-23T11:58:26+08:00   apps  Deployment     default          guestbook-ui  OutOfSync  Missing              deployment.apps/guestbook-ui created
2022-07-23T11:58:26+08:00   apps  Deployment     default          guestbook-ui    Synced  Progressing              deployment.apps/guestbook-ui createdName:               guestbook
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          default
URL:                https://localhost:8080/applications/guestbook
Repo:               https://gitcode.net/hjue/argocd-example-apps.git
Target:
Path:               guestbook
SyncWindow:         Sync Allowed
Sync Policy:        <none>
Sync Status:        Synced to  (53e28ff)
Health Status:      ProgressingOperation:          Sync
Sync Revision:      53e28ff20cc530b9ada2173fbbd64d48338583ba
Phase:              Succeeded
Start:              2022-07-23 11:58:26 +0800 CST
Finished:           2022-07-23 11:58:26 +0800 CST
Duration:           0s
Message:            successfully synced (all tasks run)GROUP  KIND        NAMESPACE  NAME          STATUS  HEALTH       HOOK  MESSAGEService     default    guestbook-ui  Synced  Healthy            service/guestbook-ui created
apps   Deployment  default    guestbook-ui  Synced  Progressing        deployment.apps/guestbook-ui created

你现在已经成功地使用Argo CD部署了一个应用程序!可以从Argo CD Web界面完成相同的任务,但通过命令行部署更快、更方便。在部署后查看Argo CD Web控制台以验证你的应用程序是否正常运行是非常有帮助的。在浏览器中打开localhost:8080即可看到:

image-20220723120258456

点击guestbook查看应用详细状态

image-20220723120232350

guestbook应用的 image 比较大,第一次部署时间比较长。从图中可以看到应用还正在部署中,等待一段时间后,APP部署完成。

image-20220723123254910

此时,最后要做的是确保你可以在浏览器中访问新部署。为此,你将转发另一个端口,就像你对Argo CD本身所做的那样。在内部,guestbook应用程序运行在普通的http端口80上,为了避免与你自己的80端口或你的Argo CD使用的8080端口上运行的任何东西冲突,你可以将其转发到9090端口:

kubectl -n default port-forward svc/guestbook-ui 9090:80

然后,你可以在浏览器窗口中打开localhost:9090,查看你的示例Guestbook应用程序:

image-20220723122949599

对此Git存储库的任何进一步推送都将反映在ArgoCD中,这将帮助你不断的同步你的部署。

结论

现在你已经了解了使用Argo CD安装和部署应用程序的基础知识。因为Kubernetes部署相当比较复杂,所以确保你的部署文件尽可能可维护是很重要的,GitOps理念是一个很好的解决方案。

这篇关于使用Argo CD和GitOps持续部署到Kubernetes的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/167470

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P