阶段一:了解 Helm 的基础知识和概念
Helm 简介:
- Helm 是 Kubernetes 的一个包管理工具,用于简化应用程序在 Kubernetes 上的部署和管理过程。
- 它允许您使用预定义的模板(Charts)来描述应用程序的组件、依赖关系和配置。
- Helm Charts 可以重复使用,提高了应用程序的可维护性和可扩展性。
Helm 架构
- Helm 包含两个主要组件:Helm 客户端和 Tiller(在 Helm 3 中已移除)。
- Helm 客户端用于与用户交互,管理 Charts 和发布 Releases。
- Tiller 是 Helm 的服务端组件,负责在 Kubernetes 集群中创建和管理资源。
Helm Charts
- Helm Chart 是一个预定义的应用程序模板,用于描述如何在 Kubernetes 上部署应用程序。
- Chart 包含 Kubernetes 资源定义文件(YAML 格式),如 Deployment、Service、ConfigMap 等。
- Chart 中使用模板引擎(Go 的 text/template 和 sprig 函数库)来生成可配置的 Kubernetes 资源。
- Chart 还包含 values.yaml 文件,用于存储配置选项和参数化的值,使 Chart 可以根据不同的环境进行配置。
阶段二:安装和配置 Helm
安装 Helm
- 按照 Helm 官方网站的安装指南进行安装。通常,您可以从 Helm GitHub 存储库下载适用于您的操作系统的最新版本。
- 安装完成后,确保将 Helm 可执行文件添加到系统 PATH 中,以便在任何目录下都可以运行 Helm 命令。
初始化 Helm(对于 Helm 2)
- 使用 helm init 命令在 Kubernetes 集群上初始化 Helm,并部署 Tiller。
- 在 Helm 3 中,Tiller 已被移除,初始化过程变得更加简单,您不再需要执行 helm init。
添加 Helm 仓库
- Helm 仓库是存储 Helm Charts 的地方。您可以从默认的公共仓库获取 Charts,也可以添加自定义的仓库。
- 使用
helm repo add
- 命令添加仓库,比如添加 stable 仓库:
helm repo add stable https://charts.helm.sh/stable
阶段三:使用 Helm 管理应用程序
搜索和查看 Charts
- 使用 helm search repo 命令来搜索 Helm 仓库中的 Charts,并查看 Charts 的详细信息。
- 例如,搜索 WordPress Chart:
helm search repo wordpress
- 查看 Chart 的详细信息:
helm show chart stable/wordpress
安装应用程序
- 使用 helm install 命令安装 Helm Chart 到 Kubernetes 集群。
- 例如,安装 WordPress Chart:
helm install my-wordpress stable/wordpress
- 上述命令会将 WordPress 安装为一个 Helm Release,Release 名称为 my-wordpress。
查看已安装的应用程序
- 使用 helm list 命令查看已安装的 Helm Releases 及其状态。
- 例如,查看已安装的 Releases:
helm list
卸载应用程序
- 使用 helm uninstall 命令卸载已安装的 Helm Release。
- 例如,卸载名为 my-wordpress 的 Release:
helm uninstall my-wordpress
更新应用程序
- 使用 helm upgrade 命令更新已安装的 Helm Release。
- 例如,更新 my-wordpress Release 的 Chart 版本:
helm upgrade my-wordpress stable/wordpress --version 9.0.0
回滚应用程序
- 使用 helm rollback 命令回滚到之前的 Helm Release 版本。
- 例如,回滚 my-wordpress Release 到第一个版本:
helm rollback my-wordpress 1
阶段四:编写自定义的 Helm Charts
Chart 结构
- Helm Chart 的目录结构非常重要,它影响了 Chart 的可读性和维护性。
- 典型的 Chart 目录结构如下:
├── Chart.yaml # Chart 的元信息,包括版本、名称、描述等
├── values.yaml # 默认的配置值
├── charts/ # 用于存放其他依赖的 Helm Charts
└── templates/ # 存放模板文件,生成 Kubernetes 资源
Chart 模板
- Helm 使用 Go 的 text/template 和 sprig 函数库作为模板引擎,模板中包含注释和代码。
- 模板中的重要变量有 .Values、.Release 和 .Template。
.Values
- 可用于访问 values.yaml 中定义的值,例如:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.appName }}
Values 文件
- Values 文件用于存储配置选项和参数化 Chart 的部署,使 Chart 可以在不同环境中进行配置。
- 在 values.yaml 文件中,您可以定义默认的配置值,并且在模板文件中使用这些值。
- 例如,在 values.yaml 中定义:
appName: my-app
replicas: 3
image:
repository: myregistry/my-app
tag: latest
依赖管理
- Helm 允许您在 Chart 中管理依赖关系,这样您可以更好地组织和复用 Charts。
- 可以在 Chart.yaml 中使用 dependencies 字段指定依赖的 Charts。
- 通过 helm dependency 命令下载和更新依赖的 Charts。
- 了解如何在 Chart 中使用依赖的资源,例如,将其他 Chart 中的服务作为子 Chart 部署到您的应用程序中。
阶段五:高级主题
使用 Helm Hooks
Helm Hooks 允许您在特定阶段执行脚本,例如在安装、升级或删除 Helm Release 的不同生命周期中。这对于执行应用程序初始化、数据库迁移、配置更新等操作非常有用。
使用 Helm Hooks 的一般步骤:
- 在 Chart 中定义 Hooks:在 Chart 的 templates 目录中,创建一个或多个以 .yaml 结尾的文件,这些文件将包含 Hook 的定义。例如,templates/pre-install.yaml 文件定义了一个在安装 Release 前执行的 Hook。
- 使用 Hook 模板:在 Hook 模板中,您可以使用 Helm 的模板引擎来生成 Kubernetes 资源,就像您在其他模板中所做的那样。
- 在 Chart 的 Chart.yaml 文件中指定 Hook:在 Chart.yaml 文件的 hooks 部分,您可以为每个 Hook 文件定义一个条目,以指定何时执行该 Hook。
使用示例:
假设您有一个 pre-install.yaml 文件,其中包含以下内容:
apiVersion: batch/v1
kind: Job
metadata:
name: {{ .Release.Name }}-pre-install-job
spec:
template:
spec:
containers:
- name: pre-install
image: busybox
command: ['sh', '-c', 'echo "Pre-install hook executed"']
restartPolicy: Never
在 Chart.yaml 文件的 hooks 部分,添加以下内容:
hooks:
pre-install:
- name: pre-install-job
manifest: templates/pre-install.yaml
这样,在安装 Release 之前,Helm 将创建一个名为 pre-install-job 的 Job,并在其中执行定义的操作。
使用 Helm Secrets
Helm Secrets 是一个 Helm 插件,用于管理加密的敏感信息,如密码、证书等。它使用 PGP 密钥对敏感数据进行加密,确保在 Chart 中不明文存储敏感信息。
使用 Helm Secrets 的一般步骤:
- 安装 Helm Secrets:首先,您需要安装 Helm Secrets 插件。您可以通过在 Helm 客户端上执行以下命令来安装它:
helm plugin install https://github.com/zendesk/helm-secrets
- 初始化 Helm Secrets:在 Helm Chart 中使用 Helm Secrets 插件之前,需要对 Chart 进行初始化,以确保密钥环境正确设置。
helm secrets init <path/to/your/chart>
- 加密敏感信息:在 Chart 的 values.yaml 文件中,您可以使用 Helm Secrets 提供的 helm secrets enc 命令加密敏感信息。
helm secrets enc values.yaml
- 解密敏感信息:在需要访问敏感信息的时候,您可以使用 Helm Secrets 提供的 helm secrets dec 命令解密它们。
helm secrets dec values.yaml
使用示例:
假设您在 values.yaml 文件中有以下敏感信息:
password: mysecretpassword
使用以下命令对其进行加密:
helm secrets enc values.yaml
这将生成一个名为 values.yaml.dec 的加密文件。在使用 Chart 时,Helm Secrets 会自动解密这些敏感信息。
使用 Helm Plugins
Helm 插件是一种扩展 Helm 功能的方式,它允许您添加自定义命令或功能。可以使用 Helm 插件来扩展 Helm 的能力,实现特定的自动化或增强用户体验。
编写 Helm 插件
首先,您需要编写自己的 Helm 插件,这通常是一个独立的可执行文件。
编写 Helm 插件需要以下步骤:
- 创建一个新的目录,并命名为您的插件名称,例如 helm-plugin-example。
- 在该目录下创建一个名为 helm-plugin-example.go 的 Go 语言源代码文件。
- 在 helm-plugin-example.go 文件中编写插件的代码。一个简单的 Helm 插件需要实现以下接口:
go
package main
import (
"fmt"
"os"
"github.com/mitchellh/cli"
)
type Plugin struct{}
func (p *Plugin) Help() string {
return "This is a Helm plugin example"
}
func (p *Plugin) Synopsis() string {
return "A brief description of the plugin"
}
func (p *Plugin) Run(args []string) int {
fmt.Println("Running the Helm plugin example")
return 0
}
func main() {
plugin := &Plugin{}
cli := &cli.CLI{
Args: os.Args[1:],
Commands: map[string]cli.CommandFactory{},
HelpFunc: cli.BasicHelpFunc("helm-plugin-example"),
Synopsis: "A brief description of the plugin",
}
exitCode, err := cli.Run()
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %s\n", err)
}
os.Exit(exitCode)
}
这是一个非常简单的例子,实际的 Helm 插件可能包含更多复杂的逻辑和功能。
构建 Helm 插件
编写完 Helm 插件的代码后,您需要构建它,生成一个可执行的二进制文件。
- 在插件目录中执行以下命令,使用 Go 语言的编译器构建插件:
go build -o helm-plugin-example
- 这将在插件目录中生成一个名为 helm-plugin-example 的可执行文件。
安装 Helm 插件
将编写的插件二进制文件放置在 Helm 客户端可以访问的位置,例如将其添加到系统 PATH 或放在 Helm 客户端所在目录。
在构建好插件后,您需要将它安装到 Helm 客户端,以便 Helm 可以识别并调用您的插件。
- 将插件二进制文件复制到 Helm 客户端可以访问的位置,例如将其放在 Helm 客户端所在目录,或将其添加到系统 PATH。
- 确保插件可执行权限,以便 Helm 可以执行它。
使用 Helm 插件
现在您的 Helm 插件已经安装,您可以在 Helm 命令前加上插件名称,调用您编写的自定义 Helm 命令。
使用示例:
假设您编写了一个名为 helm-plugin-example 的 Helm 插件,并将其安装到系统 PATH。然后,您可以执行以下命令运行插件:
helm plugin-example
插件将输出 "Running the Helm plugin example"。
更复杂的 Helm 插件功能:
您可以通过编写更复杂的 Helm 插件来实现更多功能,例如:
- 调用 Kubernetes API:您的插件可以与 Kubernetes API 交互,获取资源信息、执行操作等。
- 增强 Helm 命令:您可以扩展 Helm 命令,添加自定义的参数、选项或子命令。
- 与外部系统集成:您的插件可以与其他系统进行集成,例如配置管理工具、CI/CD 系统等。
- 读取和操作 Helm Charts:您的插件可以读取和操作 Helm Charts 的内容,例如解析 Chart 文件、获取资源信息等。