-
Notifications
You must be signed in to change notification settings - Fork 529
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
74 additions
and
60 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,76 +1,87 @@ | ||
# 10.5 使用 Argo CD 进行持续交付 | ||
|
||
Argo CD 是一个基于 Kubernetes 的声明式 GitOps 持续交付工具,主要用于 Kubernetes 集群中的应用管理和部署。它能够从 Git 仓库中获取应用的定义,并自动同步到集群中。 | ||
Argo CD 是一款用于 Kubernetes 的声明式持续交付工具,它被实现为一个Kubernetes 控制器,该控制器持续监控 Git 仓库的变更来实现自动拉取和更新机制。其背后工作原理如下: | ||
|
||
- **定时轮询**: Argo CD Controller 定期轮询指定的 Git 仓库,检查是否有新的提交。默认情况下,轮询周期每 3 分钟一次。 | ||
- **Webhook 触发**: 为了更快地响应更新,Argo CD 支持通过 Git 仓库的 Webhook 来触发同步操作。当仓库中发生提交或合并请求时,GitLab、GitHub 等平台可以通过 Webhook 通知 Argo CD 立即进行同步。 | ||
- **状态对比**: 每次拉取到最新的 Git 仓库状态后,Argo CD 会与当前集群中的应用状态进行对比。如果发现差异,Argo CD 会自动执行同步操作,确保集群与 Git 仓库的配置一致。 | ||
|
||
如图 10-10 所示,Argo CD 是通过 Kubernetes 控制器来实现的,它持续 watch 正在运行的应用程序,并将应用程序的实际状态与所需的目标状态( Git 存储库中指定的)进行比较。如果应用程序的实际状态与目标状态有差异,则被认为是 OutOfSync 状态,Argo CD 会报告这些差异,同时提供工具来自动或手动将状态同步到期望的目标状态。 | ||
|
||
:::center | ||
![](../assets/argocd_architecture.png)<br/> | ||
图 10-10 Argo CD 如何工作 [图片来源](https://argo-cd.readthedocs.io/en/stable/) | ||
::: | ||
|
||
接下来,笔者将演示在集群内安装 Argo CD 以及部署一个应用示例,介绍 Argo CD 的使用概况。 | ||
接下来,笔者将演示如何在集群中安装 Argo CD 并部署示例应用,简要介绍其使用方法。 | ||
|
||
## 10.5.1 安装 Argo CD | ||
|
||
先创建一个命名空间,然后通过 kubectl apply 安装 Argo CD 提供的 yaml 文件即可。 | ||
首先,创建一个专门用于 Argo CD 的命名空间“argocd”。然后通过 kubectl apply 安装 Argo CD 提供的 yaml 文件即可。 | ||
|
||
```bash | ||
$ kubectl create namespace argocd | ||
``` | ||
kubectl create namespace argocd | ||
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml | ||
``` | ||
安装之后,可以使用自带的 WebUI 进行交互操作,也可以额外安装 CLI ,出于演示的目的,这里使用自带 WebUI 进行交互。 | ||
|
||
默认情况下,Argo CD 的 WebUI 服务在集群内部并没有暴露出来,可以通过 LoadBalancer 或者 NodePort 类型的 Service、Ingress、Kubectl 端口转发等方式将 Argo CD 服务发布到 Kubernetes 集群外部。 | ||
|
||
如下,通过 NodePort 服务的方式暴露 Argo CD 到集群外部。 | ||
安装 Argo CD 有多种方法,这里选择使用 kubectl apply 命令应用官方 YAML 清单文件进行安装。下面的命令会在之前创建的 argocd 命名空间中安装 Argo CD 的所有必要组件,包括控制器、服务器、UI 等。 | ||
|
||
```bash | ||
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml | ||
``` | ||
$ kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}' | ||
``` | ||
|
||
查找到 argocd-server 关联的 NodePort 端口,通过浏览器打开:https://localhost:35123/ 控制台。 | ||
|
||
初次访问需要登录,Argo CD 默认账户是 admin,帐号的初始密码是自动生成,并以明文的形式存储在 Argo CD 安装的命名空间中 argocd-initial-admin-secret 的 Secret 对象下的 password。 | ||
Argo CD 提供了一个用户友好的 Web 界面来管理应用。要访问 UI,首先需要获取初始密码。运行以下命令来获取密码: | ||
|
||
通过下面命令获取初始密码。 | ||
```bash | ||
$ kubectl -n argocd get secret argocd - initial - admin - secret - o jsonpath ="{.data.password}"| base64 -d | ||
``` | ||
$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d | ||
然后,使用以下命令设置端口转发来访问 UI。 | ||
|
||
```bash | ||
$ kubectl port - forward svc/argocd - server -n argocd 8080:443 | ||
``` | ||
|
||
## 10.5.2 部署应用 | ||
之后,你可以在浏览器中访问https://localhost:8080,并使用 admin 作为用户名和上面获取的密码进行登录。 | ||
|
||
部署应用之前,我们先了解 Argo CD 定义的 Application 资源,它通过下面两个关键的属性将目标 Kubernetes 集群中的 namespace 与 Git 仓库中声明的期望状态连接起来: | ||
## 10.5.2 部署应用 | ||
|
||
- **Source**:指的是 Git 仓库中 Kubernetes 资源配置清单所在的位置,可以是原生的 Kubernetes 配置清单,也可以是 Helm Chart 或者 Kustomize 部署清单。 | ||
- **Destination**:通过 Server 指定 Kubernetes 集群以及相关的 namespace,这样 Argo CD 就知道将应用部署到 Kubernetes 集群中的哪个位置。 | ||
在 Argo CD 中,Application 是核心的自定义资源定义(CRD),它是 Argo CD 实现 GitOps 工作流的关键抽象,定义了应用的源代码位置、目标部署环境以及同步和监控策略。 | ||
|
||
通过如下 yaml 文件,了解 Argo CD 对 Application 资源的定义。 | ||
以下是一个 Argo CD Application 资源的示例,展示如何从 Git 仓库部署一个 Kubernetes 应用到目标集群的特定命名空间: | ||
|
||
```yaml | ||
apiVersion: argoproj.io/v1alpha1 | ||
kind: Application | ||
metadata: | ||
name: guestbook | ||
namespace: argocd | ||
name: example-app # 应用名称 | ||
namespace: argocd # Argo CD 安装的命名空间 | ||
spec: | ||
project: default | ||
project: default # Argo CD 项目名称(默认项目) | ||
source: | ||
repoURL: https://github.com/argoproj/argocd-example-apps.git | ||
targetRevision: HEAD | ||
path: helm-guestbook | ||
repoURL: https://github.com/example/repo.git # 配置来源的 Git 仓库地址 | ||
targetRevision: main # Git 仓库分支或标签 | ||
path: manifests # 仓库中存放 Kubernetes 配置的目录路径 | ||
destination: | ||
server: https://kubernetes.default.svc | ||
namespace: default | ||
server: https://kubernetes.default.svc # 目标集群 API Server 地址 | ||
namespace: default # 部署目标命名空间 | ||
syncPolicy: | ||
automated: # 启用自动同步 | ||
prune: true # 删除目标集群中不需要的资源 | ||
selfHeal: true # 自愈机制:检测到差异时自动修复 | ||
syncOptions: | ||
- CreateNamespace=true # 自动创建目标命名空间 | ||
``` | ||
将该 yaml 文件 apply 到 Kubernetes 集群。 | ||
除了 Application 资源,Argo CD 也定义了 Project 资源,用来对 Application 分组,设置更细粒度的访问权限控制,实现多租户环境。 | ||
```yaml | ||
$ kubectl apply -f application.yaml | ||
``` | ||
|
||
默认情况下,新创建的 Application 状态为 OutOfSync,Argo CD 尚未将 Git 仓库中的资源同步到目标集群。在 UI 控制台点击 “SYNC” 按钮触发同步操作,如果配置了 syncPolicy.automated Argo CD 会自动触发同步操作。 | ||
|
||
创建 Application 之后,应用状态为初始 OutOfSync 状态,此时也尚未创建任何 Kubernetes 资源,在控制台点击 “SYNC” 按钮进行同步部署,部署之后的状态如下图所示。 | ||
手动或自动触发同步后,状态会变为 Synced。 | ||
|
||
:::center | ||
![](../assets/argocd-demo.png)<br/> | ||
图 10-11 Argo CD 应用部署示例 | ||
::: | ||
|
||
如此,后续无论是通过 CI 触发更新 git 仓库中的编排文件,还是工程师直接修改,Argo CD 都会自动拉取最新的配置并应用到 Kubernetes 集群中。 | ||
此后,Argo CD 会根据 Application 的定义,持续跟踪应用在 Git 仓库中的期望状态和在 Kubernetes 集群中的实际状态,如果两者出现差异,它会尝试将实际状态同步到期望状态。例如,如果有人手动在集群中修改了某个应用资源的副本数量,Argo CD 会发现这种配置漂移,并根据 Application 的定义将副本数量恢复到 Git 仓库中配置的数量。 | ||
|
||
相比传统持续交付流程,Argo CD 下的应用程序的部署和生命周期管理明显变得更加**自动化**(通过自动同步、自动修复等),**可审计**(通过 Git 历史和审计日志),并且**易于理解**(通过可视化的 Web UI 和简化的部署流程)。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
# Helm |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,6 @@ | ||
# 10.4 使用 Tekton 进行持续集成 | ||
|
||
Tekton 起源于 Google 主导的 Knative 项目,最初作为 Knative 的一个组件存在,名为 build-pipeline,用于在 Kubernetes 环境中构建容器化 CI/CD 流水线。随着功能的逐步扩展,build-pipeline 从 Knative 中独立出来,并更名为 Tekton,成为一个通用的、Kubernetes 原生的 CI/CD 框架。 | ||
Tekton 是一个开源的 Kubernetes 原生持续集成/持续交付(CI/CD)工具,由 Google 发起。它的核心是通过自定义资源定义(CRD)在 Kubernetes 集群中实现流水线即代码(Pipeline as Code)。这意味着开发人员可以使用代码的方式来定义复杂的构建、测试和部署流水线。例如,一个软件开发团队可以利用 Tekton 来构建从代码拉取、单元测试、构建容器镜像,一直到将镜像部署到 Kubernetes 集群的完整流程。 | ||
|
||
Tekton 充分利用了 Kubernetes 的容器调度和管理能力,所有任务均在容器中(也就是 Pod)运行,并通过 YAML 文件定义流水线和任务。相比传统的 CI/CD 系统(如 GitLab CI 和 Jenkins),Tekton 更适合构建基于 Kubernetes 的 CI/CD 系统。 | ||
|
||
接下来,我们先了解 Tekton 中与构建流水线相关的概念以及流水线执行的原理。之后,再基于 Tekton 构建一个完整的持续集成系统,该系统包括程序测试、镜像构建和镜像推送。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.