一、Helm 简介

Helm是 Kubernetes 的一个包管理工具,用来简化 Kubernetes 应用的部署和管理。可以把 Helm 比作 CentOS 的 yum 工具。

使用 Helm 可以完成以下事情:

  • 管理 Kubernetes manifest files
  • 管理 Helm 安装包 charts
  • 基于 chart 的 Kubernetes 应用分发

Helm 可以使用 Charts 启动 Kubernetes 集群,提供可用的工作流:

  • 一个 Redis 集群
  • 一个 Postgres 数据库
  • 一个 HAProxy 边界负载均衡

Helm 基本架构如下图:
c5d01266eef21038b43b2666c29decf9.jpg

Helm 产生原因

利用Kubernetes部署一个应用,需要Kubernetes原生资源文件如deployment、replicationcontroller、service或pod 等。而对于一个复杂的应用,会有很多类似上面的资源描述文件,如果有更新或回滚应用的需求,可能要修改和维护所涉及的大量资源文件,且由于缺少对发布过的应用版本管理和控制,使Kubernetes上的应用维护和更新等面临诸多的挑战,而Helm可以帮我们解决这些问题。

Helm 的基本概念

  • Chart: 是 Helm 管理的安装包,里面包含需要部署的安装包资源。可以把 Chart 比作 CentOS yum 使用的 rpm 文件。每个 Chart 包含下面两部分:
    • 包的基本描述文件 Chart.yaml
    • 放在 templates 目录中的一个或多个 Kubernetes manifest 文件模板
  • Release:是 chart 的部署实例,一个 chart 在一个 Kubernetes 集群上可以有多个 release,即这个 chart 可以被安装多次
  • Repository:chart 的仓库,用于发布和存储 chart

Helm 的用途

做为Kubernetes的一个包管理工具,Helm具有如下功能:

  • 创建新的chart
  • chart打包成tgz格式
  • 上传chart到chart仓库或从仓库中下载chart
  • 在Kubernetes集群中安装或卸载chart
  • 管理用Helm安装的chart的发布周期

Helm 的特性

  • 查找并使用流行的软件,将其打包为 Helm Charts,以便在 Kubernetes 中运行
  • 以 Helm Charts 的形式共享您自己的应用程序
  • 为您的 Kubernetes 应用程序创建可复制的构建
  • 智能地管理 Kubernetes 清单文件
  • 管理 Helm 包的发行版

Helm 的组成

Helm 由两部分组成,客户端 helm 和服务端 tiller。

  • tiller 运行在 Kubernetes 集群上,管理 chart 安装的 release
  • helm 是一个命令行工具,可在本地运行,一般运行在 CI/CD Server 上。

Helm 的实现

Helm client

  • Helm client采用go语言编写,采用gRPC协议与Tiller server交互。

Helm server

  • Tiller server也同样采用go语言编写,提供了gRPC server与client进行交互,利用Kubernetes client 库与Kubernetes进行通信,当前库使用了REST+JSON格式。
  • Tiller server 没有自己的数据库,目前使用Kubernetes的ConfigMaps存储相关信息

Helm 组件及相关术语

  • Helm Helm 是一个命令行下的客户端工具。主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。
  • Tiller 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 工作原理

Chart Install 过程

  • Helm 从指定的目录或者 tgz 文件中解析出 Chart 结构信息
  • Helm 将指定的 Chart 结构和 Values 信息通过 gRPC 传递给 Tiller
  • Tiller 根据 Chart 和 Values 生成一个 Release
  • Tiller 将 Release 发送给 Kubernetes 用于生成 Release

Chart Update 过程

  • Helm 从指定的目录或者 tgz 文件中解析出 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

二、Helm 安装

最新版二进制文件下载地址:https://github.com/helm/helm/releases
image.png

方式一:使用官方提供的脚本一键安装

  1. curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh
  2. chmod 744 get_helm.sh
  3. ./get_helm.sh

方式二:手动下载安装(以v2为例,安装的时候换为最新版本)

  1. wget https://storage.googleapis.com/kubernetes-helm/helm-v2.9.1-linux-amd64.tar.gz
  2. tar -zxvf helm-v2.9.1-linux-amd64.tar.gz
  3. mv helm-v2.9.1-linux-amd64/helm /usr/local/bin/helm

或者:

  1. wget https://get.helm.sh/helm-v3.4.0-linux-amd64.tar.gz
  2. tar xf helm-v3.4.0-linux-amd64.tar.gz
  3. cd linux-amd64
  4. cp helm /usr/local/bin/

检测安装:

  1. $ helm version
  2. Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
  3. Error: could not find tiller
  4. $ helm help

因为没有安装 tillerServer 所以会报找不到 tiller

初始化:

helm init

先在 K8S 集群上每个节点安装 socat 软件 (yum install -y socat),不然会报如下错误:

E0522 22:22:15.492436   24409 portforward.go:331] an error occurred forwarding 38398 -> 44134: error forwarding port 44134 to pod dc6da4ab99ad9c497c0cef1776b9dd18e0a612d507e2746ed63d36ef40f30174, uid : unable to do port forwarding: socat not found.
Error: cannot connect to Tiller

由于 Helm 默认会去 storage.googleapis.com 拉取镜像,如果你当前执行的机器不能访问该域名的话可以使用以下命令来安装:

helm init --client-only --stable-repo-url https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts/

:::info 如果是Windows,直接到https://github.com/helm/helm/releases下载最新版本即可(本文写作时最新版为v3.4.0),然后解压,将 helm.exe 所在路径添加到PATH环境变量。 :::