什么是 Helm
Helm 是一个 Kubernetes 应用程序包管理工具,它允许你轻松管理和部署 Kubernetes 应用程序。Helm 通过使用称为 Charts 的预定义模板来简化 Kubernetes 应用程序的部署和管理。Chart 包含了一组 Kubernetes 对象定义,可以描述一个应用程序的完整部署和资源需求,包括 Deployment、Service、ConfigMap、Secret 等。使用 Helm,你可以轻松地安装、升级、卸载和回滚 Kubernetes 应用程序。
同时,Helm 还提供了一些便捷的功能,如依赖管理、全局变量、条件渲染等,可以帮助你更好地管理应用程序的部署。Helm 有两个主要的组件:Helm 客户端(helm)和 Helm 服务器(Tiller)。Helm 客户端可以在本地运行,而 Tiller 则运行在 Kubernetes 集群中,并负责将 Charts 转换为 Kubernetes 对象。
安装 Helm
每个 Helm 版本都提供了各种操作系统的二进制版本,这些版本可以手动下载和安装。
- 下载 需要的版本
- 解压(
tar -zxvf helm-v3.0.0-linux-amd64.tar.gz
) - 在解压目录中找到
helm
程序,移动到需要的目录中(mv linux-amd64/helm /usr/local/bin/helm
) - 添加仓库:
helm repo add bitnami https://charts.bitnami.com/bitnami
- 验证安装:
helm help
重要概念
Chart
代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。你可以把它看作是 Homebrew formula、Apt dpkg或 Yum RPM 在 Kubernetes 中的等价物。Repository
(仓库)是用来存放和共享 Charts 的地方。它就像 Perl 的 CPAN 档案库网络 或是 Fedora 的 软件包仓库,只不过它是供 Kubernetes 包所使用的。Release
是运行在 Kubernetes 集群中的 Chart 的实例。一个 Chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 Release。以 MySQL Chart 为例,如果你想在你的集群中运行两个数据库,你可以安装该 Chart 两次。每一个数据库都会拥有它自己的 Release 和 Release Name。
使用 Helm
搜索 Charts
helm search hub <ChartName> helm search repo <ChartName>
Helm 自带一个强大的搜索命令,可以用来从两种来源中进行搜索:
helm search hub
从 Artifact Hub 中查找并列出 helm charts。 Artifact Hub 中存放了大量不同的仓库。helm search repo
从你添加(使用helm repo add
)到本地 helm 客户端中的仓库中进行查找。该命令基于本地数据进行搜索,无需连接互联网。
安装 Chart
helm install <ReleaseName> <ChartName>
使用 helm install
命令来安装一个新的 helm 包。最简单的使用方法只需要传入两个参数:你命名的 release 名字和你想安装的 chart 的名称。
注意:安装 Chart 时创建了一个新的 Release 对象。上述发布被命名为
nginx
。(如果想让 Helm 生成一个名称,删除发布名称并使用--generate-name
。)
查看列表
helm list
你可以通过 helm list
命令看到当前部署的所有 Release:
查看状态
helm status <ReleaseName>
你可以使用 helm status
来追踪 Release 的状态,或是重新读取配置信息:
卸载
helm uninstall <ReleaseName>
安装自定义 Chart
上述安装方式只会使用 Chart 的默认配置选项。很多时候,我们需要自定义 Chart 来指定我们想要的配置。
创建自定义的 Chart
helm create app
创建 Chart 的时候会在当前目录生成一个文件夹,名称便是创建的 Chart 名。
查看 Chart 目录结构
app/ Chart.yaml values.yaml charts/ templates/ ...
templates
目录包括了模板文件。当 Helm 评估 Chart 时,会通过模板渲染引擎将所有文件发送到templates/
目录中。 然后收集模板的结果并发送给 Kubernetes。values.yaml
文件也导入到了模板。这个文件包含了 Chart 的默认值。这些值会在用户执行helm install
或helm upgrade
时被覆盖。Chart.yaml
文件包含了该 Chart 的描述。你可以从模板中访问它。charts/
目录可以包含其他的 Chart(称之为子 Chart
)。
自定义模板
rm -rf mychart/templates/*
编写 namespace.yaml
apiVersion: v1 kind: Namespace metadata: name: {{ .Chart.Name }} namespace: {{ .Values.namespace }}
编写 deployment.yml
apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Chart.Name}} namespace: {{.Values.namespace}} labels: app: {{ .Chart.Name}} spec: replicas: {{ .Values.replicas }} template: metadata: name: {{ .Chart.Name}} labels: app: {{ .Chart.Name}} spec: containers: - name: {{ .Chart.Name}} image: {{ .Values.image}} imagePullPolicy: {{.Values.imagePullPolicy}} ports: - containerPort: {{.Values.containerPort}} restartPolicy: {{ .Values.restartPolicy }} selector: matchLabels: app: {{ .Chart.Name}}
编写 service.yml
apiVersion: v1 kind: Service metadata: name: {{.Chart.Name}} namespace: {{.Values.namespace}} spec: selector: app: {{.Chart.Name}} ports: - port: {{.Values.service.port}} targetPort: {{.Values.containerPort}} type: {{ .Values.service.type }}
编写 Chart.yml
apiVersion: v2 name: app description: A Helm chart for Kubernetes # A chart can be either an 'application' or a 'library' chart. # # Application charts are a collection of templates that can be packaged into versioned archives # to be deployed. # # Library charts provide useful utilities or functions for the chart developer. They're included as # a dependency of application charts to inject those utilities and functions into the rendering # pipeline. Library charts do not define any templates and therefore cannot be deployed. type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) version: 0.1.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. appVersion: "1.16.0"
编写 values.yaml
replicas: 1 namespace: app image: nginx:1.19 imagePullPolicy: IfNotPresent restartPolicy: Always containerPort: 80 service: port: 80 type: ClusterIP
验证是否存在错误
helm lint app
打包自定义 Chart
helm package app
安装 Chart
helm install app myapp-1.tgz