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

Posted 多鱼的夏天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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和GitOps持续部署到Kubernetes的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Tekton 与 Argo CD 结合实现 GitOps

Argo CD 使用

Argo CD 使用

持续部署工具Argo CD - 使用