如何使用 Argo CD 和 GitOps 部署到 Kubernetes

介绍

使用Kubernetes来部署您的应用程序可以提供显著的基础设施优势,例如灵活的缩放,分布式组件的管理,以及控制您应用程序的不同版本. 然而,随着管制的增加,情况变得更加复杂。 连续集成和连续部署(CI/CD)系统通常在高抽象度下工作,以提供版本控制,更改记录,并回滚功能. 这种抽象层的通俗取法被称作_GitOps_.

GitOps 最初是由 Weaveworks2017年博客帖子中提出的,它使用 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)。

前提条件

要遵循本教程,您将需要:

步骤 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 app status

一旦一切正常工作,您可以使用相同的身份证来通过命令行登录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 app status

在这一点上,最后要做的是确保你可以在浏览器中访问你的新部署。 要做到这一点,你会转发另一个端口,就像你在Argo CD本身所做的那样。 在内部,helm-guestbook应用程序在正常的HTTP端口80上运行,并且为了避免与可能在你自己的端口80上运行或你在Argo CD中使用的端口8080上的任何东西发生冲突,你可以将其转发到端口9090:

1kubectl port-forward svc/helm-guestbook 9090:80

和以前一样,你可能会想在另一个终端中做到这一点,因为它会阻止该终端,直到你按Ctrl+C来停止传输端口。

Guestbook app

任何进一步的推送到Github存储库将自动反映在ArgoCD中,这将重新同步您的部署,同时提供持续的可用性。

结论

由于Kubernetes需要如此多的抽象层,所以确保您的部署尽可能可维护,而GitOps哲学是一个很好的解决方案是很重要的。

接下来,您可能想了解如何部署 TOBS, The Observability Stack,以监控您的Kubernetes集群的运行时间,健康状况和日志。

Published At
Categories with 技术
comments powered by Disqus