Kubernetes上的模板代码生成与CI/CD
立即解锁
发布时间: 2025-08-24 02:05:41 阅读量: 1 订阅数: 4 

### Kubernetes 上的模板代码生成与 CI/CD
在 Kubernetes 中进行应用部署和管理时,模板代码生成和 CI/CD 是非常重要的环节。本文将介绍 Kubernetes 上模板代码生成的相关选项,以及如何使用 Helm 和 Kustomize 实现模板化部署,同时还会涉及 CI/CD 的相关内容。
#### 技术要求
要运行本文中详细介绍的命令,你需要一台支持 `kubectl` 命令行工具的计算机,以及一个正常运行的 Kubernetes 集群。你可以使用以下命令来安装 `kubectl` 工具。另外,你还需要一台支持 Helm CLI 工具的机器,它的前置要求通常与 `kubectl` 相同,详细信息可查看 Helm 文档:https://helm.sh/docs/intro/install/ 。本文使用的代码可在 GitHub 仓库中找到:https://github.com/PacktPublishing/Cloud-Native-with-Kubernetes/tree/master/Chapter11 。
#### Kubernetes 上模板代码生成的选项
Kubernetes 的一个强大之处在于其 API 可以通过声明式资源文件进行通信,这使得我们可以运行 `kubectl apply` 等命令,让控制平面确保集群中运行的资源与我们的 YAML 或 JSON 文件相匹配。然而,这种能力也带来了一些不便。因为我们希望将所有工作负载声明在配置文件中,对于大型或复杂的应用,尤其是包含多个微服务的应用,可能会导致需要编写和维护大量的配置文件。在多个环境下,这个问题会更加复杂。例如,我们需要开发、测试、预发布和生产环境,假设每个文件只维护一个资源,每个 Kubernetes 资源就需要四个单独的 YAML 文件。
为了解决这些问题,我们可以使用支持变量的模板系统,通过注入不同的变量集,让单个模板文件适用于多个应用或多个环境。社区支持的开源选项有很多,本文将重点介绍两个最流行的工具:
- **Helm**
- **Kustomize**
还有其他一些选项,如 Kapitan、Ksonnet、Jsonnet 等,但本文不会对它们进行全面回顾。下面先来看看 Helm,它在很多方面是最受欢迎的模板工具。
#### Helm
Helm 既是一个模板/代码生成工具,也是一个 CI/CD 工具。它允许你创建基于 YAML 的模板,并通过变量进行填充,从而实现代码和模板在应用和环境之间的复用。同时,它还提供了 Helm CLI 工具,用于根据模板对应用进行更新。因此,在 Kubernetes 生态系统中,Helm 通常是安装工具或应用的默认方式。
#### Kustomize
与 Helm 不同,Kustomize 由 Kubernetes 项目官方支持,并且其支持直接集成到了 `kubectl` 中。Kustomize 使用纯 YAML 文件,不使用变量,而是推荐使用分支和补丁的工作流程,根据所选的补丁将 YAML 的部分内容替换为新的 YAML。
#### 使用 Helm 和 Kustomize 在 Kubernetes 上实现模板化
现在我们已经了解了这些工具的基本情况,接下来通过一个示例应用来演示如何使用它们,以便更好地理解每个工具如何处理变量和模板化过程。首先从 Helm 开始。
##### 安装 Helm
如果你想使用特定版本的 Helm,可以按照特定版本的文档进行安装:https://helm.sh/docs/intro/install/ 。对于本文的使用场景,我们将使用 `get helm` 脚本安装最新版本。具体操作步骤如下:
```bash
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
```
安装完成后,你应该能够运行 `helm` 命令。默认情况下,Helm 会自动使用你现有的 `kubeconfig` 集群和上下文,因此要切换 Helm 使用的集群,只需像平常一样使用 `kubectl` 更改 `kubeconfig` 文件即可。
##### Helm 图表、仓库和发布
Helm 提供了一种使用变量在 Kubernetes 上进行模板化和部署应用的方法。为了实现这一点,我们通过一组模板来指定工作负载,这组模板被称为 Helm 图表(Helm chart)。
Helm 图表由一个或多个模板、一些图表元数据和一个值文件组成,值文件用于将模板变量填充为最终值。在实际应用中,每个环境(或应用,如果你将模板用于多个应用)会有一个值文件,它会用新的配置填充共享模板。然后,模板和值的组合将用于将应用安装或部署到集群中。
Helm 图表可以存储在 Git 仓库中,就像其他 Kubernetes YAML 文件一样(这适用于大多数用例),Helm 也支持仓库的概念。Helm 仓库由一个 URL 表示,可以包含多个 Helm 图表。例如,Helm 有自己的官方仓库:https://hub.helm.sh/charts 。每个 Helm 图表由一个包含元数据文件、`Chart.yaml` 文件、一个或多个模板文件以及可选的值文件的文件夹组成。
要使用本地值文件安装本地 Helm 图表,可以将每个文件的路径传递给 `helm install` 命令,如下所示:
```bash
helm install -f values.yaml /path/to/chart/root
```
对于常用的图表,你也可以直接从图表仓库安装,还可以选择向本地 Helm 添加自定义仓库,以便轻松从非官方源安装图表。例如,要通过官方 Helm 图表安装 Drupal,可以运行以下命令:
```bash
helm install -f values.yaml stable/drupal
```
要使用自定义仓库,首先需要将其添加到 Helm 中。例如,要安装托管在 jetstack Helm 仓库中的 `cert-manager`,可以执行以下操作:
```bash
helm repo add jetstack https://charts.jetstack.io
helm install certmanager --namespace cert-manager jetstack/cert-manager
```
上述代码将 jetstack Helm 仓库添加到本地 Helm CLI 工具中,然后通过该仓库中的图表安装 `cert-manager`,并将发布命名为 `cert-manager`。在 Helm V3 中,Helm 发布是使用 Kubernetes 密钥实现的概念。当我们在 Helm 中创建一个发布时,它将作为一个密钥存储在同一命名空间中。
为了说明这一点,我们可以使用前面的安装命令创建一个 Helm 发布:
```bash
helm install certmanager --namespace cert-manager jetstack/cert-manager
```
该命令的输出可能会因 `Cert Manager` 的当前版本而略有不同。为了便于阅读,我们将输出分为两部分。首先,命令的输出会给出 Helm 发布的状态:
```plaintext
NAME: certmanager
LAST DEPLOYED: Sun May 23 19:07:04 2020
NAMESPACE: cert-manager
STATUS: deployed
REVISION: 1
TEST SUITE: None
```
可以看到,这部分包含了部署的时间戳、命名空间信息、版本号和状态。接下来是输出的注释部分:
```plaintext
NOTES:
cert-manager has been deployed successfully!
In order to begin issuing certificates, you will need to set up
a ClusterIssuer
or Issuer resource (for example, by creating a 'letsencrypt-
staging' issuer).
More information on the different types of issuers and how to
configure them
can be found in our documentation:
https://cert-manager.io/docs/configuration/
For information on how to configure cert-manager to
automatically provision
Certificates for Ingress resources, take a look at the
`ingress-shim`
documentation:
https://cert-manager.io/docs/usage/ingr
```
0
0
复制全文
相关推荐









