美文网首页
Kubernetes 包管理神器 helm

Kubernetes 包管理神器 helm

作者: 51reboot | 来源:发表于2019-10-28 17:00 被阅读0次

    概览

    • 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即可获得直播链接

    相关文章

      网友评论

          本文标题:Kubernetes 包管理神器 helm

          本文链接:https://www.haomeiwen.com/subject/elbbvctx.html