在典型的基于推送的部署中,Ansible和Jenkins等工具直接连接到服务器或集群并执行配置命令。当集群在网络上可以访问,并且你的部署服务器和目标服务器之间有直接的连接时,这种方法效果很好。出于合规或安全原因,部署工具和集群之间的连接可能是不可能的。
Argo CD是一个基于拉动的部署工具。它观察远程Git存储库的新的或更新的清单文件,并将这些变化与集群同步。通过在Git中管理清单并与集群同步,你可以获得基于Git的工作流程的所有优势(版本控制、拉动请求审查、协作的透明度等),以及Git repo中的内容与集群中部署的内容之间的一对一映射。这种方法被称为GitOps。
在本教程中,你将:
安装Argo CD
本教程使用Minikube v1.21.0版本。如果你没有它,请下载并安装Minikube。
在Minikube启动和运行后,你可以安装Argo CD。Argo CD文档包含了如何为任何集群安装和配置它的详细步骤。一旦你执行了这些步骤,在一个单独的终端窗口运行minikube tunnel ,以确保Minikube在你的本地系统上暴露Argo CD服务器的负载平衡器端点。为了验证这一点,运行kubectl get po -n argocd ,检查argo-server 服务是否有EXTERNAL-IP:
user@system ~ kubectl get svc -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-dex-server ClusterIP 10.110.2.52 5556/TCP,5557/TCP,5558/TCP 3h32m
argocd-metrics ClusterIP 10.100.73.57 8082/TCP 3h32m
argocd-redis ClusterIP 10.104.11.24 6379/TCP 3h32m
argocd-repo-server ClusterIP 10.100.132.53 8081/TCP,8084/TCP 3h32m
argocd-server LoadBalancer 10.98.182.198 10.98.182.198 80:32746/TCP,443:31353/TCP 3h32m
argocd-server-metrics ClusterIP 10.105.182.52 8083/TCP 3h32m
一旦安装完成,负载平衡器工作,Argo CD的用户界面(UI)就可以在EXTERNAL IP 。
在谈论Argo CD部署之前,你需要一个带有Kubernetes(k8s)清单文件的Git repo,准备进行部署。我使用的是我的公共 repoexample-assets,在/argocd/getting-started ,有一个Nginx部署清单文件。
目标是让Argo CD监听k8s清单文件的变化,然后与它所部署的集群(本例中是Minikube)同步。你可以通过创建一个包含清单文件的源 repo、目标集群细节和同步策略信息的应用程序来做到这一点。
点击左上角的New App ,配置一个新的应用程序。由于我的目标Kubernetes服务器是Argo CD安装的服务器(Minikube),我把服务器的默认值保持不变。这些是我配置的值。
- 应用程序名称。
ayush-test-application - 项目。
default - 同步策略。
automated - 同步选项。
prune: true; selfHeal: true - 源码库URL。
https://gitlab.com/ayush-sharma/example-assets.git - 来源修订版。
HEAD - 源路径。
argocd/getting-started - 目的地集群URL。
https://kubernetes.default.svc - 目的地命名空间。
default
为了方便起见,你可以点击右上方的EDIT AS YAML ,然后粘贴进去。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: ayush-test-application
spec:
destination:
name: 'default'
namespace: default
server: 'https://kubernetes.default.svc'
source:
path: argocd/getting-started
repoURL: 'https://gitlab.com/ayush-sharma/example-assets.git'
targetRevision: HEAD
project: default
syncPolicy:
automated:
prune: true
selfHeal: true
你的配置应该看起来像这样。
保存配置后,你的应用程序应该在主页上显示为一个卡片。由于你指定了同步策略为Automated ,你的新应用程序将立即开始与版本库进行同步。
创建Nginx部署
在本教程中,清单文件是一个具有三个副本的标准Nginx部署。一旦ayush-test-application 完成同步,Argo CD 将显示一个漂亮的部署图形视图。
使用kubectl get po 验证部署。
NAME READY STATUS RESTARTS AGE
nginx-deployment-585449566-584cj 1/1 Running 0 5m
nginx-deployment-585449566-6qn2z 1/1 Running 0 5m
nginx-deployment-585449566-d9fm2 1/1 Running 0 5m
Argo CD的优势
Argo CD是一种相对轻量级的k8s部署方法。我特别喜欢 repo 中的内容和集群中的内容之间的一对一关系,使事件管理变得更加简单。
另一个很大的优势是,由于Git repo包含了Argo CD所需要的一切,你可以删除整个Argo CD的安装,从头开始设置。这意味着在发生灾难性故障的情况下,建立第二个相同的集群并部署整个工作负载是更加可行和实用的。
第三大优势是更少的开放端口。Argo CD从远程Git repo拉取变化,所以不需要定义防火墙规则和虚拟私有云(VPC)对等连接来让你的部署服务器与你的集群连接,这就少了一个入口点。这大大减少了你的开发、质量保证(QA)和生产服务器的攻击面。
由于Git repo和分支名称是可配置的,你可以创造性地使用部署模型。例如,你可以让两个不同的Argo CD在两个不同的QA和生产集群上运行,监听同一个 repo的分支。这样可以保证在两个集群上部署相同的清单文件,确保QA和生产环境包含相同的代码库。此外,一个Argo CD能够针对多个服务器,这意味着枢纽和辐条部署模式是可能的,即一个主Argo CD协调不同地区或环境中的多个开发、QA和生产集群的部署工作。
在Argo CD上发挥创意,别忘了与他人分享你的实验。