1 构建 Helm Chart

首先创建一个 chart 的骨架

helm create testapi-chart

该命令创建一个 testapi-chart 目录,该目录结构如下所示,我们主要关注目录中的这三个文件即可: Chart.yaml,values.yaml 和 NOTES.txt。

testapi-chart
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── NOTES.txt
│   └── service.yaml
└── values.yaml
  • Chart.yaml 用于描述这个 chart,包括名字,描述信息以及版本。
  • values.yaml 用于存储 templates 目录中模板文件中用到的变量。模板文件一般是 Go 模板。如果你需要了解更多关于 Go 模板的相关信息,可以查看 Hugo (https://gohugo.io) 的一个关于 Go 模板的介绍 (https://gohugo.io/templates/go-templates/)。
  • NOTES.txt 用于向部署该 chart 的用于介绍 chart 部署后的一些信息。例如介绍如何使用这个 chart,列出缺省的设置等。
  • charts 目录可以包含其他的 chart(称之为子 chart)。

打开 Chart.yaml, 填写你部署的应用的详细信息,以 testapi 为例:

apiVersion: v1
description: A simple api for testing and debugging
name: testapi-chart
version: 0.0.1

然后打开并根据需要编辑 values.yaml。下面是 testapi 应用的 values.yaml 文件内容。

replicaCount: 2
image:
  repository: daemonza/testapi
  tag: latest
  pullPolicy: IfNotPresent
service:
  name: testapi
  type: ClusterIP
  externalPort: 80
  internalPort: 80
resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi

在 testapi_chart 目录下运行下面命令以对 chart 进行校验。

helm lint
==> Linting .
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, no failures

如果文件格式错误,可以根据提示进行修改;如果一切正常,可以使用下面的命令对 chart 进行打包:

helm package testapi-chart --debug

这里添加了 –debug 参数来查看打包的输出,输出应该类似于:

Saved /Users/daemonza/testapi/testapi-chart/testapi-chart-0.0.1.tgz to current directory
Saved /Users/daemonza/testapi/testapi-chart/testapi-chart-0.0.1.tgz to /Users/daemonza/.helm/repository/local

chart 被打包为一个压缩包 testapi-chart-0.0.1.tgz,该压缩包被放到了当前目录下,并同时被保存到了 helm 的本地缺省仓库目录中。

2 Helm 安装

2.1 helm install 命令

helm install [Release-Name] [Chart] [flags] 安装 helm chart

# 本地 chart
helm install testapi testapi-chart
# 本地 chart 文件
helm install testapi foo-0.1.1.tgz
# flags --values / -f
helm install -f value-replace.yaml testapi testapi-chart
# flags --set
helm install --set a=1 testapi testapi-chart

helm install [Chart] —generate-name 安装时随机生成 release

2.2 helm 安装补充

1️⃣ Helm 对于 K8S 资源有固定的安装顺序,具体参考:Helm | 使用 Helm

当前常用的资源的顺序为:ConfigMap Service Pod RC RS Deployment StatefulSet Job Ingress。

2️⃣ Helm 客户端不会等到所有资源都运行才退出。许多 charts 需要大小超过 600M 的 Docker 镜像,可能需要很长时间才能安装到集群中。

3️⃣ 可以使用  helm status [Release]  来追踪 release 的状态,或是重新读取配置信息。

4️⃣ Helm 安装的时候,可以通过 —values(-f)或者 —set 来进行覆盖,其中 —set 的优先级高于 —values。

其中,—set 的格式和限制可以参考文档:Helm | 使用 Helm 之 —set  的格式和限制

5️⃣ 多来源安装 helm chart:

  • chart 的仓库(如上所述)
  • 本地 chart 压缩包(helm install foo foo-0.1.1.tgz
  • 解压后的 chart 目录(helm install foo path/to/foo
  • 完整的 URL(helm install foo https://example.com/charts/foo-1.2.3.tgz

如果想要本地进行调试模板,参考 Helm @3 Chart 编写指南 中“调试模板”章节。

3 Helm 升级和回滚

3.1 升级和回滚命令

helm upgrade [-f xxx.yaml] <release-name> repo/chart-name 升级命令

helm rollback <release-name> <revision> 回滚命令

helm list 查看当前运行的 helm 以及 revision

helm history <release-name> 查看 release 历史信息,含 revision

3.2 实际效果

修改 Chart.yaml,将版本号从 0.0.1 修改为 1.0.0, 然后使用 Helm package 命令打包并发布到本地仓库。

查看本地库中的 Chart 信息,可以看到在本地仓库中 testapi-chart 有两个版本

$ helm search testapi -l
NAME                    CHART VERSION   APP VERSION     DESCRIPTION
local/testapi-chart     0.0.1                           A Helm chart for Kubernetes
local/testapi-chart     1.0.0                           A Helm chart for Kubernetes

现在用 helm upgrade 将已部署的 testapi 升级到新版本。可以通过参数指定需要升级的版本号,如果没有指定版本号,则缺省使用最新版本。

helm upgrade testapi local/testapi-chart

已部署的 testapi release 被升级到 1.0.0 版本

$ helm list
NAME    REVISION        UPDATED                         STATUS          CHART                   NAMESPACE
testapi 2               Mon Apr 16 10:43:10 2018        DEPLOYED        testapi-chart-1.0.0     default

可以通过 Helm history 查看一个 Release 的多次更改。

$ helm history testapi
REVISION        UPDATED                         STATUS          CHART                   DESCRIPTION
1               Mon Apr 16 10:21:44 2018        SUPERSEDED      testapi-chart-0.0.1     Install complete
2               Mon Apr 16 10:43:10 2018        DEPLOYED        testapi-chart-1.0.0     Upgrade complete

如果更新后的程序由于某些原因运行有问题,我们则需要回退到旧版本的应用,可以采用下面的命令进行回退。其中的参数 1 是前面 Helm history 中查看到的 Release 的更改历史。

helm rollback testapi 1

使用 Helm list 命令查看,部署的 testapi 的版本已经回退到 0.0.1

$ helm list
NAME    REVISION        UPDATED                         STATUS          CHART                   NAMESPACE
testapi 3               Mon Apr 16 10:48:20 2018        DEPLOYED        testapi-chart-0.0.1     default

每当发生了一次安装、升级或回滚操作,revision 的值就会加 1。第一次 revision 的值永远是 1。我们可以使用  helm history [RELEASE]  命令来查看一个特定 release 的修订版本号。

4 安装、升级、回滚时的有用选项

可以指定一些其他有用的选项来自定义 Helm 在安装、升级、回滚期间的行为。请注意这并不是 cli 参数的完整列表。要查看所有参数的说明,请执行  helm <command> --help  命令。

  • —timeout 一个  Go duration  类型的值,用来表示等待 Kubernetes 命令完成的超时时间,默认值为  5m0s
  • —wait 表示必须要等到所有的 Pods 都处于 ready 状态,PVC 都被绑定,Deployments 都至少拥有最小 ready 状态 Pods 个数(Desired 减去  maxUnavailable),并且 Services 都具有 IP 地址(如果是 LoadBalancer,则为 Ingress),才会标记该 release 为成功。最长等待时间由  —timeout  值指定。如果达到超时时间,release 将被标记为  FAILED。注意:当 Deployment 的  replicas  被设置为 1,但其滚动升级策略中的  maxUnavailable  没有被设置为 0 时,—wait  将返回就绪,因为已经满足了最小 ready Pod 数。
  • —no-hooks 不运行当前命令的钩子。

5 Helm 卸载

helm uninstall [Release] 从集群中卸载一个 release

helm uninstall happy-panda

当一个 release 被删除(uninstall)时,会移除 release 的记录。如果想保留删除记录,使用  helm uninstall --keep-history。使用  helm list --uninstalled  只会展示使用了  --keep-history  删除的 release。

helm list --all  会展示 Helm 保留的所有 release 记录,包括失败或删除的条目(指定了  --keep-history)。

6 Helm Repository

6.1 helm repo 命令

helm repo list 查看 local helm repo

helm repo list

helm repo add <repo-url> 添加 helm repo

helm repo add bitnami https://charts.bitnami.com/bitnami

helm search repo <name> 在本地记录的 helm repo 中进行搜索
helm search hub <name> 从 Artifact Hub 中进行搜索

$ helm search repo nginx

NAME                            CHART VERSION APP VERSION DESCRIPTION

bitnami/nginx                   18.1.2       1.27.0     NGINX Open Source is a web server that can be a...

bitnami/nginx-ingress-controller 11.3.8       1.10.1     NGINX Ingress Controller is an Ingress controll..

helm repo update 更新

6.2 本地 helm repo

使用 helm serve 命令启动一个 repo server,该 server 缺省使用 $HELM_HOME/repository/local 目录作为 chart 存储,并在 8879 端口上提供服务。

$ helm serve&
Now serving you on 127.0.0.1:8879

启动本地 repo server 后,将其加入 helm 的 repo 列表。

$ helm repo add local http://127.0.0.1:8879
"local" has been added to your repositories

本地 package 后,就可以通过 search 来搜索本地的 chart 了。

$ helm search testapi

NAME                    CHART VERSION   APP VERSION     DESCRIPTION
local/testapi-chart     0.0.1                           A Helm chart for Kubernetes

6.3 上传与下载 TODO

生成 index.yaml 文件用来标识包的元信息。

$ helm package docs/examples/alpine/
$ mkdir fantastic-charts
$ mv alpine-0.1.0.tgz fantastic-charts/
$ helm repo index fantastic-charts --url https://fantastic-charts.storage.googleapis.com
$ helm repo add fantastic-charts https://fantastic-charts.storage.googleapis.com --username my-username --password my-password

上传 chart: TODO Helm | Chart 仓库指南

 

下载 chart:

helm pull myrepo/mychart --version <version>

7 Reference