helm实战·chart配置

目录

helm实战系列·制作chart包

helm命令行参数

前文《制作chart包》安装过程中有提到了--set设置参数的方式, 还有通过--values/-f制定yaml文件, 如果在命令行中出现了多个文件, 最右的文件有效。其中--set的优先级高,会被合并到--values和chart包的values.yaml文件中,通过helm get values可以看到Release当前版本values参数

helm get values hello-helm -n helm-demo
USER-SUPPLIED VALUES:
null

同时使用helm upgrade指定--reset-values也会清除前次的--set的值。由于--set设置的复杂的值,例如

$ --set servers[0].port=80,servers[0].host=example
servers:
  - port: 80
    host: example
    
$ --set name={a, b, c}
name:
  - a
  - b
  - c
  
$ --set a=b,c=d
a: b
c: d

$--set name=value1\,value2 使用\转义
name: "value1,value2"

$--set nodeSelector."kubernetes\.io/role"=master  这里使用到了toYaml函数
nodeSelector:
  kubernetes.io/role: master

更加复杂的数据结构尽量不要使用--set来表达,一是容易出错,二是可读性差。针对情况在设计values.yaml时尽量不要使用复杂的数据结构。

##values.yaml配置

Helm使用了Go模板构建模板,除了有Sprig库 (“env”和“expandenv”由于安全原因去除),额外添加了includ和required方法。

value: {{ include "mytpl" . | lower | quote }}
#添加mytpl模板,转为小写,双引号括起来,一般字符串需要括起来,数字不用

备注:{{}}表示模板逻辑

value: {{ required "A valid .Values.who entry required!" .Values.who }}
# 从.Values.who获取值,如果为空打印错误信心

使用tpl方法,可以在模板中使用字符串作为模板,将模板字符串作为值传递给chart或渲染额外文件时有用,{{ tpl TEMPLATE_STRING VALUES }}

1.传递给chart
# values
template: "{{ .Values.name }}"
name: "Tom"

# template
{{ tpl .Values.template . }}

# output
Tom

2.渲染额外文件
# external configuration file conf/app.conf
firstName={{ .Values.firstName }}
lastName={{ .Values.lastName }}

# values
firstName: Peter
lastName: Parker

# template
{{ tpl (.Files.Get "conf/app.conf") . }}

# output
firstName=Peter
lastName=Parker

Chart.yaml文件

Chart.yaml文件必须的,从 v3.3.2,不再允许额外的字段。推荐的方法是在 annotations
 中添加自定义元数据。有以下字段:
apiVersion: chart API 版本 (必需)
name: chart名称 (必需)
version: 语义化2 版本(必需)
kubeVersion: 兼容Kubernetes版本的语义化版本(可选)
description: 一句话对这个项目的描述(可选)
type: chart类型 (可选)
keywords:
  - 关于项目的一组关键字(可选)
home: 项目home页面的URL (可选)
sources:
  - 项目源码的URL列表(可选)
dependencies: # chart 必要条件列表 (可选)
  - name: chart名称 (nginx)
    version: chart版本 ("1.2.3")
    repository: (可选)仓库URL ("https://example.com/charts") 或别名 ("@repo-name")
    condition: (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled )
    tags: # (可选)
      - 用于一次启用/禁用 一组chart的tag
    import-values: # (可选)
      - ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项
    alias: (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用
maintainers: # (可选)
  - name: 维护者名字 (每个维护者都需要)
    email: 维护者邮箱 (每个维护者可选)
    url: 维护者URL (每个维护者可选)
icon: 用做icon的SVG或PNG图片URL (可选)
appVersion: 包含的应用版本(可选)。不需要是语义化,建议使用引号
deprecated: 不被推荐的chart (可选,布尔值)
annotations:
  example: 按名称输入的批注列表 (可选).

这里主要针对dependencies讲解,使用dependencies可以引入依赖的chart,以前文中wordpress-demo为例

dependencies:
- condition: memcached.enabled
  name: memcached
  repository: https://charts.bitnami.com/bitnami
  version: 6.x.x
- condition: mariadb.enabled
  name: mariadb
  repository: https://charts.bitnami.com/bitnami
  version: 10.x.x
- name: common
  repository: "@bitnami"
  tags:
  - bitnami-common
  version: 1.x.x

repository可以是仓库地址,也可以已经添加的仓库的名字(通过helm repo add添加)

当执行helm dependency update时,会将依赖的chart包下载到charts/目录下,依赖名字不能以_和.开头,不然不会被chart加载器加载依赖中的tag和condition字段,用于评估chart是否加载,condition优先级高于tag。
# parentchart/Chart.yaml

dependencies:
  - name: subchart1
    repository: http://localhost:10191
    version: 0.1.0
    condition: subchart1.enabled, global.subchart1.enabled
    tags:
      - front-end
      - subchart1
  - name: subchart2
    repository: http://localhost:10191
    version: 0.1.0
    condition: subchart2.enabled,global.subchart2.enabled
    tags:
      - back-end
      - subchart2
  
# parentchart/values.yaml

subchart1:
  enabled: true
tags:
  front-end: false
  back-end: true
上面展示来看,带有tag为front-end会被禁用,subchart1.enabled会覆盖tag的逻辑,所以subchart1会启用。subchart2由于subchart2.enabled没有值,且带有back-end标签,所以也会启用。
通过依赖导入字Value
# parent's Chart.yaml file

dependencies:
  - name: subchart
    repository: http://localhost:10191
    version: 0.1.0
    import-values:
      - data

# child's values.yaml file

exports:
  data:
    myint: 99
    
# parent's values

myint: 99
父chart中Chart.yaml可以通过import-values导入子chart中values.yaml通过export导出的变量,通过helm get values可以看到父chart的values值中存在myint=99。

事例2

# parent's Chart.yaml file

dependencies:
  - name: subchart1
    repository: http://localhost:10191
    version: 0.1.0
    ...
    import-values:
      - child: default.data
        parent: myimports

# parent's values.yaml file

myimports:
  myint: 0
  mybool: false
  mystring: "helm rocks!"
  
# subchart1's values.yaml file

default:
  data:
    myint: 999
    mybool: true
    
# parent's final values

myimports:
  myint: 999
  mybool: true
  mystring: "helm rocks!"
#由代码可以看出,父Chart.yaml中使用import-values字段通过子-父形式将父myimports对应的值给覆盖了,最终父Chart的values得到一个合并之后的值。

模板文件

上文也提到了helm使用了Go的模板渲染,所有的模板文件来自templates/,helm渲染Chart时,模板引擎会渲染templates/所有的文件,模板的值来自values.yaml。可以是chart包中的values.yaml,也可以是helm install -f values.yaml指定一个外部文件进行覆盖。
Values

是values.yaml文件或者helm install --set a=b
设置的变量,模板中也可以使用预定义的变量。

以下是预定义值,可以覆盖,区分大小写。

Release.Name
: 版本名称(非chart的)
Release.Namespace
: 发布的chart版本的命名空间,helm install -n helm-demo
-n 可以设置namespace
Release.Service
: 组织版本的服务
Release.IsUpgrade
: 如果当前操作是升级或回滚,设置为true
Release.IsInstall
: 如果当前操作是安装,设置为true
Chart
: Chart.yaml
的内容。因此,chart的版本可以从 Chart.Version
 获得, 并且维护者在Chart.Maintainers
里。
Files
: chart中的包含了非特殊文件的类图对象。这将不允许您访问模板, 但是可以访问现有的其他文件(除非被.helmignore
排除在外)。使用{{ index .Files "file.name" }}
可以访问文件或者使用{{.Files.Get name }}
功能。您也可以使用{{ .Files.GetBytes }}
作为[]byte
访问文件内容。
Capabilities
: 包含了Kubernetes版本信息的类图对象。({{ .Capabilities.KubeVersion }}
) 和支持的Kubernetes API 版本({{ .Capabilities.APIVersions.Has "batch/v1" }}
)
Chart.yaml文件未知字段不会被解析,需要传值可以使用values.yaml

Values文件必要值

imageRegistry: "quay.io/deis" #镜像
dockerTag: "latest" #镜像tag
pullPolicy: "Always" #更新策略
storage: "s3" #存储

值的范围

values.yaml
文件里面可以访问子chart的值,以前文演示wordpress-demo为例,有依赖mysql和apache

title: "My WordPress Site" # Sent to the WordPress template

mysql:
  max_connections: 100 # Sent to MySQL
  password: "secret"

apache:
  port: 8080 # Passed to Apache

#在父Chart的模板里面可以使用.Values.mysql.password访问,子Chart的模板不能访问title变量和apache.port变量

全局变量

title: "My WordPress Site" # Sent to the WordPress template

global:
  app: MyWordPress

mysql:
  max_connections: 100 # Sent to MySQL
  password: "secret"

apache:
  port: 8080 # Passed to Apache

helm2中已添加了全局变量,对于子Chart如mysql可以通过.Values.global.app访问

实际上经过渲染,最终的values.yaml文件如下:

title: "My WordPress Site" # Sent to the WordPress template

global:
  app: MyWordPress

mysql:
  global:
    app: MyWordPress
  max_connections: 100 # Sent to MySQL
  password: "secret"

apache:
  global:
    app: MyWordPress
  port: 8080 # Passed to Apache

#可以看到会在子Chart中生成对应的global.app,另外某个子Chart如果声明过全局变量,不会透传到父模块,同时父chart的全局变量优先级高于子Chart。

架构文件

#values.schema.json用于描述values.yaml的结构,在执行helm安装,升级,校验等命令时会作为校验依据。本质上是用于校验Values对象的合法性。
posted @ 2023-02-15 14:32  小丶凡  阅读(543)  评论(0编辑  收藏  举报
1