helm chart常用

220 阅读3分钟

原链接地址Helm | chart开发提示和技巧

1. 字符串引号括起来,但整型不用

使用字符串数据时,你总是更安全地将字符串括起来而不是露在外面:

name: {{ .Values.MyName | quote }}

但是使用整型时不要把值括起来,在很多场景中那样会导致Kubernetes内解析失败。

port: {{ .Values.Port }}

这个说明不适用于环境变量是字符串的情况,即使表现为整型:

env:
  - name: HOST
    value: "http://host"
  - name: PORT
    value: "1234"

2. 使用 include 方法

Go提供了一种使用内置模板将一个模板包含在另一个模板中的方法。然而内置方法并不适用于Go模板流水线。

为使包含模板成为可能,然后对该模板的输出执行操作,Helm有一个特殊的include方法:

{{ include "toYaml" $value | indent 2 }}

上面这个包含的模板称为toYaml,传值给$value,然后将这个模板的输出传给indent方法。

由于YAML将重要性归因于缩进级别和空白,使其在包含代码片段时变成了一种好方法。但是在相关的上下文中要处理缩进。

3. 使用 tpl 方法

tpl方法允许开发者在模板中使用字符串作为模板。将模板字符串作为值传给chart或渲染额外的配置文件时会很有用。 语法: {{ tpl TEMPLATE_STRING VALUES }}

示例:

# values
template: "{{ .Values.name }}"
name: "Tom"

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

# output
Tom

渲染额外的配置文件:

# 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

4. 创建镜像拉取密钥

镜像拉取密钥本质上是 注册表,用户名和密码的组合。在正在部署的应用程序中你可能需要它,但创建时需要用base64跑一会儿。我们可以写一个辅助模板来编写Docker的配置文件,用来承载密钥。示例如下:

首先,假定values.yaml文件中定义了证书如下:

imageCredentials:
  registry: quay.io
  username: someone
  password: sillyness
  email: someone@host.com

然后定义下面的辅助模板:

{{- define "imagePullSecret" }}
{{- with .Values.imageCredentials }}
{{- printf "{"auths":{"%s":{"username":"%s","password":"%s","email":"%s","auth":"%s"}}}" .registry .username .password .email (printf "%s:%s" .username .password | b64enc) | b64enc }}
{{- end }}
{{- end }}

最终,我们使用辅助模板在更大的模板中创建了密钥清单:

apiVersion: v1
kind: Secret
metadata:
  name: myregistrykey
type: kubernetes.io/dockerconfigjson
data:
  .dockerconfigjson: {{ template "imagePullSecret" . }}

5. 自动滚动部署

由于配置映射或密钥作为配置文件注入容器以及其他外部依赖更新导致经常需要滚动部署pod。 随后的helm upgrade更新基于这个应用可能需要重新启动,但如果负载本身没有更改并使用原有配置保持运行,会导致部署不一致。

sha256sum方法保证在另一个文件发生更改时更新负载说明:

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
[...]

注意:如果要将这些添加到库chart中,就无法使用$.Template.BasePath访问你的文件。相反你可以使用 {{ include ("mylibchart.configmap") . | sha256sum }} 引用你的定义。

这个场景下你通常想滚动更新你的负载,可以使用类似的说明步骤,而不是使用随机字符串替换,因而经常更改并导致负载滚动更新:

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        rollme: {{ randAlphaNum 5 | quote }}
[...]

每次调用模板方法会生成一个唯一的随机字符串。这意味着如果需要同步多种资源使用的随机字符串,所有的相对资源都要在同一个模板文件中。

这两种方法都允许你的部署利用内置的更新策略逻辑来避免停机。

! 注意:过去我们推荐使用--recreate-pods参数作为另一个选项。这个参数在Helm 3中不推荐使用,而支持上面更具声明性的方法。

6. 安装helm diff 插件:

1. helm repo add stable https://charts.helm.sh/stable
2. helm repo update
3. helm plugin install https://github.com/databus23/helm-diff