使用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 add
将test-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