如何使用ArgoCD和GitOps部署到Kubernetes

来自菜鸟教程
跳转至:导航、​搜索

介绍

使用 Kubernetes 部署应用程序可以提供显着的基础设施优势,例如灵活的扩展、分布式组件的管理以及对应用程序不同版本的控制。 然而,随着控制的增加,复杂性也随之增加。 持续集成和持续部署(CI/CD)系统通常在高级别的抽象上工作,以提供版本控制、更改日志记录和回滚功能。 这种抽象层的一种流行方法称为 GitOps

GitOps 最初由 Weaveworks2017 博客文章 中提出,使用 Git 作为 CI/CD 流程的“单一事实来源”,集成代码更改在每个项目的单个共享存储库中,并使用拉取请求来管理基础架构和部署。

有几个工具使用 Git 作为 Kubernetes 上的 DevOps 流程的焦点。 在本教程中,您将学习使用 Argo CD,一种声明式持续交付工具。 Argo CD 提供了持续交付工具,当您的 GitHub 存储库发生更改时,它会自动同步和部署您的应用程序。 通过管理应用程序的部署和生命周期,它为 Kubernetes 环境中的版本控制、配置和应用程序定义提供解决方案,通过易于理解的用户界面组织复杂的数据。 它可以处理多种类型的 Kubernetes 清单,包括 Jsonnet、Kustomize 应用程序、Helm 图表和 YAML/json 文件,并支持来自 GitHub、GitLab 和 Bitbucket 的 webhook 通知。

在本文中,您将使用 Argo CD 从 GitHub 存储库同步和部署应用程序。

先决条件

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

  • 本地 Linux/MacOS/BSD 机器上的 SSH 密钥对。 如果您之前没有使用过 SSH 密钥,您可以按照 这个关于如何在本地机器上设置 SSH 密钥的说明 来学习如何设置它们。 如果您使用的是 Windows,您应该在 Windows Subsystem for Linux 环境中工作。
  • 包含至少一个工作节点的现有 Kubernetes 集群。 kubectl 应该安装在您的工作环境中并且能够连接到您的集群。 DigitalOcean 的 Managed Kubernetes 默认会为你提供这样的配置。 如果您使用的是 DigitalOcean 的托管 Kubernetes,您应该查看 如何连接到集群
  • 熟悉 Kubernetes 概念。 详情请参考文章【X28X】Kubernetes简介【X61X】。

第 1 步 — 在集群上安装 Argo CD

为了安装 Argo CD,您应该首先使用 kubectl 设置有效的 Kubernetes 配置,您可以从中 ping 您的工作节点。 您可以通过运行 kubectl get nodes 来测试它:

kubectl get nodes

此命令应返回具有 Ready 状态的节点列表:

OutputNAME                   STATUS   ROLES    AGE   VERSION
pool-uqv8a47h0-ul5a7   Ready    <none>   22m   v1.21.5
pool-uqv8a47h0-ul5am   Ready    <none>   21m   v1.21.5
pool-uqv8a47h0-ul5aq   Ready    <none>   21m   v1.21.5

如果 kubectl 没有返回一组具有 Ready 状态的节点,您应该查看您的集群配置和 Kubernetes 文档

接下来,在集群中创建 argocd 命名空间,其中将包含 Argo CD 及其相关服务:

kubectl create namespace argocd

之后,您可以运行项目维护人员提供的 Argo CD 安装脚本。

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

安装成功完成后,您可以使用 watch 命令检查 Kubernetes pod 的状态:

watch kubectl get pods -n argocd

默认情况下,作为库存 Argo CD 安装的一部分,应该有五个 pod 最终收到 Running 状态。

OutputNAME                                  READY   STATUS    RESTARTS   AGE
argocd-application-controller-0       1/1     Running   0          2m28s
argocd-dex-server-66f865ffb4-chwwg    1/1     Running   0          2m30s
argocd-redis-5b6967fdfc-q4klp         1/1     Running   0          2m30s
argocd-repo-server-656c76778f-vsn7l   1/1     Running   0          2m29s
argocd-server-cd68f46f8-zg7hq         1/1     Running   0          2m28s

可以按【X14X】【X18X】退出【X36X】【X40X】界面。 现在,您的 Kubernetes 集群中运行了 Argo CD! 但是,由于 Kubernetes 围绕您的网络接口创建抽象的方式,如果不从集群内部转发端口,您将无法直接访问它。 您将在下一步中学习如何处理它。

第 2 步 — 转发端口以访问 Argo CD

由于 Kubernetes 将服务部署到集群内的任意网络地址,因此您需要转发相关端口才能从本地计算机访问它们。 Argo CD 在内部在端口 443 上设置了一个名为 argocd-server 的服务。 因为端口 443 是默认的 HTTPS 端口,并且您可能正在运行其他一些 HTTP/HTTPS 服务,所以通常的做法是将这些转发到任意选择的其他端口,例如 8080,如下所示:

kubectl port-forward svc/argocd-server -n argocd 8080:443

只要端口转发处于活动状态,它就会阻止它正在运行的终端,因此您可能希望在继续工作时在新的终端窗口中运行它。 当您想停止转发端口时,您可以按 Ctrl+C 优雅地退出诸如此的阻塞进程。

同时,您应该能够在网络浏览器中通过导航到 localhost:8080 访问 Argo CD。 但是,系统会提示您输入登录密码,您需要使用命令行在下一步中检索该密码。 您可能需要单击安全警告,因为 Argo CD 尚未配置有效的 SSL 证书。

注意: 在 Kubernetes 中使用 LetsEncrypt HTTPS 证书最好通过使用其他工具来完成,例如 Cert-Manager


第 3 步 — 从命令行使用 Argo CD

对于接下来的步骤,您需要在本地安装 argocd 命令,以便与 Argo CD 实例进行交互和更改设置。 Argo CD的官方文档建议你通过Homebrew包管理器安装。 Homebrew 在 MacOS 上管理命令行工具非常流行,最近被移植到 Linux 以方便维护这样的工具。

如果您还没有安装 Homebrew,您可以使用一行命令检索并安装它:

​​/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

在安装过程中可能会提示您输入密码。 之后,您应该可以在终端中使用 brew 命令。 您可以使用它来安装 Argo CD:

brew install argocd

这又提供了 argocd 命令。 在使用之前,您需要再次使用 kubectl 来找回安装过程中自动生成的管理员密码,以便您可以使用它来登录。 您将向它传递一个指向使用 Kubernetes 机密存储的特定 JSON 文件的路径,并提取相关值:

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
OutputfbP20pvw-o-D5uxH

然后,您可以通过在浏览器中返回 localhost:8080 并使用您自己的密码以 admin 用户身份登录来登录 Argo CD 仪表板:

一切正常后,您可以使用相同的凭据通过命令行登录 Argo CD,方法是运行 argocd login。 这对于稍后从命令行进行部署是必要的:

argocd login localhost:8080

您将在此处的命令行上再次收到等效证书警告,并且应在出现提示时输入 y 以继续。 如果需要,您可以通过运行 argocd account update-password 将密码更改为更安全或更容易记住的密码。 之后,您将拥有完整的 Argo CD 配置。 在本教程的最后步骤中,您将学习如何使用它来实际部署一些示例应用程序。

第 4 步 — 处理多个集群(可选)

在部署应用程序之前,您应该查看您实际想要部署它的位置。 默认情况下,Argo CD 会将应用程序部署到运行 Argo CD 本身的同一集群中,这对于演示来说很好,但可能不是您在生产中想要的。 为了列出当前机器已知的所有集群,可以使用 kubectl config

kubectl config get-contexts -o name
Outputtest-deploy-cluster
test-target-cluster

假设您已将 Argo CD 安装到 test-deploy-cluster 中,并且您想使用它在 test-target-cluster 上部署应用程序,您可以通过运行 argocd cluster add

argocd cluster add target-k8s

这会将附加集群的登录详细信息添加到 Argo CD,并使 Argo CD 能够在集群上部署服务。

第 5 步 — 部署示例应用程序(可选)

现在您已经运行了 Argo CD,并且了解了如何将应用程序部署到不同的 Kubernetes 集群,是时候将其付诸实践了。 Argo CD 项目维护了一个 示例应用程序 的存储库,这些应用程序的架构旨在展示 GitOps 基础知识。 其中许多示例是相同 guestbook 演示应用程序到不同类型 Kubernetes 清单的端口,例如 Jsonnet。 在这种情况下,您将部署 helm-guestbook 示例,该示例使用 Helm 图表 ,这是最持久的 Kubernetes 管理解决方案之一。

为此,您将使用 argocd app create 命令,提供 Git 存储库的路径、特定的 helm-guestbook 示例,并传递您的默认目标和命名空间:

argocd 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 检查其状态:

argocd app get helm-guestbook
OutputName:               helm-guestbook
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          default
URL:                https://localhost:8080/applications/helm-guestbook
Repo:               https://github.com/argoproj/argocd-example-apps.git
Target:
Path:               helm-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    helm-guestbook  OutOfSync  Missing
apps   Deployment  default    helm-guestbook  OutOfSync  Missing

OutOfSync应用状态正常。 您已经从 Github 检索了应用程序的 helm chart,并在 Argo CD 中为其创建了一个条目,但实际上您还没有为它启动任何 Kubernetes 资源。 为了实际部署应用程序,您将运行 argocd app sync

argocd app sync helm-guestbook

sync 是此处部署的同义词,符合 GitOps 的原则——使用 Argo CD 的目标是让您的应用程序始终以 1:1 的比例跟踪其上游配置。

OutputTIMESTAMP                  GROUP        KIND   NAMESPACE                  NAME    STATUS    HEALTH        HOOK  MESSAGE
2022-01-19T11:01:48-08:00            Service     default        helm-guestbook  OutOfSync  Missing
2022-01-19T11:01:48-08:00   apps  Deployment     default        helm-guestbook  OutOfSync  Missing
2022-01-19T11:01:48-08:00            Service     default        helm-guestbook    Synced  Healthy
2022-01-19T11:01:48-08:00            Service     default        helm-guestbook    Synced   Healthy              service/helm-guestbook created
2022-01-19T11:01:48-08:00   apps  Deployment     default        helm-guestbook  OutOfSync  Missing              deployment.apps/helm-guestbook created
2022-01-19T11:01:49-08:00   apps  Deployment     default        helm-guestbook    Synced  Progressing              deployment.apps/helm-guestbook created

Name:               helm-guestbook
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          default
URL:                https://localhost:8080/applications/helm-guestbook
Repo:               https://github.com/argoproj/argocd-example-apps.git
Target:
Path:               helm-guestbook
SyncWindow:         Sync Allowed
Sync Policy:        <none>
Sync Status:        Synced to  (53e28ff)
Health Status:      Progressing

Operation:          Sync
Sync Revision:      53e28ff20cc530b9ada2173fbbd64d48338583ba
Phase:              Succeeded
Start:              2022-01-19 11:01:49 -0800 PST
Finished:           2022-01-19 11:01:50 -0800 PST
Duration:           1s
Message:            successfully synced (all tasks run)

GROUP  KIND        NAMESPACE  NAME            STATUS  HEALTH       HOOK  MESSAGE
       Service     default    helm-guestbook  Synced  Healthy            service/helm-guestbook created
apps   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 或端口 [ X183X] 您用于 Argo CD,您可以将其转发到端口 9090

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

和以前一样,您可能希望在另一个终端中执行此操作,因为它会阻止该终端,直到您按 Ctrl+C 停止转发端口。 然后,您可以在浏览器窗口中打开 localhost:9090 以查看您的示例留言簿应用程序:

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

结论

您现在已经了解了使用 Argo CD 安装和部署应用程序的基础知识。 由于 Kubernetes 需要如此多的抽象层,因此确保您的部署尽可能可维护非常重要,而 GitOps 理念是一个很好的解决方案。

接下来,您可能想了解如何部署 TOBS、可观察性堆栈 ,以监控 Kubernetes 集群的正常运行时间、健康状况和日志记录。