何为Helm?

Helm 就是 k8s 的包管理工具,类似于centos的yum,python的pip,node的npm一样。Helm由客户端组件 helm 和服务端组件 Tiller 组成,能够将一组k8s的资源打包统一管理,是查找,共享和使用k8s构建的最佳方式。

Helm的组件和相关术语

  • Helm:命令行下的客户端工具,主要用于 k8s 应用程序 Chart 的创建,打包,发布及管理本地和远程的 Chart 仓库
  • Tiller:Helm 的服务端,部署在 k8s 集群里,用于接收 helm 的请求,与k8s 的api-server交互。根据 Chart 生成 k8s 的部署文件(release),然后提交给 k8s 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。
  • Chart:Helm的打包格式叫做chart,所谓chart就是一系列文件/模板, 它描述了一组相关的 k8s 集群资源
  • Repoistory:helm的软件仓库,本质上是一个Web服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该Repoistory的 Chart 清单文件供查询。Helm 可以同时管理多个不同的 Repoistory。
  • Release:使用 helm install 命令在 k8s 集群中部署的 Chart 称为 Release。

工作原理

创建Release

  • helm 客户端从指定的目录或本地tar文件或远程repo仓库解析出chart的结构信息
  • helm 客户端指定的 chart 结构和 values 信息通过 gRPC 传递给 Tiller
  • Tiller 服务端根据 chart 和 values 生成一个 release
  • Tiller 将install release请求直接传递给 kube-apiserver

删除Release

  • helm 客户端从指定的目录或本地tar文件或远程repo仓库解析出chart的结构信息
  • helm 客户端指定的 chart 结构和 values 信息通过 gRPC 传递给 Tiller
  • Tiller 服务端根据 chart 和 values 生成一个 release
  • Tiller 将delete release请求直接传递给 kube-apiserver

更新Release

  • Helm从指定的目录或者tgz文件中解析出Chart结构信息
  • Helm将要更新的Release的名称和Chart结构,Values信息传递给Tiller
  • Tiller生成Release并更新指定名称的Release的History
  • Tiller将Release发送给Kubernetes用于更新Release

回滚Release

  • Helm将要回滚的Release的名称传递给Tiller
  • Tiller根据Release的名称查找History
  • Tiller从History中获取上一个Release
  • Tiller将上一个Release发送给Kubernetes用于替换当前Release

Chart 结构

使用 helm create Appname 就能生成下面的chart文件了

  • charts 该目录中放置当前Chart依赖的其它Chart
  • Chart.yaml 包含Chart的基本信息,包括chart版本,名称等
  • templates 目录下存放应用一系列 k8s 资源的 yaml 模板
  • _helpers.tpl 此文件中定义一些可重用的模板片断,此文件中的定义在任何资源定义模板中可用
  • NOTES.txt 介绍chart 部署后的帮助信息,如何使用chart等
  • values.yaml 包含了必要的值定义(默认值), 用于存储 templates 目录中模板文件中用到变量的值
  • deployment.yaml
  • ingress.yaml
  • service.yaml

放几个文件例子,作为参考,双大括号包扩起来的部分是Go template语法

Chart.yaml

name: [必须] Chart的名称
version: [必须] Chart的版本号,版本号必须符合 SemVer 2:http://semver.org/
description: [可选] Chart的简要描述
keywords:
  -  [可选] 关键字列表
home: [可选] 项目地址
sources:
  - [可选] 当前Chart的下载地址列表
maintainers: # [可选]
  - name: [必须] 名字
    email: [可选] 邮箱
engine: gotpl # [可选] 模版引擎,默认值是gotpl
icon: [可选] 一个SVG或PNG格式的图片地址

values.yaml

# Default values for mychart.
# This is a yaml-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
  repository: nginx
  tag: stable
  pullPolicy: IfNotPresent
service:
  name: nginx
  type: ClusterIP
  externalPort: 80
  internalPort: 80
resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi

deployment.yaml

# Default values for mychart.
# This is a yaml-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
  repository: nginx
  tag: stable
  pullPolicy: IfNotPresent
service:
  name: nginx
  type: ClusterIP
  externalPort: 80
  internalPort: 80
resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi

Chart 常用命令

# 检查配置和模板是否有效,生成最终的yaml文件
helm install --dry-run --debug <chart_dir>

# 部署到k8s
helm install <chart_dir>

# 查看部署的relaese
helm list

# 部署完应用包后,查看release提示信息
helm status mysql1
helm fetch stable/redis
查看chart官方手册,了解每个参数的含义https://docs.helm.sh/developing_charts/#charts
# 用helm生成基础chart示例性文件,myapp是chart的名字
helm create myapp
# 做语法检查
helm lint myapp
==> Linting myapp
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, no failures
# 打包
helm package myapp/
Successfully packaged chart and saved it to: /root/myapp-0.1.0.tgz
# 启动8879仓库的服务
helm serve
# 查看local仓库里面是否有我们创建的chart包
helm search myapp
# 部署我们自定义的chart
helm install --name myapp1 local/myapp
# 删除我们部署的chart
helm delete --purge myapp1