如何使用ArgoCD和GitOps部署到Kubernetes
介绍
使用 Kubernetes 部署应用程序可以提供显着的基础设施优势,例如灵活的扩展、分布式组件的管理以及对应用程序不同版本的控制。 然而,随着控制的增加,复杂性也随之增加。 持续集成和持续部署(CI/CD)系统通常在高级别的抽象上工作,以提供版本控制、更改日志记录和回滚功能。 这种抽象层的一种流行方法称为 GitOps。
GitOps 最初由 Weaveworks 在 2017 博客文章 中提出,使用 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 集群的正常运行时间、健康状况和日志记录。