k8s的chart学习(一)

chart 

    chart 是Helm 的应用打包格式。chart 由一系列文件组成,这些文件描述了Kubernetes 部署应用时所需要的资源,比如Service、Deployment、PersistentVolumeClaim 、Secret 、ConfigMap等。
    单个的chart 可以非常简单,只用于部署一个服务,比如Memcache。chart 也可以很复杂,部署整个应用,比如包含HTTP Servcers、Database、消息中间件、Cache等。
chart 将这些文件放置在预定义的目录结构中,通常整个chart被打成tar 包,而且标注上版本信息,便于Helm 部署。
1.chart 目录结构
 一旦安转了某个chart,我们就可以在 ~/.helm/cache/archive 中找到chart的tar 包
 
解压后 ,MySQL chart 目录如图
 
(1)Chart.yaml  描述 chart 的概要信息
apiVersion: v1
appVersion: 5.7.14
description: Fast, reliable, scalable, and easy to use open-source relational database
  system.
engine: gotpl
home: https://www.mysql.com/
icon: https://www.mysql.com/common/logos/logo-mysql-170x115.png
keywords:
- mysql
- database
- sql
maintainers:
- email: o.with@sportradar.com
  name: olemarkus
- email: viglesias@google.com
  name: viglesiasce
name: mysql
sources:
- https://github.com/kubernetes/charts
- https://github.com/docker-library/mysql
version: 1.3.1

 name 和 version 是必填的,其他可选   

 
(2) README.md   chart的使用文档
(3)LICENSE 文本文件 描述chart 的许可信息,可选  
(4)values.yaml chart 支持在安装时根据参数进行定制化配置,而value.yaml 则提供这些配置参数的默认值
(5) temlates 目录 , 各类Kubernetes 资源的配置模板都放在这里。Helm 会将values.yaml 中的参数值注入模板中,生成标准的YAML配
(6)templates/NOTES.txt  chart 的使用建议文档,chart安转成功后,会显示此文档内容,与模板一样,可以在NOTE.txt中插入配置参数,Helm会动态注入参数值。
 

2.chart 模板

Helm 通过模板创建Kubernetes 能够理解的YAML 格式的资源配置文件,以template/secrets.yaml 为例
 
{{- if not .Values.existingSecret }}
apiVersion: v1
kind: Secret
metadata:
  name: {{ template "mysql.fullname" . }}  (1  
  namespace: {{ .Release.Namespace }}
  labels:
    app: {{ template "mysql.fullname" . }}
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"2
    release: "{{ .Release.Name }}"
    heritage: "{{ .Release.Service }}"
type: Opaque
data:
  {{ if .Values.mysqlRootPassword }}  (3
  mysql-root-password:  {{ .Values.mysqlRootPassword | b64enc | quote }}
  {{ else }}
  mysql-root-password: {{ randAlphaNum 10 | b64enc | quote }}
  {{ end }}
  {{ if .Values.mysqlPassword }}
  mysql-password:  {{ .Values.mysqlPassword | b64enc | quote }}
  {{ else }}
  mysql-password: {{ randAlphaNum 10 | b64enc | quote }}
  {{ end }}
{{- if .Values.ssl.enabled }}
{{ if .Values.ssl.certificates }}
{{- range .Values.ssl.certificates }}
 
   (1) {{ template "mysql.fullname" . }} 定义Secret的name .关键字template的作用是引用一个子模板 mysql.fullname。这个子模板是在templates/_helpers.tp1 文件中定义的
{{- define "mysql.fullname" -}}
{{- if .Values.fullnameOverride -}}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
{{- else -}}
{{- $name := default .Chart.Name .Values.nameOverride -}}
{{- if contains $name .Release.Name -}}
{{- printf .Release.Name | trunc 63 | trimSuffix "-" -}}
{{- else -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{- end -}}
{{- end -}}

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

(2)Chart 和Release 是Helm 预定义的对象,每个对象都有自己的属性,可以在模板中使用。如果使用下面的命令安装chart
helm install stable/mysql -n my
那么:
  • {{.Chart.Name}} 的值为mysql
  • {{.Chart.Version}} 的值为0.3.0
  • {{.Release.NAME}} 的值为my
  • {{.Release.Service}} 始终值为Tiller
  • {{template "mysql.fullname" .}} 计算结果为my-mysql
(3)这里指定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.1.准备工作

作为准备工作,安装之前需要先清楚 chart 的使用方法。这些信息通常记录在 values.yaml 和 README.md 中。除了下载源文件查看,执行 helm inspect values 可能是更方便的方法。
 
输出的实际上是values.yaml的内容。。阅读注释就可以知道 MySQL chart 支持哪些参数,安装之前需要做哪些准备。其中有一部分是关于存储的:
 
 
chart 定义了一个 PersistentVolumeClaim,申请 8G 的 PersistentVolume。由于我们的实验环境不支持动态供给,所以得预先创建好相应的 PV,其配置文件 mysql-pv.yml 内容为:
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 8Gi
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /nfsdata/mysql-pv
    server: 172.18.211.44

创建PV mysql-pv

kubectl apply -f mysql-pv.yaml

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的状态

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。

 
posted @ 2019-08-27 17:17  xmc_2022  阅读(502)  评论(0)    收藏  举报