简介
  • Helm 是 Deis 开发的一个用于 Kubernetes 应用的包管理工具,主要用来管理 Charts。有点类似于 Ubuntu 中的 APT 或 CentOS 中的 YUM。
  • Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata,以便于应用程序的分发。
  • 对于应用发布者而言,可以通过 Helm 打包应用、管理应用依赖关系、管理应用版本并发布应用到软件仓库。
  • 对于使用者而言,使用 Helm 后不用需要编写复杂的应用部署文件,可以以简单的方式在 Kubernetes 上查找、安装、升级、回滚、卸载应用程序。
组件及相关术语
  • Helm 是一个命令行下的客户端工具。主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。
  • Tiller 是 Helm 的服务端,部署在 Kubernetes 集群中。Tiller 用于接收 Helm 的请求,并根据 Chart 生成 Kubernetes 的部署文件( Helm 称为 Release ),然后提交给 Kubernetes 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。
  • Chart Helm 的软件包,采用 TAR 格式。类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件
  • Repoistory Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。
  • Release 使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。

    注:需要注意的是:Helm 中提到的 Release 和我们通常概念中的版本有所不同,这里的 Release 可以理解为 Helm 使用 Chart 包部署的一个应用实例。

工作原理

这张图描述了 Helm 的几个关键组件 Helm(客户端)、Tiller(服务器)、Repository(Chart 软件仓库)、Chart(软件包)之间的关系。
k8s之Helm初识_第1张图片

Chart Install 过程
  • Helm 从指定的目录或者 TAR 文件中解析出 Chart 结构信息。
  • Helm 将指定的 Chart 结构和 Values 信息通过 gRPC 传递给 Tiller。
  • Tiller 根据 Chart 和 Values 生成一个 Release。
  • Tiller 将 Release 发送给 Kubernetes 用于生成 Release。
Chart Update 过程
  • Helm 从指定的目录或者 TAR 文件中解析出 Chart 结构信息。
  • Helm 将需要更新的 Release 的名称、Chart 结构和 Values 信息传递给 Tiller。
  • Tiller 生成 Release 并更新指定名称的 Release 的 History。
  • Tiller 将 Release 发送给 Kubernetes 用于更新 Release。
Chart Rollback 过程
  • Helm 将要回滚的 Release 的名称传递给 Tiller。
  • Tiller 根据 Release 的名称查找 History。
  • Tiller 从 History 中获取上一个 Release。
  • Tiller 将上一个 Release 发送给 Kubernetes 用于替换当前 Release。
Chart 处理依赖说明
  • Tiller 在处理 Chart 时,直接将 Chart 以及其依赖的所有 Charts 合并为一个 Release,同时传递给 Kubernetes。因此 Tiller 并不负责管理依赖之间的启动顺序。Chart 中的应用需要能够自行处理依赖关系。
安装
  • 下载二进制包 releases,然后解压将二进制包 heml,tiller 复制到 /usr/bin/
  • 部署 RBAC,将 rbac-config.yaml 文件保存到本地,然后执行 kubectl create -f rbac-config.yaml
  • 执行 helm init -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.12.1 --service-account tiller 进行初始化,如果已经执行过初始化,可以添加 --upgrade 选项进行再次初始化
  • 注:helm init 在缺省配置下,Helm 会利用 gcr.io/kubernetes-helm/tiller 镜像在Kubernetes集群上安装配置 Tiller;并且利用 https://kubernetes-charts.storage.googleapis.com 作为缺省的 stable repository 的地址。由于在国内可能无法访问 "gcr.io", "storage.googleapis.com" 等域名,阿里云容器服务为此提供了镜像站点,但是版本比较老。所以本人在 github 上使用 github pages 做了一个 charts 仓库的镜像,https://babyshen.github.io/helm-charts-mirror/
  • 执行 helm version 进行验证
  • helm 命令自动补全:helm completion bash > /etc/bash_completion.d/helm
基础操作
  • 查找 helm search CHARTNAME
  • 检查 helm inspect CHARTNAME
  • 安装 helm install --name mem1 stable/memcached
  • 获取状态信息 helm status mem1
  • 列出 helm list [-a]
  • 删除 helm delete [--purge] mem1
  • 下载 helm fetch stable/redis
  • 创建 helm create CHARTNAME
  • 语法检测 helm lint CHARTNAME
  • 打包 helm package CHARTNAME
  • 显示状态 helm status NAME
  • helm serve

实例 部署 efk 日志系统

1、准备 charts

  • helm fetch stable/elasticsearch
  • helm fetch stable/fluentd-elasticsearch
  • helm fetch stable/kibana # kibana 要和 elasticsearch 版本一致

2、解压修改各 values.yaml 配置文件

  • elasticsearch/values.yaml
    • 修改 master.persistence.enabled 为 false,不启用存储卷
    • 先安装 elasticsearch ,保存结果中的地址,如 els1-elasticsearch-client.efk.svc.cluster.local
  • fluentd-elasticsearch/values.yaml
    • 修改 image.repositorydocker.io/mirrorgooglecontainers/fluentd-elasticsearch
    • 修改 elasticsearch.host 为上一步中的地址,如 els1-elasticsearch-client.efk.svc.cluster.local
  • kibana/values.yaml
    • 修改 files.kibana.yml.elasticsearch.urlhttp://els1-elasticsearch-client.efk.svc.cluster.local:9200
    • 修改 service.typeNodePort,进行端口映射

3、安装各组件

  • kubect create ns efk # 创建名称空间
  • helm install --name els1 --namespace=efk -f ./elasticsearch/values.yaml stable/elasticsearch # 记录输出结果中地址,类似 els1-elasticsearch-client.efk.svc.cluster.local
  • helm install --name flu1 --namespace=efk -f ./fluentd-elasticsearch/values.yaml stable/fluentd-elasticsearch
  • helm install --name kib1 --namespace=efk -f ./kibana/values.yaml stable/kibana

4、访问 Kibana

  • 查看端口:kubectl get svc -n efk -l app=kibana
  • 访问:http://IP:Port,无账号密码
Ref
  • helm github
  • helm docs
  • helm charts hub
  • helm charts github
  • kubeapps hub
  • Helm 入门指南