1. Argo CD概述
1.1 什么是 Argo CD
Argo CD 是针对 Kubernetes 的声明式 GitOps 持续交付工具。
1.2 为什么选择 Argo CD
应用程序定义、配置和环境应具有声明性并受版本控制。应用程序部署和生命周期管理应自动化、可审计且易于理解。
2. Argo CD基础知识
在有效使用 Argo CD 之前,有必要了解该平台所基于的底层技术。还需要了解提供给您的功能及其使用方法。以下部分提供了一些有用的链接来帮助您加深这种理解。
2.1 学习基础知识
- 阅读在线 Docker 和 Kubernetes 教程:
- 适合初学者的容器、虚拟机和 Docker 简介
- Kubernetes 简介
- 教程
- 根据您计划如何模板化您的应用程序:
- Kustomize
- helm
- 如果您要与 CI 工具集成:
- GitHub Actions 文档
- Jenkins 用户指南
3. Argo CD核心概念
到此,您应该已经熟悉核心 Git、Docker、Kubernetes、持续交付和 GitOps 概念。以下是一些特定于 Argo CD 的概念。
- 应用程序:清单定义的一组 Kubernetes 资源。这是一个自定义资源定义 (CRD)。
- 应用程序源类型使用哪种工具来构建应用程序。
- 目标状态应用程序的所需状态,以 Git 存储库中的文件表示。
- 实时状态该应用程序的实时状态。部署了哪些 pod 等。
- 同步状态实时状态是否与目标状态匹配。部署的应用程序是否与 Git 所说的一致?
- 同步使应用程序移动到其目标状态的过程。例如通过将更改应用于 Kubernetes 集群。
- 同步操作状态同步是否成功。
- 刷新 将Git 中的最新代码与实时状态进行比较。找出不同之处。
- 健康应用程序的健康状况,是否正常运行? 是否可以处理请求?
- 工具从文件目录创建清单的工具。例如 Kustomize。请参阅应用程序源类型。
- 配置管理工具请参阅工具。
- 配置管理插件自定义工具。
4. 架构
4.1 架构概述
Argo CD 被实现为 Kubernetes 控制器,它持续监控正在运行的应用程序并将当前的实时状态与所需的目标状态(如 Git 存储库中指定)进行比较。已部署的应用程序的实时状态与目标状态有偏差,则被视为已部署应用程序OutOfSync
。Argo CD 报告并可视化差异,同时提供将实时状态自动或手动同步回所需目标状态的功能。对 Git 存储库中所需目标状态所做的任何修改都可以自动应用并反映在指定的目标环境中。
4.2 组成
4.2.1 API 服务器
API 服务器是一个 gRPC/REST 服务器,用于公开 Web UI、CLI 和 CI/CD 系统使用的 API。它具有以下职责:
- 应用程序管理和状态报告
- 调用应用程序操作(例如同步、回滚、用户定义的操作)
- 存储库和集群凭证管理(存储为 K8s 机密)
- 身份验证和授权委托给外部身份提供商
- RBAC 实施
- Git webhook 事件的监听器/转发器
4.2.2 存储库服务器
存储库服务器是一项内部服务,它维护保存应用程序清单的 Git 存储库的本地缓存。它负责在提供以下输入时生成并返回 Kubernetes 清单:
- 存储库 URL
- 修订(提交、标记、分支)
- 应用程序路径
- 模板特定设置:参数、helm values.yaml
4.2.3 应用程序控制器
应用程序控制器是一个 Kubernetes 控制器,它持续监控正在运行的应用程序,并将当前实时状态与所需的目标状态(如存储库中指定)进行比较。它检测OutOfSync
应用程序状态并选择性地采取纠正措施。它负责调用任何用户定义的生命周期事件钩子(PreSync、Sync、PostSync)
4.3 怎么运行的
Argo CD 遵循 GitOps
模式,使用 Git 存储库作为定义所需应用程序状态的真实来源。Kubernetes 清单可以通过多种方式指定:
- 自定义应用程序部署
- helm charts
- jsonnet文件
- YAML/json 清单的纯目录
- 任何配置为配置管理插件的自定义配置管理工具
Argo CD 可自动在指定的目标环境中部署所需的应用程序状态。应用程序部署可以跟踪 Git 提交时对分支、标签或固定到特定版本清单的更新。有关可用的不同跟踪策略的更多详细信息,后续会博文会继续讲解。
5. Argo CD入门
要求
- 已安装kubectl命令行工具。
- 有一个kubeconfig文件(默认位置是
~/.kube/config
)。- 已安装CoreDNS插件。
5.1 安装 Argo CD
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
这将创建一个新的命名空间 argocd
,Argo CD 服务和应用程序资源将存储在其中。
注意:
安装清单包含
ClusterRoleBinding
引用命名空间的资源argocd
。如果您要将 Argo CD 安装到不同的命名空间,请确保更新命名空间引用。
此默认安装将具有自签名证书,如果不进行额外操作则无法访问。请执行以下任一操作:
- 按照说明配置证书(并确保客户端操作系统信任它)。
- 配置客户端操作系统以信任自签名证书。
- 在本指南的所有 Argo CD CLI 操作中使用 --insecure 标志。
注意:
kubectl
必须将配置的默认命名空间设置为argocd
。这只对以下命令有用,因为前面的命令已经有 -n argocd 了:kubectl config set-context --current --namespace=argocd
用于argocd login --core
配置CLI访问并跳过步骤 3-5。
注意:
argocd-redis
Redis 的默认安装使用密码验证。Redis 密码与密钥一起存储在auth
安装 Argo CD 的命名空间中的 Kubernetes 机密中。
5.2 下载 Argo CD CLI
从github中下载最新的 Argo CD 版本。可以通过CLI 安装文档找到更详细的安装说明。
也可在 Mac、Linux 和 WSL Homebrew 中使用:
brew install argocd
5.3 访问 Argo CD API 服务器
默认情况下,Argo CD API 服务器不会通过外部 IP 公开。要访问 API 服务器,请选择以下三种技术之一来暴露 Argo CD API 服务:
- 将 argocd-server 服务类型更改为
LoadBalancer
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
- ingress
按照Argo CD ingress 文档了解如何使用入口配置 Argo CD。
- 转发端口
Kubectl 端口转发也可用于连接 API 服务器而无需公开服务。
kubectl port-forward svc/argocd-server -n argocd 8080:443
然后可以使用 https://localhost:8080 访问 API 服务器
5.4 使用 CLI 登录
帐户的初始密码admin
是自动生成的,并以明文形式存储在 Argo CD 安装命名空间中password
命名的机密字段中。
您可以使用CLI 快速的检索此密码
argocd admin initial-password -n argocd
提示:
更改密码后,您应该从 Argo CD 命名空间中删除
argocd-initial-admin-secret
。该密钥除了以明文形式存储最初生成的密码外,没有其他用途,并且可以随时安全地删除。如果必须重新生成新的管理员密码,Argo CD 将根据需要重新创建它。
使用上面的用户名admin
和密码登录 Argo CD 的 IP 或主机名:
argocd login <ARGOCD_SERVER>
注意:
CLI 环境必须能够与 Argo CD API 服务器通信。如果无法按照上述步骤 5.3 中的说明直接访问,您可以通过以下机制之一告诉 CLI 使用端口转发来访问它
向每个 CLI 命令添加
--port-forward-namespace argocd
标志。设置
ARGOCD_OPTS
环境变量:export ARGOCD_OPTS='--port-forward-namespace argocd'
。
使用以下命令更改密码:
argocd account update-password
5.5 注册集群以部署应用程序(可选)
此步骤将集群的凭据注册到 Argo CD,并且仅在部署到外部集群时才需要。在内部部署时(部署到 Argo CD 正在运行的同一集群),应使用 https://kubernetes.default.svc 作为应用程序的 K8s API 服务器地址。
首先列出当前 kubeconfig 中的所有集群上下文:
kubectl config get-contexts -o name
从列表中选择一个上下文名称并将其提供给argocd cluster add CONTEXTNAME
。例如,对于 docker-desktop 上下文,运行:
argocd cluster add docker-desktop
上述命令将 ServiceAccount ( argocd-manager
) 安装到该 kubectl 上下文的 kube-system 命名空间中,并将服务帐户绑定到管理员级别的 ClusterRole。Argo CD 使用此服务帐户令牌执行其管理任务(即部署/监控)。
注意:
可以修改角色规则
argocd-manager-role
,使其仅对有限的命名空间、组、种类具有create
、update
、patch
、权限。但是,Argo CD 需要在集群范围内具有 、 、权限才能正常运行。delete``get``list``watch
5.6 从 Git 存储库创建应用程序
包含留言簿应用程序的示例存储库可在 https://github.com/argoproj/argocd-example-apps.git上找到,以演示 Argo CD 的工作原理。
- 通过 CLI 创建应用程序
首先,我们需要运行以下命令将当前命名空间设置为 argocd:
kubectl config set-context --current --namespace=argocd
使用以下命令创建示例留言簿应用程序:
argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
- 通过 UI 创建应用程序
打开浏览器进入 Argo CD 外部 UI,通过访问浏览器中的 IP/主机名并使用步骤 4 中设置的凭据登录。
登录后,点击 + New App 按钮,如下图:
为您的应用命名guestbook
,使用该项目default
,并保留同步策略Manual
:
通过将存储库 URL 设置为 github 存储库 URL,将https://github.com/argoproj/argocd-example-apps.git存储库连接到 Argo CD,将修订保留为HEAD
,并将路径设置为guestbook
:
对于目标,将集群 URL 设置为https://kubernetes.default.svc
(或in-cluster
集群名称),并将命名空间设置为default
:
填写完以上信息后,点击UI顶部的Createguestbook
来创建应用程序:
5.7 同步应用程序
- 通过 CLI 同步
一旦创建了留言簿应用程序,您现在可以查看其状态:
$ argocd app get guestbook
Name: argocd/guestbook
Project: default
Server: https://kubernetes.default.svc
Namespace: default
URL: https://192.168.1.241:30786/applications/guestbook
Repo: https://github.com/argoproj/argocd-example-apps.git
Target:
Path: guestbook
SyncWindow: Sync Allowed
Sync Policy: <none>
Sync Status: OutOfSync from (d7927a2)
Health Status: Missing
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service default guestbook-ui OutOfSync Missing
apps Deployment default guestbook-ui OutOfSync Missing
应用程序状态最初处于OutOfSync
状态,因为应用程序尚未部署,并且尚未创建任何 Kubernetes 资源。要同步(部署)应用程序,请运行:
$ argocd app sync guestbook
TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
2024-07-09T15:23:49+08:00 Service default guestbook-ui OutOfSync Missing
2024-07-09T15:23:49+08:00 apps Deployment default guestbook-ui OutOfSync Missing
2024-07-09T15:23:50+08:00 Service default guestbook-ui OutOfSync Missing service/guestbook-ui created
2024-07-09T15:23:50+08:00 apps Deployment default guestbook-ui OutOfSync Missing deployment.apps/guestbook-ui created
2024-07-09T15:23:50+08:00 Service default guestbook-ui Synced Healthy service/guestbook-ui created
2024-07-09T15:23:50+08:00 apps Deployment default guestbook-ui Synced Progressing deployment.apps/guestbook-ui created
Name: argocd/guestbook
Project: default
Server: https://kubernetes.default.svc
Namespace: default
URL: https://192.168.1.241:30786/applications/guestbook
Repo: https://github.com/argoproj/argocd-example-apps.git
Target:
Path: guestbook
SyncWindow: Sync Allowed
Sync Policy: <none>
Sync Status: Synced to (d7927a2)
Health Status: Progressing
Operation: Sync
Sync Revision: d7927a27b4533926b7d86b5f249cd9ebe7625e90
Phase: Succeeded
Start: 2024-07-09 15:23:49 +0800 CST
Finished: 2024-07-09 15:23:50 +0800 CST
Duration: 1s
Message: successfully synced (all tasks run)
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service default guestbook-ui Synced Healthy service/guestbook-ui created
apps Deployment default guestbook-ui Synced Progressing deployment.apps/guestbook-ui created
此命令从存储库检索清单并执行kubectl apply
清单。留言簿应用程序现已运行,您现在可以查看其资源组件、日志、事件和评估的健康状况。
接下来可以使用如下命令到K8S集群中查看服务部署情况:
root@k8s-master01:~# kubectl get pods -o wide -n default
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
guestbook-ui-76f97c94c-gnznn 1/1 Running 0 10m 10.233.125.49 k8s-worker01 <none> <none>
- 通过 UI 同步