zoukankan      html  css  js  c++  java
  • k8s的chart学习(上)

    chart 是 Helm 的应用打包格式。chart 由一系列文件组成,这些文件描述了 Kubernetes 部署应用时所需要的资源,比如 Service、Deployment、PersistentVolumeClaim、Secret、ConfigMap 等。

    单个的 chart 可以非常简单,只用于部署一个服务,比如 Memcached;chart 也可以很复杂,部署整个应用,比如包含 HTTP Servers、 Database、消息中间件、cache 等。

    chart 将这些文件放置在预定义的目录结构中,通常整个 chart 被打成 tar 包,而且标注上版本信息,便于 Helm 部署。

    下面我们将详细讨论 chart 的目录结构以及包含的各类文件。

    1.chart 目录结构

    以前面 MySQL chart 为例。一旦安装了某个 chart,我们就可以在 ~/.helm/cache/archive 中找到 chart 的 tar 包。

     解压后,MySQL chart 目录结构如下:

    目录名就是 chart 的名字(不带版本信息),这里是 mysql,包含如下内容:

    Chart.yaml 
    YAML 文件,描述 chart 的概要信息

    name 和 version 是必填项,其他都是可选。

    templates 目录 
    各类 Kubernetes 资源的配置模板都放置在这里。Helm 会将 values.yaml 中的参数值注入到模板中生成标准的 YAML 配置文件。

    模板是 chart 最重要的部分,也是 Helm 最强大的地方。模板增加了应用部署的灵活性,能够适用不同的环境,我们后面会详细讨论。

    templates/NOTES.txt 
    chart 的简易使用文档,chart 安装成功后会显示此文档内容。

    与模板一样,可以在 NOTE.txt 中插入配置参数,Helm 会动态注入参数值。

    2.chart模板

    Helm 通过模板创建 Kubernetes 能够理解的 YAML 格式的资源配置文件,我们将通过例子来学习如何使用模板。

    以 templates/secrets.yaml 为例:

    从结构看,文件的内容非常像 Secret 配置,只是大部分属性值变成了{{ xxx }}。这些 {{ xxx }} 实际上是模板的语法。Helm 采用了 Go 语言的模板来编写 chart。Go 模板非常强大,支持变量、对象、函数、流控制等功能。下面我们通过解析 templates/secrets.yaml 快速学习模板。

    ① {{ template "mysql.fullname" . }} 定义 Secret 的 name
    关键字 template 的作用是引用一个子模板 mysql.fullname。这个子模板是在 templates/_helpers.tpl 文件中定义的。

     

    这个定义还是很复杂的,因为它用到了模板语言中的对象、函数、流控制等概念。现在看不懂没关系,这里我们学习的重点是:如果存在一些信息多个模板都会用到,则可在 templates/_helpers.tpl 中将其定义为子模板,然后通过 templates 函数引用。

    这里 mysql.fullname 是由 release 与 chart 二者名字拼接组成。

    根据 chart 的最佳实践,所有资源的名称都应该保持一致,对于我们这个 chart,无论 Secret 还是 Deployment、PersistentVolumeClaim、Service,它们的名字都是子模板 mysql.fullname 的值。

    ② Chart 和 Release 是 Helm 预定义的对象,每个对象都有自己的属性,可以在模板中使用。如果使用下面命令安装 chart:

    helm install stable/mysql -n my

    那么:

    {{ .Chart.Name }} 的值为 mysql
    {{ .Chart.Version }} 的值为 0.10.2
    {{ .Release.Name }} 的值为 my
    {{ .Release.Service }} 始终取值为 Tiller
    {{ template "mysql.fullname" . }} 计算结果为 my-mysql

    ③ 这里指定 mysql-root-password 的值,不过使用了 if-else 的流控制,其逻辑为:
    如果 .Values.mysqlRootPassword 有值,则对其进行 base64 编码;否则随机生成一个 10 位的字符串并编码。

    Values 也是预定义的对象,代表的是 values.yaml 文件。而 .Values.mysqlRootPassword 则是 values.yaml 中定义的 mysqlRootPassword 参数:

     

    因为 mysqlRootPassword 被注释掉了,没有赋值,所以逻辑判断会走 else,即随机生成密码。

    randAlphaNumb64encquote 都是 Go 模板语言支持的函数,函数之间可以通过管道 | 连接。{{ randAlphaNum 10 | b64enc | quote }} 的作用是首先随机产生一个长度为 10 的字符串,然后将其 base64 编码,最后两边加上双引号。

    templates/secrets.yaml 这个例子展示了 chart 模板主要的功能,我们最大的收获应该是:模板将 chart 参数化了,通过 values.yaml 可以灵活定制应用。

    无论多复杂的应用,用户都可以用 Go 模板语言编写出 chart。无非是使用到更多的函数、对象和流控制。对于初学者,我的建议是尽量参考官方的 chart。根据二八定律,这些 chart 已经覆盖了绝大部分情况,而且采用了最佳实践。如何遇到不懂的函数、对象和其他语法,可参考官网文档 https://docs.helm.sh

    3.MySQL chart实践

    3.1chart 安装前的准备

    作为准备工作,安装之前需要先清楚 chart 的使用方法。这些信息通常记录在 values.yaml 和 README.md 中。除了下载源文件查看,执行 helm inspect values 可能是更方便的方法。

     

    输出的实际上是 values.yaml 的内容。阅读注释就可以知道 MySQL chart 支持哪些参数,安装之前需要做哪些准备。其中有一部分是关于存储的:

    chart 定义了一个 PersistentVolumeClaim,申请 8G 的 PersistentVolume。由于我们的实验环境不支持动态供给,所以得预先创建好相应的 PV,其配置文件 mysql-pv.yml 内容为:

    helm安装不会指定storageclassname,这个pvc就会看当前的namespace有没有default的storageclass,所以配置文件中storageClass不需要指定。

    创建PV mysql-pv

    接下来就可以安装 chart 了。

    3.2定制化安装 chart

    除了接受 values.yaml 的默认值,我们还可以定制化 chart,比如设置 mysqlRootPassword

    Helm 有两种方式传递配置参数:

      1. 指定自己的 values 文件。
        通常的做法是首先通过 helm inspect values mysql > myvalues.yaml生成 values 文件,然后设置 mysqlRootPassword,之后执行 helm install --values=myvalues.yaml mysql

      2. 通过 --set 直接传入参数值,比如:

    helm install ali/mysql --set mysqlRootPassword=admin123 -n my

    mysqlRootPassword 设置为 abc123。另外,-n 设置 release 为 my,各类资源的名称即为my-mysql

    通过 helm list 和 helm status 可以查看 chart 的最新状态。

    通过kubectl get 命令查看 pv pvc pod的状态

     

     PVC 已经 Bound,Deployment 也 AVAILABLE

    4.升级和回滚 release

    release 发布后可以执行 helm upgrade 对其升级,通过 --values 或 --set应用新的配置。比如将当前的 MySQL 版本升级到 5.7.15:

    helm upgrade --set imageTag=5.7.15 my ali/mysql

     等待一些时间,升级成功。

     helm history 可以查看 release 所有的版本。通过 helm rollback 可以回滚到任何版本。

    回滚成功,MySQL 恢复到 5.7.14。

     

  • 相关阅读:
    Angular--ui-router的使用
    一个简单的俄罗斯方块游戏脚本
    c中使用gets() 提示warning: this program uses gets(), which is unsafe.
    最短路径之Floyd算法
    动态规划求最大子序列
    Mac上编译C++报错
    nginx location匹配规则
    nginx配置入门
    拿什么守护你的Node.JS进程: Node出错崩溃了怎么办? foreverjs, 文摘随笔
    ASP.NET 上的 Async/Await 简介
  • 原文地址:https://www.cnblogs.com/benjamin77/p/9969321.html
Copyright © 2011-2022 走看看