持续部署工具Argo CD - 使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了持续部署工具Argo CD - 使用相关的知识,希望对你有一定的参考价值。

参考技术A

通过ui面板, Settings -> Projects 设置新的项目名和描述,点击创建完毕的项目进入设置。

sources 指定的是 git repo 的地址,可以添加多个
destinations 指定集群,也可以指定多个
这样添加之后在新增 app 时即可从 project 中选择了

通过 crontab 类似的定时规则,限制项目中的app是否可同步,

如这里两条规则:
第一条:
status 表示不在生效时段
windows 表示周一的每小时的0分持续5分钟拒绝同步
第二条:
status 表示在生效时段
windows 表示每时每刻都允许同步
这里拒绝的规则和允许的规则重叠的时段,拒绝的规则将优先生效

同时在app页面将可看到当前同步窗口的状态

红色表示拒绝同步,黄色表示允许手动同步,绿色表示允许同步

未做深入研究,配合OIDC使用

一个app表示一组跟踪的资源文件,如 deployment + service 的经典组合

SYNC POLICY: 自动 or 手动同步。
PRUNE LAST: 最后才做删除操作,根据需求使用。
REPLACE: 放弃 kubectl apply,使用 kubectl replace 或kubectl create 。
PRUNE PROPAGATION POLICY: 策略的解释点此 查看

Repository URL: 资源文件地址,支持 kustomize、helm、ksonnet、jsonnet files、yaml files 等格式
Revision: 跟踪的分支或 tag 名
Path: 资源文件相对根目录的路径
Cluster URL: 部署的集群
namespace: 集群命名空间
创建完成,点击 sync 同步

顶部 App Details 查看app详情并编辑
App Diff 当前部署状态与git资源定义有差异时可点击查看
sync 同步按钮,且可选择部分组件同步

Sync Status 同步状态,当同步失败时,可查看失败原因
History and rollback 查看所有部署历史及对应git记录,并回滚部署

新增集群只能通过 cli 命令

准备好新集群的.kubeconfig文件

此时将会提示你缺少名字

再次输入命令并带上Name栏下的值,如

提示 Cluster \'https://35.241.90.107\' added ,表示新增集群成功

通过ui面板, Settings -> Clusters 可以查看到集群已经加入进来

通过ui面板, Settings -> Projects 选择项目,在 DESTINATIONS 处勾选新集群和命名空间

目前单个app不支持直接部署到多个集群,只能通过在不同集群中创建新应用

相关文章
持续部署工具Argo CD - 安装

使用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证书。

注意:在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控制台:

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

argocd login localhost:8080

命令执行情况如图

你将在此处的命令行上再次收到等同的证书警告,并应在出现提示时输入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即可看到:

点击guestbook查看应用详细状态

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

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

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

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

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

结论

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

以上是关于持续部署工具Argo CD - 使用的主要内容,如果未能解决你的问题,请参考以下文章

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

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

云原生 | kubernetes - Argo CD 持续交付

持续集成:什么是持续集成(CI)持续交付(CD)和持续部署(CD)

持续集成jenkins工具使用之部署

持续集成指南:Gitlab CI/CD 自动部署前端项目