介绍
使用Kubernetes来部署您的应用程序可以提供显著的基础设施优势,例如灵活的缩放,分布式组件的管理,以及控制您应用程序的不同版本. 然而,随着管制的增加,情况变得更加复杂。 连续集成和连续部署(CI/CD)系统通常在高抽象度下工作,以提供版本控制,更改记录,并回滚功能. 这种抽象层的通俗取法被称作_GitOps_.
GitOps 最初是由 Weaveworks在 2017年博客帖子中提出的,它使用 Git作为 CI/CD 流程的单一真理来源
,将代码变更整合到每个项目的单一共享存储库中,并使用拉动请求来管理基础设施和部署。
在Kubernetes上,有几种工具将Git作为DevOps进程的协调中心. 在此教程中, 您将学会使用 [Argo CD (https://argoproj.github.io/argo-cd ), 一个声明式连续传送工具 。 Argo CD 提供连续传送工具, 当您的 GitHub 寄存器发生更改时, 它会自动同步和部署您的应用程序 。 它通过管理一个应用程序的部署和生命周期,为库贝涅斯环境中的版本控制,配置,以及应用程序定义提供解决方案,用易于理解的用户界面组织复杂的数据. 它可以处理几种类型的库伯涅特表,包括Jsonnet,Kustomize应用程序,Helm图表,和YAML/json文件,并支持从GitHub,GitLab,和Bitbucket发出的webhook通知.
在本文中,您将使用Argo CD来同步和部署来自GitHub存储库的应用程序。
如果您正在寻找一个管理的Kubernetes托管服务,请查看我们的简单的,用于增长的管理的Kubernetes服务(https://www.digitalocean.com/products/kubernetes)。
前提条件
要遵循本教程,您将需要:
- 联合国 您本地的 Linux/ MacOS/ BSD 机器上的 SSH 密钥对 。 如果您之前没有使用过SSH密钥,可以通过遵循此解释如何在本地机上设置SSH密钥来学习如何设置. 如果您正在使用 Windows, 您应该在 Linux ([ LINK1] ) 环境中工作 。
- 联合国 现有的Kubernetes集群至少有一个工人节点。 kubectl 应安装在您的工作环境中,并能够连接到您的集群. DigitalOcean 的 [Managed Kubernetes] (https://www.digitalocean.com/products/kubernetes/ ) 默认情况下会为您提供这样的配置 。 如果您正在使用 DigitalOcean 的 Kubernetes, 您应该审查 [如何连接集群] (https://docs.digitalocean.com/products/kubernetes/how-to/connect-to-cluster/ ) 。
- 熟悉Kubernetes的概念。 详情请参见本条Kubernetes简介。 .
步骤 1 — 在您的集群上安装 Argo CD
要安装Argo CD,你首先应该有一个有效的Kubernetes配置设置与kubectl
,从那里你可以 ping你的工人节点. 你可以通过运行kubectl得到节点
来测试这一点:
1kubectl get nodes
此命令应返回具有准备
状态的节点列表:
1[secondary_label Output]
2NAME STATUS ROLES AGE VERSION
3pool-uqv8a47h0-ul5a7 Ready <none> 22m v1.21.5
4pool-uqv8a47h0-ul5am Ready <none> 21m v1.21.5
5pool-uqv8a47h0-ul5aq Ready <none> 21m v1.21.5
如果kubectl
未返回一组具有准备
状态的节点,您应该检查您的集群配置和 Kubernetes 文档。
接下来,在您的集群中创建argocd
名称空间,其中将包含Argo CD及其相关服务:
1kubectl create namespace argocd
之后,您可以运行项目维护者提供的 Argo CD 安装脚本。
1kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
一旦安装顺利完成,您可以使用观看
命令来检查您的Kubernetes pods的状态:
1watch kubectl get pods -n argocd
默认情况下,应该有五个 pods 最终获得运行
状态,作为存储 Argo CD 安装的一部分。
1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3argocd-application-controller-0 1/1 Running 0 2m28s
4argocd-dex-server-66f865ffb4-chwwg 1/1 Running 0 2m30s
5argocd-redis-5b6967fdfc-q4klp 1/1 Running 0 2m30s
6argocd-repo-server-656c76778f-vsn7l 1/1 Running 0 2m29s
7argocd-server-cd68f46f8-zg7hq 1/1 Running 0 2m28s
您可以按「Ctrl+C」來離開「watch」接口. 您現在有Argo CD在您的Kubernetes集群中執行! 然而,由於Kubernetes在您的網路接口周圍創造抽象,您將無法直接存取它,而不會從集群內轉移端口。
步骤 2 — 将端口转发到 Argo CD 访问
由于Kubernetes部署服务到集群中的任意网络地址,所以您需要将相关端口转发,以便从本地计算机访问它们。Argo CD在443端口内设置了一个名为argocd-server
的服务。由于端口443是默认的HTTPS端口,并且您可能正在运行其他一些HTTP/HTTPS服务,因此通常会将这些服务转发到任意选择的其他端口,如8080
,如:
1kubectl port-forward svc/argocd-server -n argocd 8080:443
端口转发将阻止它运行的终端,只要它是活跃的,所以你可能希望在继续工作时在新的终端窗口中运行它。
与此同时,您应该能够通过导航到localhost:8080
在网页浏览器中访问Argo CD. 但是,您将被要求使用命令行获取的登录密码。
注意:使用 LetsEncrypt HTTPS 证书与 Kubernetes 最适合使用附加工具,如 Cert-Manager。
步骤 3 – 从命令行使用 Argo CD
在接下来的步骤中,您将需要本地安装argocd
命令,以便在您的Argo CD实例中接口和更改设置。Argo CD 官方文档建议您通过Homebrew(https://brew.sh/)包管理器安装它。
如果您尚未安装 Homebrew,您可以使用一行命令获取并安装它:
1/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
在安装过程中,您可能会被要求提供密码,然后您可以在终端中使用brew
命令,您可以使用它来安装Argo CD:
1brew install argocd
这反过来提供了argocd
命令. 在使用它之前,你会再次使用kubectl
来检索安装过程中自动生成的管理员密码,这样你就可以使用它来登录。
1kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
1[secondary_label Output]
2fbP20pvw-o-D5uxH
然后,您可以登录您的 Argo CD 仪表板,在浏览器中返回localhost:8080
,并使用自己的密码登录为admin
用户:
一旦一切正常工作,您可以使用相同的身份证来通过命令行登录Argo CD,运行argocd login
。
1argocd login localhost:8080
您将在这里的命令行上再次收到相应的证书警告,并应该输入y
以在提示时继续进行。如果您想要的话,您可以通过运行argocd帐户更新密码
来更改密码,以更安全或更易记忆。
步骤 4 — 处理多个集群(可选)
默认情况下,Argo CD将部署应用程序到Argo CD本身正在运行的同一个集群,这对演示来说很好,但可能不是你在生产中想要的。
1kubectl config get-contexts -o name
1[secondary_label Output]
2test-deploy-cluster
3test-target-cluster
假設您已將 Argo CD 安裝到「測試部署集群」中,並希望使用它將應用程式部署到「測試目標集群」中,您可以透過執行「argocd 集群添加」來與 Argo CD 註冊「測試目標集群」。
1argocd cluster add target-k8s
这将为Argo CD添加额外的集群登录详细信息,并允许Argo CD在集群上部署服务。
步骤5 — 部署示例应用程序(可选)
既然你已经运行了Argo CD,而且你已经知道如何向不同的Kubernetes集群部署应用程序,是时候把它付诸实践了。 Argo CD项目维持着一个示例应用的存储库,这些存储库已被设计为展示GitOps基本原理. 这些例子中有许多是不同种类的Kubernetes的guestbook
演示应用程序的端口,例如Jsonnet。 在此情况下,您将部署 " helm-guestbook " 的例子,该例子使用[Helm图 (https://github.com/argoproj/argocd-example-apps/blob/master/helm-guestbook/Chart.yaml),这是最持久的Kubernetes管理办法之一.
为了做到这一点,您将使用argocd app create
命令,提供向Git存储库的路径,具体的helm-guestbook
示例,并传递您的默认目的地和名称空间:
1argocd app create helm-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path helm-guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
在 Argo CD 中创建
应用程序后,您可以通过argocd app get
检查其状态:
1argocd app get helm-guestbook
1[secondary_label Output]
2Name: helm-guestbook
3Project: default
4Server: https://kubernetes.default.svc
5Namespace: default
6URL: https://localhost:8080/applications/helm-guestbook
7Repo: https://github.com/argoproj/argocd-example-apps.git
8Target:
9Path: helm-guestbook
10SyncWindow: Sync Allowed
11Sync Policy: <none>
12Sync Status: OutOfSync from (53e28ff)
13Health Status: Missing
14
15GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
16 Service default helm-guestbook OutOfSync Missing
17apps Deployment default helm-guestbook OutOfSync Missing
OutOfSync
应用程序的状态是正常的. 你已经从Github上获取了应用程序的头盔图表,并在Argo CD中创建了该应用程序的条目,但你还没有实际上为其开启任何Kubernetes资源。
1argocd app sync helm-guestbook
sync
是基于GitOps原则的部署的同义词 - 使用Argo CD时,你的应用程序的目标是始终跟踪其上游配置的1:1。
1[secondary_label Output]
2TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
32022-01-19T11:01:48-08:00 Service default helm-guestbook OutOfSync Missing
42022-01-19T11:01:48-08:00 apps Deployment default helm-guestbook OutOfSync Missing
52022-01-19T11:01:48-08:00 Service default helm-guestbook Synced Healthy
62022-01-19T11:01:48-08:00 Service default helm-guestbook Synced Healthy service/helm-guestbook created
72022-01-19T11:01:48-08:00 apps Deployment default helm-guestbook OutOfSync Missing deployment.apps/helm-guestbook created
82022-01-19T11:01:49-08:00 apps Deployment default helm-guestbook Synced Progressing deployment.apps/helm-guestbook created
9
10Name: helm-guestbook
11Project: default
12Server: https://kubernetes.default.svc
13Namespace: default
14URL: https://localhost:8080/applications/helm-guestbook
15Repo: https://github.com/argoproj/argocd-example-apps.git
16Target:
17Path: helm-guestbook
18SyncWindow: Sync Allowed
19Sync Policy: <none>
20Sync Status: Synced to (53e28ff)
21Health Status: Progressing
22
23Operation: Sync
24Sync Revision: 53e28ff20cc530b9ada2173fbbd64d48338583ba
25Phase: Succeeded
26Start: 2022-01-19 11:01:49 -0800 PST
27Finished: 2022-01-19 11:01:50 -0800 PST
28Duration: 1s
29Message: successfully synced (all tasks run)
30
31GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
32 Service default helm-guestbook Synced Healthy service/helm-guestbook created
33apps Deployment default helm-guestbook Synced Progressing deployment.apps/helm-guestbook created
您现在使用Argo CD成功部署了应用程序!您可以从Argo CD Web 界面实现相同的事情,但通过命令行部署通常更快,更可重复。但是,在部署后检查您的Argo CD Web 仪表板非常有用,以便验证您的应用程序是否正常运行。您可以通过在浏览器中打开localhost:8080来看到:
在这一点上,最后要做的是确保你可以在浏览器中访问你的新部署。 要做到这一点,你会转发另一个端口,就像你在Argo CD本身所做的那样。 在内部,helm-guestbook
应用程序在正常的HTTP端口80
上运行,并且为了避免与可能在你自己的端口80
上运行或你在Argo CD中使用的端口8080
上的任何东西发生冲突,你可以将其转发到端口9090
:
1kubectl port-forward svc/helm-guestbook 9090:80
和以前一样,你可能会想在另一个终端中做到这一点,因为它会阻止该终端,直到你按Ctrl+C
来停止传输端口。
任何进一步的推送到Github存储库将自动反映在ArgoCD中,这将重新同步您的部署,同时提供持续的可用性。
结论
由于Kubernetes需要如此多的抽象层,所以确保您的部署尽可能可维护,而GitOps哲学是一个很好的解决方案是很重要的。
接下来,您可能想了解如何部署 TOBS, The Observability Stack,以监控您的Kubernetes集群的运行时间,健康状况和日志。