Kubernetes 包管理神器 helm

2019-10-28  本文已影响0人  51reboot

概览

• 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

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

查找仓库里所有可用的 chart

查找仓库里是否有 mysql

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

安装 chart

helm install stable/mysql

helm install stable/mysql --name mydb

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

删除 release

删除 kubernetes 中的所有资源,但是 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模板详解之内置函数与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条件

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

image

判断条件

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

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

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

If/else 控制流程示例

image

helm install --dry-run --debug .

空格控制

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

image

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

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

image

With关键词

image image

range 循环

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

values.yaml

image

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

image

循环结果

image

Helm Hooks

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

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

Hooks

image

Hook 写法

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

image

写一个 hook

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

image

Hook 注解

image image

删除策略

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

上一篇下一篇

猜你喜欢

热点阅读