Kubernetes 包管理神器 helm

概览

• Helm 简介

• Helm 安装使用

• Helm 的基本使用

• Helm 模板详解之内置函数与 Values

• Helm 模板详解之模板函数与管道

• Helm 模板详解之控制流程

• Helm Hooks

helm 简介

很多人都使用过 Ubuntu 下的 ap-get 或者 CentOS 下的 yum, 这两者都是Linux 系统下的包管理工具。采用 apt-get/yum ,应用开发者可以管理应用包之间的依赖关系,发布应用;用户则可以以简单的方式查找、安装、升级、卸载应用程序。

这里可以将 Helm 看作 Kubernetes 下的 apt-get/yum。Helm 是 Deis (https://deis.com/) 开发的一个用于 kubernetes 的包管理器。每个包称为一个 Chart,一个 Chart 是一个目录(一般情况下会将目录进行打包压缩,形成 name-version.tgz 格式的单一文件,方便传输和存储)。

对于应用发布者而言,可以通过 Helm 打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。

对于使用者而言,使用 Helm 后不用需要了解 Kubernetes 的 Yaml 语法并编写应用部署文件,可以通过 Helm 下载并在 kubernetes 上安装需要的应用。

除此以外,Helm 还提供了 kubernetes 上的软件部署,删除,升级,回滚应用的强大功能。

helm 应用场景一:应用部署在多个区域

单独维护各个区域的 部署文件

Configmap、secret 等资源如何与 deployment—起发布 和回滚

image

挑战

•管理、编辑与更新大量的 K8s 配置文件

•部署一个含有大量配置文件的复杂 K8s 应用

•分享和复用 K8s 配置和应用

•参数化配置模板支持多个环境

•管理应用的发布:回滚、diff 和查看发布历史

•控制一个部署周期中的某一些环节

•发布后的验证

helm 解决方案

Helm 把 Kubernetes 资源(比女^deployment、service 或 ingress 等)打包到一个 chart中,而 chart 被保存到 chart 仓 库。通过 chart 仓库可用来存储和分 享chart。

• Helm 使发布可配置,支持发布应用配置的版本管理,简化 了 Kubernetes 部署应用的版本控制、打包、发布、删除、 更新等操作

• chart 是描述相关的一组 Kubernetes 资源的文件集合。 chart 通过创建为特定目录树的文件,将它们打包到版本化 的压缩包,然后进行部署。

Chart

Chart.yaml 是必须的,它 记录了 chart 的一些信息: chart 版本和名字等

• templates 下是 kubernetes资源的模板

• values.yaml 存放了模板 中的变量的值

image

helm 安装和使用

helm 架构

image

Helm Client

  • 本地 chart 开发
  • 仓库管理
  • 与 Tiller sever 交互
  • 发送预安装的 chart
  • 查询 release 信息
  • 要求升级或卸载已存在的 release

Tiller Server

监听来自 Helm client 的请求

通过 chart 及其配置构建一次发布

安装 chart 到 Kubernetes 集群,并跟踪随后的发布

通过与 Kubernetes 交互升级或卸载 chart

简单的说,client 管理 charts,而 server 管理发布 release

Helm 客户端安装

客户端安装:到 Helm Release 下载二进制文件,根据使用 的操作系统不同下载不同的版本,这里以 Linux上V2.15.1 为例,解压后将可执行文件 helm 拷贝至 usr/local/ bin 目录下即可, 这样 Helm 客户端就在这台机器上安装完了

使用 Helm 命令查看版本,会提示无法连接到服务端 Tiller helm version

Helm 服务器端组件安装

•前提:确保本地 kubectl 可以正常访问kubernetes的资源

•在命令行中执行:helm init. Helm 默认会去 gcr.io 拉取 tiller 的镜像,有时镜像拉不下来,

•可以指定 tiller 的镜像:

helm init --tiller-image registry.cn-

hangzhou.aliyuncs.com/softputer/tiller:v2.15.1

Helm 服务器组件安装问题

•如果在安装过程中遇到了一些其他问题,比如初始化的时 候出现了如下错误:

image

需要在节点上安装 socat 进行解决

image

安装完检查

Helm 服务端正常安装完成后,Tiller 默认被部署在 kubernetes 集群的 kube-system 命名空间下:

image

查看 helm 版本

image

创建 RBAC 授权文件

为 Tiller 创建一个ServiceAccount,让他拥有执行权限,创建 rbac.yaml

image

部署 rbac

部署

image

指定 serviceaccount 给 tiller

kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":

{"template":{"spec":{"serviceAccount":"tiller"}}}}'

helm ls

Helm 使用

创建一个 Chart

Templates 下的 deploment.yaml 默认是一个 nginx 服务,可以通过修改 Values.yaml 文件中的 image tag,来修改需要部署的 nginx 的版本

image

Chart 安装部署

执行:helm install –-name hell-helm ./hello-helm部署和

安装 chart.

查看 release

helm ls

删除 release

helm del hello-helm

Helm基本使用

仓库

可以用 helm repo list 来查看当前的仓库配置

image

对于无法正常科学上网的情况,可以自建一个 chart 仓库使用(此处不做介绍)

查找 chart

  • helm search

查找仓库里所有可用的 chart

  • helm seach mysql

查找仓库里是否有 mysql

  • helm inspect stable/mysql

查找 chart 的描述信息,包括运行方式和配置信息

安装 chart

  • 最简单的情况,只需要一个 chart 的名称参数

helm install stable/mysql

  • 可以自定义 release 的名字,而不是使用 chart 中配置的名字

helm install stable/mysql --name mydb

  • Helm status release-name

跟踪 release 状态或重新读取配置信息

删除 release

  • helm del release-name

删除 kubernetes 中的所有资源,但是 release-name 没有删除,不能被复用

  • Helm del –-purge release-name

release-name 可以再次被使用

定义 chart

一个 chart 包就是一个文件夹的集合,文件夹名称就是 chart 包的名称,比如创建一 个 mychart 的 chart 包

把 templates 目录下的文件全部 删除,来创建自己的模板

image

创建模板文件

在 templates 下新建一个 configmap.yaml 文件

实际上现在就已经有一个可安装的 chart 包了

helm install --name mychart ./mychart

image

添加一个简单的模板

Helm Chart 模板主要使用的是 Go 语言模板编写而成

image

包含在{{和}}之中的就是模板指令,{{ .Release.Name }}将 release 的名称注入到模板中来,这样最终生成的 ConfigMap 名称就是以 release 的名称开头的了。这里的 Release 模板对象属于 Helm 内置的一种对象,还有其他很多内置的对象

调试

  • Helm 为我们提供了--dry-run --debug 这个可选参数,在执行 helm install 的时候带上这两个参数就可以把对应的 values 值和生成的最终的资源清单文件打印出来,而不会真正的去部署一个 release 实例
  • helm install . --dry-run --debug ./mychart

Helm模板详解之内置函数与Values

内置对象

  • Release:这个对象描述了 release 本身。内置对象可以直接在文件中引用,Release 内置对象常用的值有:Release.Name:release 名称 Release.Namespace:release 的 namespace
  • Values:从 values.yaml 文件或者其他方式传入模板的值。默认情况下,Values 是空的

Values对象

Values 对象的值有四个来源, chart 包中的 values.yaml 文件,父 chart 包的 values.yaml 文件,使用 helm install 或者 helm upgrade 的-f 或者--values参数传⼊的⾃定义的 yaml 文件,通过--set 参数传⼊的值

values.yaml

重新清空 mychart/values.yaml,添加新的一行数据 course: k8s,同事修 configmap.yaml 的内容如下

image

helm install --dry-run --debug ./mychart

helm install --dry-run --debug –set course=python ./mychart

Helm 模板详解之模板函数与管道

模板函数

从.Values 中读取的值变成⫿符串的时候就可以通过调用 quote 模板函数来实现

image

模板函数使用结构

模板函数遵循调用的语法为:functionName arg1 arg2...。在上页的模板文件中,quote.Values.course.k8s 调用 quote函数并将后面的值作为一个参数传递给它

image

管道

管道我们通常称为 Pipeline,是一个链在一起的一系列模板命令的工具,以紧凑地表达一系列转换。

简单来说,管道是可以按顺序完成一系列事情的一种方法。

管道示例

k8s 的 value 值被渲染后是大写的⫿符串

python 的值渲染为重复出现3次的⫿符串Helm模板详解之控制

image

Helm模板详解之控制流程

控制流程

模板函数和管道是通过转换信息并将其插入到 YAML 文件中的强大方法。

但有时候需要添加一些比插入⫿符串更复杂一些的模板逻辑。这就需要使用到helm模板语言中提供的控制结构了

流程控制关键字

控制流程为我们提供了控制模板生成流程的一种能力,Helm 的模板语言提供了以下几种流程控制:

  • If/else 条件块
  • With 指定范围
  • Range 循环块

If/else条件

if/else 块是用于在模板中有条件地包含文本块的方法,条件块的基本结构

image

判断条件

要使用条件块就得判断条件是否为真,如果值为下面的几种

情况,则管道的结果为 false:

  • 一个布尔类型的假
  • 一个数⫿零
  • 一个空的⫿符串
  • 一个 nil(空或null)
  • 一个空的集合(map、slice、tuple、dict、array)

除了上面的这些情况外,其他所有条件都为真。

If/else 控制流程示例

image

helm install --dry-run --debug .

空格控制

上面我们的条件判断语句是在一整行中的,如果平时经常写代码的同学可能非常不习惯了,我们一般会将其格式化为更容易阅读的形式,比如:

image

这样在进行模板渲染的时候,会有多余的空行。

可以通过使用在而在}}前面添加一个空格和破折号-}}表示应该删除右边的空格,另外需要注意的是换行符也模板标识{{后面添加破折号和空格{{-来表示将空白左移,是空格

image

With关键词

  • With 关键词可以控制变量作用域
image
  • 之前的{{ .Release.xxx }},其中的.就是表示对当前范围的引用,.Values 就是告诉模板在当前范围中查找 Values 对象的值。
  • with语句可以允许将当前范围.设置为特定的对象,⽐如我们前⾯⼀直使⽤的.Values.course,我们可以使⽤ with 来将.范围指向.Values.course:(templates/configmap.yaml)
image

range 循环

几乎所有的编程语言都支持类似于 for、foreach 或者类似功能的循环机制,在 Helm 模板语言中,是使用 range 关键来进行循环操作

values.yaml

image

现在我们有一个课程列表,修改 configmap 模板文件来循环打印列表 range 循环结

image

循环结果

image

Helm Hooks

和 Kubernetes 里面的容器一样,Helm 也提供了 Hook 的机制,允许 chart 开发人员在 release 的生命周期中的某些节点来进行干预,比如我们可以利用 Hooks 来做下面的这些事情:

  • 在加载任何其他 chart 之前,在安装过程中加载 ConfigMap 或Secret
  • 在安装新 chart 之前执行作业以备份数据库,然后在升级后执行第二个作业以恢复数据
  • 在删除 release 之前运行作业,以便在删除 release 之前优雅地停止服务

值得注意的是 Hooks 和普通模板一样工作,但是它们具有特殊的注释,可以使 Helm 以不同的方式使用它们。

Hooks

image

Hook 写法

Hook 在资源清单中的 metadata 部分用 annotations 的⽅式进⾏声明:

image

写一个 hook

给一个资源添加 hook,只需要在 metadata 中添加相应的 annotations,如下 Job 资源中我们添加一个 annotations,要注意的是,如果我们没有添加下面这行注释的话,添加的内容就会被当成是 release 的一部分资源:

image

Hook 注解

  • 一个资源中我们也可以同时部署多个 hook
image
  • 为 hook 定义了一个权重,这有助于建立一个确定性的执行顺序,权重可以是正数也可以是负数,但是必须是字符串才行
image
  • 删除 hook 资源的策略

删除策略

  • hook-succeeded:表示 Tiller 在 hook 成功执⾏后删除hook 资源
  • hook-failed:表示如果 hook 在执⾏期间失败了,Tiller 应该删除 hook 资源
  • before-hook-creation:表示在删除新的 hook 之前应该删除以前的 hook

2019.10.29日21:00-22:00 直播为大家讲解,欢迎有问题的同学来听找WeChat:17812796384即可获得直播链接

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容