Bootstrap

helm-kubernetes的包管理器

Helm简介

Helm官方定义为kubernetes的包管理器,有点类似Linux里面的RPM。在使用kubernetes做应用管理的时候,kubernetes中定义了很多资源类型,比如官方支持的pod, deployment, statefulset, service, ingress等, 还有一些通过crd创建的,比如virtualservice, destinationrule等,这些资源类型配置,维护以及编排可以通过yaml文件进行管理。但这些yaml文件本身的管理需要一个合适的工具,这个工具需要提供如下功能:

  • 模板渲染 这些资源文件在不同环境可以生效不同的配置,不同场景下不同编排逻辑

  • 模板管理 资源文件本身的版本控制,发布,回滚等功能,以及分享,复用功能

  • 组件管理 中间件服务可能存在不同的组件,需要对不同组件进行编排,维护,比如rocketmq,存在组件rocketmq-nameserv, rocketmq-broker, rocketmq-console等组件

  • 服务依赖管理 在各个资源文件里面,资源之间是没有关系的,实际上各个服务是可能存在一些依赖关系的

helm就是解决类似问题的一个工具。

helm有三大概念,chart, repository, 以及release。

  • Chart 代表helm包, 包含kubernetes内运行的应用,工具以及服务的所有资源定义。

  • Repository(仓库) 存放和共享chart的地方,公有的chart仓库为https://artifacthub.io/,可以在该仓库上搜索到社区提交的不同服务的chart;也可以创建私有仓库。Harbor1.10以上就提供了helm chart仓库功能; 一般的web 服务器也可以作为helm chart仓库,需要web服务器在charts目录下有index.yaml文件可以访问以及chart目录。

  • Release 运行在kubernetes的chart实例,同一个chart可以在kubernetes集群安装多次,每一次都会生成一个新的release

模板渲染

helm把整个资源文件(yaml文件)拆分成模板文件templates以及值values。values文件里面是可变的一些配置,template文件是整个配置模板,基于不同values数据以及同一个template文件渲染出不同的资源配置文件。

Helm chart模板是用go模板语言(go template language)编写的。所有模板文件都存储在 chart 的 templates / 文件夹中。当 Helm 渲染 charts 时,它将通过模板引擎传递该目录中的每个文件。

模板的值有两种提供方法:

  • chart 开发人员可能会在 chart 内部提供一个 values.yaml 文件。该文件可以包含默认值。

  • chart 用户可能会提供一个包含值的 YAML 文件。这可以通过命令行提供 。

    当用户提供自定义值时,这些值将覆盖 chart 中 文件中的值。

  • chart用户可以在安装chart的时候通过--set临时调整数值,比如helm install --set key1=val1,key2=val2

最佳实践

Helm chart只会保存公共的模板逻辑,对于不同环境之间不同的value设置,建议维护不同的配置文件。比如dev, test, staging, prod等环境,创建目录如下

.
├── charts
│   └── apollo
└── inventories
    ├── dev
    │   └── apollo.yaml
    ├── prod
    │   └── apollo.yaml
    ├── staging
    │   └── apollo.yaml
    └── test
        └── apollo.yaml

安装的时候基于不同的配置文件进行生效:

比如helm install charts/apollo -f inventories/dev/apollo.yaml

模板文件

Helm chart模板是用go模板语言(go template language)编写的。

使用helm create chart可以生成 helm的初始模板。

.
├── charts //存储子chart以及依赖chart
├── Chart.yaml // chart定义
├── templates // 存储资源的模板文件
│   ├── deployment.yaml // deployment资源
│   ├── _helpers.tpl // 配置一些常量
│   ├── hpa.yaml // hpa资源
│   ├── ingress.yaml // ingress资源
│   ├── NOTES.txt
│   ├── serviceaccount.yaml // sa资源
│   ├── service.yaml // service资源
│   └── tests
│       └── test-connection.yaml
└── values.yaml // 定义一些变量的默认值,可以在安装或者升级时进行变量覆盖

其中templates模板可以根据服务不同新增以及减少资源文件。具体模板文件的编写参见https://helm.sh/zh/docs/chart_template_guide/getting_started/。

版本管理

       在应用的chart进行更新之后,可以修改chart版本,然后提交到chart 仓库(在提交之前需要通过helm package进行打包)。在运行环境中就可以使用helm install/upgrade进行应用部署,部署的chart可以选择从仓库进行拉取。chart更新只会发生变更的资源,对于一些不变的资源不会进行更新(原理同kubectl apply)。

在一些把configmap挂载为配置文件的应用,configmap变动需要重启应用生效的,需要手动进行应用重启。

chart安装之后的列表:

        里面是有revision,在更新之后revision会递增, 可以基于revision进行回滚。

组件管理

Helm可以通过子chart做组件管理。子chart是一个独立的chart, 不依赖于父chart。父chart变量可以覆盖子变量,也可以定义一些global的变量, 父子chart都可以使用。

子chart的变量修改需要在变量前面加上子chart名称。

全局变量关键字是global, chart访问使用{{ .Values.global.xxx }}。

服务依赖管理

通过chart中依赖的配置进行服务依赖管理,比如:

# Chart.yaml
dependencies:
- name: nginx
    version: "1.2.3"
    repository: "https://example.com/charts"
- name: memcached
    version: "3.2.1"
    repository: "https://another.example.com/charts"

需要把对应依赖的远端仓库加载到repo列表中,安装的时候依赖chart会下载到charts文件夹中,自定义安装。