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

2023-05-16

引言

使用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:      Missing

GROUP  KIND        NAMESPACE  NAME          STATUS     HEALTH   HOOK  MESSAGE
       Service     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 created

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:        Synced to  (53e28ff)
Health Status:      Progressing

Operation:          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  MESSAGE
       Service     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理念是一个很好的解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Argo CD和GitOps持续部署到Kubernetes 的相关文章

随机推荐

  • ros里Catkin的CMakelists/package.xml

    Catkin是基于CMake的编译构建系统 xff0c 具有以下特点 xff1a Catkin沿用了包管理的传统像 find package 基础结构 pkg config扩展了CMake xff0c 例如 软件包编译后无需安装就可使用 自
  • js根据坐标进行图片截图,获取图片上指定位置的截图

    根据坐标截取图片上指定的区域 xff0c 坐标可以是规则的图片截取 xff0c 也可以是不规则的图片截取 实现思路 xff1a 规则裁剪自然不用多说 xff0c 我们使用画布的getImageData x y width height 方法
  • 浅谈APM系列-----update_flight_mode(ModeAltHold)

    update flight mode xff08 ModeAltHold xff09 这里只看ModeAltHold 位置 xff1a X ardupilot ArduCopter mode cpp update flight mode c
  • 多态的总结

    对于多态 xff0c 可以总结以下几点 xff1a 一 使用父类类型的引用指向子类的对象 xff1b 二 该引用只能调用父类中定义的方法和变量 xff1b 三 如果子类中重写了父类中的一个方法 xff0c 那么在调用这个方法的时候 xff0
  • android 深度图

    在 Android开发中自定义控件是一个范围很广的话题 xff0c 讲起自定义控件 xff0c 从广度上来划分的话 xff0c 大体上可以划分为 xff1a View ViewGroup的绘制事件分发各种动画效果滚动嵌套机制还有涉及到相关的
  • 在配置Intel realsense (D435i)时遇到的问题

    1 第一次配置相机时 配置完成后 运行相机报以下错误 02 11 20 50 18 674 WARNING 140196725126912 messenger libusb cpp 42 control transfer returned
  • Robosense M1/速腾半固态激光雷达M1 保姆级教程1-如何连接雷达?

    引言 当我们拿到M1雷达时 xff0c 可能会因为激光雷达是一个新的设备 xff0c 没有用过 xff0c 而感到紧张和局促 没有关系 xff0c 通过阅读文本 xff0c 可以让你轻而易举的上手使用激光雷达 1认识M1接口 图中较粗的接口
  • PMP(一):知识要点汇总

    开篇 首先恭喜自己成为 项目管理专业人士 的一员 xff0c 本专题旨在帮助自己重新梳理整个的知识体系以及后续对于项目管理的理解与尝试 系列一 xff1a 知识要点汇总 以下内容是我在备考和考完后对于部分知识要点的一个汇总和总结 xff0c
  • git在vscode中的使用

    git在vscode中的使用 vscode 作为前端使用较多的软件 xff0c 平时的git操作不可避免 xff0c 但是利用vscode自带的功能和插件 xff0c 可以让我们的工作效率提高不少 项目准备 直接clone span cla
  • 获利空间看刘嘉玲理论来看;乐扣乐扣尽量靠近k

    i tiboo cn 1768805 i tiboo cn 1768806 i tiboo cn 1768807 i tiboo cn 1768810 i tiboo cn 1768813
  • 我见过最清晰的--理解梯度,散度,旋度

    作者 xff1a FRANK WANG 链接 xff1a https www zhihu com question 24074028 answer 26657334 来源 xff1a 知乎 梯度 运算的对像是纯量 运算出来的结果会是向量在一
  • 视觉应用工程师-环境安装教学视频-Mac系统其他操作

    立即学习 https edu csdn net course play 29993 432706 utm source 61 blogtoedu Mac系统安装miniconda搭建深度学习环境 安装 Conda是一个开源的包 环境管理器
  • Windows 环境下安装Redis 5.0.x 服务图文教程

    Windows 环境下安装Redis 5 0 x 服务图文教程 Redis官网并没有提供windows的安装包 xff0c github有第三方制作的windows安装包 下载地址 xff1a https github com tporad
  • Python 爬虫+可视化,手把手教你使用 Python 爬取 JD 网站并且可视化展示

    当你看到别人使用 Python 网络爬虫做出一些高大上的项目你是否也有那么一点点的心动 xff1f 羡慕别人用几行简单的代码就能获取到自己想要的数据 xff1f 羡慕别人用几行代码就能做出优美的可视化图案 xff1f 我将使用最新 Pyth
  • 推荐系统实践:基于数据集MovieLens构造简单推荐系统

    摘要 本文基于 MovieLens 数据集构造了用户 电影项目评价矩阵 xff0c 并基于评价矩阵计算两用户间的相似度 xff0c 取出相似度最高的 N 个用户作为候选用户序列 接着筛选出这 N 个候选用户的高分电影项目且当前用户尚未观看
  • Flask 入门教程:Jinja2模板用法

    Jinja2模板引擎简介 模板 在前面的示例中 xff0c 视图函数的主要作用是生成请求的响应 xff0c 这是最简单的请求 实际上 xff0c 视图函数有两个作用 xff1a 处理业务逻辑和返回响应内容 在大型应用中 xff0c 把业务逻
  • VINS-mono中坐标系定义以及通过VINS-mono求解无人机位姿

    因为在科研中需要使用VINS mono算法来为无人机提供位姿估计信息 因此需要搞清楚VINS mono相应坐标系以及无人机坐标系之间的关系 目录 1 坐标系关系 1 1 VINS mono坐标系定义 1 2 无人机坐标系 2 通过VINS
  • Github Copilot 开始收费了, 帮你列出些替代的插件

    今天打开 VSCode xff0c 弹出了Github Copilot 开始收费的通知 可以免费用到 8 月 22 日 xff0c 每月 70 元还是有些小贵 这里给大家推荐一些替代品 xff1a Kite https www kite c
  • 如何在 Ubuntu上使用 Nginx 设置密码验证

    介绍 设置 Web 服务器时 xff0c 您通常希望限制访问网站的某些部分 Web 应用程序通常提供自己的身份验证和授权方法 xff0c 但如果这些方法不充分或不可用 xff0c 则可以使用 Web 服务器本身来限制访问 在本指南中 xff
  • 使用Argo CD和GitOps持续部署到Kubernetes

    引言 使用Kubernetes部署你的应用程序可以提供显著的基础设施优势 xff0c 例如灵活的伸缩 分布式组件的管理以及对应用程序不同版本的控制 然而 xff0c 随着控制的增加 xff0c 复杂性也随之增加 持续集成和持续部署 CI C