容器相关名词解释

Helm 和 Chart

Helm 是一个 Kubernetes 应用的包管理工具,用来管理 chart——预先配置好的安装包资源,有点类似于 Ubuntu 的 APT 和 CentOS 中的 YUM。2019 年 11 月 13 日,Helm 3 发布,2020 年 4 月 30 日,从 CNCF 中毕业。本文基于 Helm 3。

Helm chart 是用来封装 Kubernetes 原生应用程序的 YAML 文件,可以在你部署应用的时候自定义应用程序的一些 metadata,便与应用程序的分发。

Helm 和 chart 的主要作用是:

  • 应用程序封装
  • 版本管理
  • 依赖检查
  • 便于应用程序分发

下面是 Helm 的架构图。

helm-chart

Helm 可以安装本地或者远程的 chart,当 chart 安装到 Kubernetes 中后就会创建一个 release,每次更新该 chart 的配置并执行 helm upgrade, release 的版本数就会加 1。同一个 chart 可以部署多次。

安装 Helm

前提要求

  • Kubernetes 1.5 以上版本
  • 执行 helm 命令的主机可以访问到 Kubernetes 集群

请参考 Helm 官方文档安装,对于 Mac 用户可以直接运行 brew install helm 安装即可。

Chart 说明

下面我们将一步步创建一个 chart 来说明其组织结构。

首先使用 helm create mychart 创建一个名为 mychart 的示例,我们再使用 tree mychart 命令看一下 chart 的目录结构。

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 的时候覆盖

以上仅为 helm 为我们自动创建的目录结构,我们还可以在 templates 目录加其他 Kubernetes 对象的配置,比如 ConfigMapDaemonSet 等。

我们查看下使用 helm create 命令自动生成的 templates/service.yaml 文件。

apiVersion: v1
kind: Service
metadata:
  name: {{ include "mychart.fullname" . }}
  labels:
    {{- include "mychart.labels" . | nindent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      protocol: TCP
      name: http
  selector:
    {{- include "mychart.selectorLabels" . | nindent 4 }}

可以看到其中有很多{{ }} 包围的字段,这是使用的 Go template 创建的自定义字段,其中 mychart 开头的都是在 _helpers.tpl 中生成的定义。

例如 _helpers.tpl 中对 chart.fullname 的定义:

{{/*
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 -}}

我们再看下 values.yaml 文件中有这样的一段配置:

service:
  type: ClusterIP
  port: 80

在使用 helm installhelm update 时,会渲染 templates/service.yaml 文件中的 {{ .Values.service.type }}{{ .Values.service.port }} 的值。

使用 Helm

Helm 常用命令如下:

  • 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;

使用 helm -h 可以查看 Helm 命令行使用详情,请参考 Helm 文档

安装 chart

安装 chart 的命令格式为:

helm install [NAME] [CHART] [flags]

示例:

# 安装本地 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

其中:

  • myvalues.yaml:自定义变量配置文件;
  • myredis:release 名称;
  • ./redis:本地的 chart 目录;

Helm chart 安装后会转化成 Kubernetes 中的资源对象,生成一个 chart release,可以使用 helm list 命令查看。

关于 helm intsall 详细用法见:https://helm.sh/docs/helm/helm_install/。

升级和回滚 chart

要想升级 chart 可以修改本地的 chart 配置并执行:

helm upgrade [RELEASE] [CHART] [flags]

使用 helm ls 的命令查看当前运行的 chart 的 release 版本,并使用下面的命令回滚到历史版本:

helm rollback <RELEASE> [REVISION] [flags]

卸载 chart

要想卸载 chart 可以使用下面的命令。

helm uninstall RELEASE_NAME [...] [flags]

参考