2017-10-20 16:11:47 +08:00
|
|
|
|
# 使用Helm管理kubernetes应用
|
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
[Helm](http://helm.sh) 是一个 Kubernetes 应用的包管理工具,用来管理 [chart](https://github.com/helm/charts)——预先配置好的安装包资源,有点类似于 Ubuntu 的 APT 和 CentOS 中的 YUM。2019 年 11 月 13 日,[Helm 3 发布](https://helm.sh/blog/helm-3-released/),2020 年 4 月 30 日,从 CNCF 中[毕业](https://helm.sh/blog/celebrating-helms-cncf-graduation/)。本文基于 Helm 3。
|
2020-05-08 23:22:37 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
Helm chart 是用来封装 Kubernetes 原生应用程序的 YAML 文件,可以在你部署应用的时候自定义应用程序的一些 metadata,便与应用程序的分发。
|
2017-10-25 17:10:36 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
Helm 和 chart 的主要作用是:
|
2017-10-24 19:10:34 +08:00
|
|
|
|
|
|
|
|
|
- 应用程序封装
|
|
|
|
|
- 版本管理
|
|
|
|
|
- 依赖检查
|
|
|
|
|
- 便于应用程序分发
|
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
下面是 Helm 的架构图。
|
2017-10-24 19:10:34 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
![Helm 架构图(来自 IBM Developer Blog)](../images/helm-chart.png)
|
2017-10-24 19:10:34 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
Helm 可以安装本地或者远程的 chart,当 chart 安装到 Kubernetes 中后就会创建一个 release,每次更新该 chart 的配置并执行 `helm upgrade`, release 的版本数就会加 1。同一个 chart 可以部署多次。
|
2017-10-23 19:08:33 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
## 安装 Helm
|
2017-10-23 19:08:33 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
**前提要求**
|
2017-10-23 19:08:33 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
- Kubernetes 1.5 以上版本
|
|
|
|
|
- 执行 helm 命令的主机可以访问到 Kubernetes 集群
|
2017-10-24 19:10:34 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
请参考 [Helm 官方文档](https://helm.sh/docs/intro/install/)安装,对于 Mac 用户可以直接运行 `brew install helm` 安装即可。
|
2017-10-24 19:10:34 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
## Chart 说明
|
2017-10-23 19:08:33 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
下面我们将一步步创建一个 chart 来说明其组织结构。
|
2017-10-24 19:10:34 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
首先使用 `helm create mychart` 创建一个名为 `mychart` 的示例,我们再使用 `tree mychart` 命令看一下 chart 的目录结构。
|
2017-10-24 19:10:34 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
2020-05-24 21:47:32 +08:00
|
|
|
|
mychart
|
|
|
|
|
├── Chart.yaml
|
|
|
|
|
├── charts # 该目录保存其他依赖的 chart(子 chart)
|
|
|
|
|
├── templates # chart 配置模板,用于渲染最终的 Kubernetes YAML 文件
|
|
|
|
|
│ ├── NOTES.txt # 用户运行 helm install 时候的提示信息
|
|
|
|
|
│ ├── _helpers.tpl # 用于创建模板时的帮助类
|
|
|
|
|
│ ├── deployment.yaml # Kubernetes deployment 配置
|
|
|
|
|
│ ├── ingress.yaml # Kubernetes ingress 配置
|
|
|
|
|
│ ├── service.yaml # Kubernetes service 配置
|
|
|
|
|
│ ├── serviceaccount.yaml # Kubernetes serviceaccount 配置
|
|
|
|
|
│ └── tests
|
|
|
|
|
│ └── test-connection.yaml
|
|
|
|
|
└── values.yaml # 定义 chart 模板中的自定义配置的默认值,可以在执行 helm install 或 helm update 的时候覆盖
|
2017-10-24 19:10:34 +08:00
|
|
|
|
```
|
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
以上仅为 helm 为我们自动创建的目录结构,我们还可以在 `templates` 目录加其他 Kubernetes 对象的配置,比如 `ConfigMap`、`DaemonSet` 等。
|
2017-10-24 19:10:34 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
我们查看下使用 `helm create` 命令自动生成的 `templates/service.yaml` 文件。
|
2017-10-24 19:10:34 +08:00
|
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
|
apiVersion: v1
|
|
|
|
|
kind: Service
|
|
|
|
|
metadata:
|
2020-05-24 21:47:32 +08:00
|
|
|
|
name: {{ include "mychart.fullname" . }}
|
2017-10-24 19:10:34 +08:00
|
|
|
|
labels:
|
2020-05-24 21:47:32 +08:00
|
|
|
|
{{- include "mychart.labels" . | nindent 4 }}
|
2017-10-24 19:10:34 +08:00
|
|
|
|
spec:
|
2020-05-24 21:47:32 +08:00
|
|
|
|
type: {{ .Values.service.type }}
|
2017-10-24 19:10:34 +08:00
|
|
|
|
ports:
|
2020-05-24 21:47:32 +08:00
|
|
|
|
- port: {{ .Values.service.port }}
|
|
|
|
|
targetPort: http
|
|
|
|
|
protocol: TCP
|
|
|
|
|
name: http
|
2017-10-24 19:10:34 +08:00
|
|
|
|
selector:
|
2020-05-24 21:47:32 +08:00
|
|
|
|
{{- include "mychart.selectorLabels" . | nindent 4 }}
|
2018-09-25 22:09:51 +08:00
|
|
|
|
```
|
2018-03-16 14:34:17 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
可以看到其中有很多`{{ }}` 包围的字段,这是使用的 [Go template](https://golang.org/pkg/text/template/) 创建的自定义字段,其中 `mychart` 开头的都是在 `_helpers.tpl` 中生成的定义。
|
2017-10-25 17:10:36 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
例如 `_helpers.tpl` 中对 `chart.fullname` 的定义:
|
2017-10-25 17:10:36 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
```go
|
|
|
|
|
{{/*
|
|
|
|
|
Create a default fully qualified app name.
|
|
|
|
|
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
|
|
|
|
If release name contains chart name it will be used as a full name.
|
|
|
|
|
*/}}
|
|
|
|
|
{{- define "mychart.fullname" -}}
|
|
|
|
|
{{- if .Values.fullnameOverride -}}
|
|
|
|
|
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
|
|
|
|
|
{{- else -}}
|
|
|
|
|
{{- $name := default .Chart.Name .Values.nameOverride -}}
|
|
|
|
|
{{- if contains $name .Release.Name -}}
|
|
|
|
|
{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
|
|
|
|
|
{{- else -}}
|
|
|
|
|
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
|
|
|
|
|
{{- end -}}
|
|
|
|
|
{{- end -}}
|
|
|
|
|
{{- end -}}
|
2018-03-21 16:01:46 +08:00
|
|
|
|
```
|
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
我们再看下 `values.yaml` 文件中有这样的一段配置:
|
2018-03-21 16:01:46 +08:00
|
|
|
|
|
|
|
|
|
```yaml
|
2020-05-24 21:47:32 +08:00
|
|
|
|
service:
|
|
|
|
|
type: ClusterIP
|
|
|
|
|
port: 80
|
2017-10-24 19:10:34 +08:00
|
|
|
|
```
|
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
在使用 `helm install` 或 `helm update` 时,会渲染 `templates/service.yaml` 文件中的 `{{ .Values.service.type }}` 和 `{{ .Values.service.port }}` 的值。
|
2017-10-24 19:10:34 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
## 使用 Helm
|
2017-10-25 17:10:36 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
Helm 常用命令如下:
|
2017-10-24 19:10:34 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
- `helm create`:在本地创建新的 chart;
|
|
|
|
|
- `helm dependency`:管理 chart 依赖;
|
|
|
|
|
- `helm intall`:安装 chart;
|
|
|
|
|
- `helm lint`:检查 chart 配置是否有误;
|
|
|
|
|
- `helm list`:列出所有 release;
|
|
|
|
|
- `helm package`:打包本地 chart;
|
|
|
|
|
- `helm repo`:列出、增加、更新、删除 chart 仓库;
|
|
|
|
|
- `helm rollback`:回滚 release 到历史版本;
|
|
|
|
|
- `helm pull`:拉取远程 chart 到本地;
|
|
|
|
|
- `helm search`:使用关键词搜索 chart;
|
|
|
|
|
- `helm uninstall`:卸载 release;
|
|
|
|
|
- `helm upgrade`:升级 release;
|
2017-10-24 19:10:34 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
使用 `helm -h` 可以查看 Helm 命令行使用详情,请参考 [Helm 文档](https://helm.sh/docs/helm/helm/)。
|
2017-10-23 19:08:33 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
### 安装 chart
|
2017-10-25 17:10:36 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
安装 chart 的命令格式为:
|
2017-10-25 17:10:36 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
2020-05-24 21:47:32 +08:00
|
|
|
|
helm install [NAME] [CHART] [flags]
|
2017-10-25 17:10:36 +08:00
|
|
|
|
```
|
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
示例:
|
2017-10-25 17:10:36 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
2020-05-24 21:47:32 +08:00
|
|
|
|
# 安装本地 chart
|
|
|
|
|
helm install -f myvalues.yaml myredis ./redis
|
|
|
|
|
# 指定变量
|
|
|
|
|
helm install --set name=prod myredis ./redis
|
|
|
|
|
# 指定变量的值为 string 类型
|
|
|
|
|
helm install --set-string long_int=1234567890 myredis ./redis
|
|
|
|
|
# 指定引用的文件地址
|
|
|
|
|
helm install --set-file my_script=dothings.sh myredis ./redis
|
|
|
|
|
# 同时指定多个变量
|
|
|
|
|
helm install --set foo=bar --set foo=newbar myredis ./redis
|
2017-10-25 17:10:36 +08:00
|
|
|
|
```
|
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
其中:
|
2017-10-25 17:10:36 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
- `myvalues.yaml`:自定义变量配置文件;
|
|
|
|
|
- `myredis`:release 名称;
|
|
|
|
|
- `./redis`:本地的 chart 目录;
|
2017-10-25 17:10:36 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
Helm chart 安装后会转化成 Kubernetes 中的资源对象,生成一个 chart release,可以使用 `helm list` 命令查看。
|
2017-10-25 17:10:36 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
关于 `helm intsall` 详细用法见:<https://helm.sh/docs/helm/helm_install/>。
|
2017-10-25 17:10:36 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
## 升级和回滚 chart
|
2017-10-25 17:10:36 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
要想升级 chart 可以修改本地的 chart 配置并执行:
|
2017-10-25 17:10:36 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
2020-05-24 21:47:32 +08:00
|
|
|
|
helm upgrade [RELEASE] [CHART] [flags]
|
2017-10-25 17:10:36 +08:00
|
|
|
|
```
|
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
使用 `helm ls` 的命令查看当前运行的 chart 的 release 版本,并使用下面的命令回滚到历史版本:
|
2017-10-25 17:10:36 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
2020-05-24 21:47:32 +08:00
|
|
|
|
helm rollback <RELEASE> [REVISION] [flags]
|
2017-10-25 17:10:36 +08:00
|
|
|
|
```
|
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
### 卸载 chart
|
2017-10-25 17:10:36 +08:00
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
要想卸载 chart 可以使用下面的命令。
|
2017-10-25 17:10:36 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
2020-05-24 21:47:32 +08:00
|
|
|
|
helm uninstall RELEASE_NAME [...] [flags]
|
2017-10-25 17:10:36 +08:00
|
|
|
|
```
|
|
|
|
|
|
2017-10-20 16:11:47 +08:00
|
|
|
|
## 参考
|
|
|
|
|
|
2020-05-24 21:47:32 +08:00
|
|
|
|
- [Go template - golang.org](https://golang.org/pkg/text/template/)
|
|
|
|
|
- [Getting Started - helm.sh](https://helm.sh/docs/chart_template_guide/getting_started/)
|
|
|
|
|
- [Helm 用户指南 - whmzsu.github.io](https://whmzsu.github.io/helm-doc-zh-cn/)
|