侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 297 篇文章
  • 累计创建 134 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Helm3入门教程-6:Helm3内置对象详解

孔子说JAVA
2022-04-16 / 0 评论 / 0 点赞 / 368 阅读 / 7,542 字 / 正在检测是否收录...

Helm3入门教程全系列,26小时轻松掌握Helm

目录

1、Helm3内置对象

2、Values对象详解

对象可以通过模板引擎传递到模板中,当然你的代码也可以传递对象。在《Helm3入门教程-5:Helm Chart 的编写》 中编写第一个 chart 的时候,我们引用了一个 Helm 的内置对象 .Relases.Name,这个内置对象可以获取到安装 chart 时的 release 的名称并且注入到模板中进行替换。

  • .Relases.Name 最前面的点代表全局作用域。
  • 其实 Helm 中提供的内置对象非常容易理解,对象可以是一个简单的值,也可以包含其他的对象或者方法。例如前面提到的 .Relases.Name 中的 Name 就是 Release 对象下面的一个对象。而 Release 对象则是可以在模板中访问的高级对象之一。
  • Helm 内置的对象都是以大写字母开头, 这是符合Go的命名惯例。
  • 当你创建自己的名称时,可以按照团队约定自由设置。 就像你在 Artifact Hub 中看到的很多chart,其团队选择使用首字母小写将本地名称与内置对象区分开,本教程中我们也遵循该惯例。

1、Helm3内置对象

1.1 Release 对象

在上一部分中,我们用{{ .Release.Name }}在模板中插入版本名称。Release是你可以在模板中访问的顶层对象之一。该对象是 helm 在全局作用域中最重要的全局对象之一,描述了版本发布自身的一些信息,它包含了以下对象:

对象名称 对象描述
Release.Name release名称
Release.Namespace release 的命名空间(如果manifest没有覆盖的话)
Release.IsUpgrade 如果当前操作是升级或回滚的话,该值将被设置为true
Release.IsInstall 如果当前操作是安装的话,该值将被设置为true
Release.Revision 获取此次修订的版本号。安装时是1,每次升级或回滚时都会递增
Release.Service 获取渲染当前模板的服务名称,Helm里的值始终是Helm

1.2 Values 对象

Values对象是从values.yaml文件和用户提供的文件传进模板的,默认为空,是 helm 在全局作用域中最重要的全局对象之一,。使用 Value 对象可以获取到 value.yaml 文件中已定义的任何数值。Values 对象的值有4个来源:

  • chart 包中的 values.yaml 文件;
  • 父 chart 包的 values.yaml 文件;
  • 通过 helm install 或者 helm upgrade 的 -f 或者 –values 参数传入的自定义的 yaml 文件(e.g. helm install -f myvals.yaml ./mychart);
  • 通过--set 传递的单个参数(e.g. helm install --set foo=bar ./mychart);

注意:以上列表有明确顺序:默认使用values.yaml,可以被父chart的values.yaml覆盖,继而被用户提供的values文件覆盖, 最后会被–set参数覆盖,优先级为values.yaml最低,–set参数最高。

Value 键值对 获取方式
name: aaron .Values.name
info: name aaron .Values.info.name

1.3 Chart 对象

Chart 对象用于获取 chart.yaml 文件中的内容。 Chart.yaml里的所有数据都可以通过该对象访问。比如 {{ .Chart.Name }}-{{ .Chart.Version }} 会打印出 mychart-0.1.0。在 Chart 指南 中列出了可获得属性。

对象名称 描述
.Chart.Name 获取 Chart 的名称
.Chart.Version 获取 Chart 的版本
.Chart.apiVersion 获取 Chart 的 API 版本
.Chart.description 获取 Chart 的描述
.Chart.type 获取 Chart 的类型
.Chart.keywords 获取 Chart 的一组关键字

1.4 Capabilities 对象

Capabilities 对象提供了关于 Kubernetes 集群相关的信息。该对象有如下方法:

对象名称 描述
Capabilities.APIVersions 返回 Kubernetes 集群 API 版本信息列表
Capabilities.APIVersions.Has $version 用于检测指定的版本或资源在 Kubernetes 集群中是否可用,例如 batch/v1 或 apps/v1/Deployment
Capabilities.KubeVersion 和Capabilities.KubeVersion.Version 都用于获取 Kubernetes 的版本号
Capabilities.KubeVersion.Major Kubernetes的主版本
Capabilities.KubeVersion.Minor Kubernetes的次版本
Capabilities.HelmVersion 包含Helm版本详细信息的对象,和 helm version 的输出一致
Capabilities.HelmVersion.Version 是当前Helm语义格式的版本
Capabilities.HelmVersion.GitCommit Helm的git sha1值
Capabilities.HelmVersion.GitTreeState 是Helm git树的状态
Capabilities.HelmVersion.GoVersion 是使用的Go编译器版本

1.5 Template 对象

Template 对象用于获取当前被执行的模板的信息,它包含如下两个对象:

对象名称 描述
Template.Name 用于获取当前模板的名称和路径 (e.g. mychart/templates/mytemplate.yaml)
Template.BasePath 用于获取当前模板的路径 (e.g. mychart/templates)

1.6 Files 对象

Files 对象在chart中提供访问所有的非特殊文件的对象。你不能使用它访问Template对象,只能访问其他文件。

对象名称 描述
Files.Get 通过文件名获取文件的方法。 (.Files.Getconfig.ini)
Files.GetBytes 用字节数组代替字符串获取文件内容的方法。 对图片之类的文件很有用
Files.Glob 用给定的shell glob模式匹配文件名返回文件列表的方法
Files.Lines 逐行读取文件内容的方法。迭代文件中每一行时很有用
Files.AsSecrets 使用Base 64编码字符串返回文件体的方法
Files.AsConfig 使用YAML格式返回文件体的方法

2、Values对象详解

2.1 Values 对象使用方式

1)使用 values.yaml 中的值

values文件是普通的YAML文件。现在编辑mychart/values.yaml。通过 cat /dev/null > mychart/values.yaml 命令删除values.yaml中的默认内容,然后设置一个参数:

root@xnzysq20210118001:~# cat /dev/null > mychart/values.yaml 
root@xnzysq20210118001:~# vim mychart/values.yaml 
root@xnzysq20210118001:~# cat mychart/values.yaml 
favoriteDrink: coffee

现在可以在模板中使用它,favoriteDrink是Values的一个属性,使用方式 {{ .Values.favoriteDrink }}

root@xnzysq20210118001:~# vim mychart/templates/configmap.yaml 
root@xnzysq20210118001:~# cat mychart/templates/configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favoriteDrink }}

让我们看一下是如何渲染的,命令 helm install geared-marsupi ./mychart --dry-run --debug

root@xnzysq20210118001:~# helm install geared-marsupi ./mychart --dry-run --debug
install.go:178: [debug] Original chart version: ""
install.go:195: [debug] CHART PATH: /root/mychart

NAME: geared-marsupi
LAST DEPLOYED: Sat Apr 16 18:54:55 2022
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}

COMPUTED VALUES:
favoriteDrink: coffee

HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: geared-marsupi-configmap
data:
  myvalue: "Hello World"
  drink: coffee

可以看到最后一行,drink的值已被替换了。

2)使用 --set 覆盖默认值

由于默认的values.yaml文件中设置了favoriteDrink的值为coffee,则这个值显示在了模板中。可以在调用 helm install 时设置 --set ,很容易就能覆盖这个值。

  • 由于–set比默认的values.yaml文件优先级更高,模板就生成了drink: slurm。
root@xnzysq20210118001:~# helm install solid-vulture ./mychart --dry-run --debug --set favoriteDrink=slurm
install.go:178: [debug] Original chart version: ""
install.go:195: [debug] CHART PATH: /root/mychart

NAME: solid-vulture
LAST DEPLOYED: Sat Apr 16 18:58:31 2022
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
favoriteDrink: slurm

COMPUTED VALUES:
favoriteDrink: slurm

HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: solid-vulture-configmap
data:
  myvalue: "Hello World"
  drink: slurm

3)values文件结构化的内容

values文件也可以包含更多结构化的内容。比如我们可以在values.yaml文件中创建一个favorite项,然后添加一些key:

favorite:
  drink: coffee
  food: pizza

现在需要稍微修改一些模板:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink }}
  food: {{ .Values.favorite.food }}

虽然可以这样构造数据,但还是建议构建更加平坦的浅层树。以后想要给子chart赋值时,会看到如何使用树结构给value命名。

4)删除默认的key

如果需要从默认的value中删除key,可以将key设置为null,Helm将在覆盖的value合并时删除这个key。

  • 比如,稳定的Drupal允许在配置自定义镜像时配置活动探针。默认值为httpget:
livenessProbe:
  httpGet:
    path: /user/login
    port: http
  initialDelaySeconds: 120

如果你想替换掉httpGet用exec重写活动探针,使用 --set livenessProbe.exec.command=[cat,docroot/CHANGELOG.txt], Helm会把默认的key和重写的key合并在一起,从而生成以下YAML:

livenessProbe:
  httpGet:
    path: /user/login
    port: http
  exec:
    command:
    - cat
    - docroot/CHANGELOG.txt
  initialDelaySeconds: 120

因为Kubernetes中不能声明多个活动探针句柄,从而会使应用发布会失败。为了解决这个问题,Helm可以指定通过设定null来删除 livenessProbe.httpGet

helm install stable/drupal --set image=my-registry/drupal:0.1.0 --set livenessProbe.exec.command=[cat,docroot/CHANGELOG.txt] --set livenessProbe.httpGet=null

2.2 Values.yaml中的父子引用

1)父子引用1:使用export格式

若子chart在其values.yaml的root下有个叫做exports的key,则父chart就可以直接在requirements里通过指定需要import的key来将值import到自身的values.yaml里面。

# 父文件中import-values导入了data
# parent's requirements.yaml file
    ...
    import-values:
      - data

# 子文件中exports中设置了data
# child's values.yaml file
...
exports:
  data:
    myint: 99

helm会发现用户指定了要 import data 这个key,所以就去child的values.yaml里面寻找,发现了这个key有被export,于是就import了它的内容。

# 此时parent的values如下 (parent's values file)
...
myint: 99

需注意在parent的values中data这个key不会被import进来,只会import data的内容,如果希望把这个key也一起import进来可使用下面的方法。

2)父子引用2:使用child/parent格式

若想要获得不在名为"exports"这个key下面的值,就必须指定在child中要import的路径,以及在parent中的对应路径。

# parent's requirements.yaml file
dependencies:
  - name: subchart1
    repository: http://localhost:10191
    version: 0.1.0
    ...
    import-values:
      - child: default.data
        parent: myimports

根据如上的这个requirements文件,helm将在child的chart中寻找default.data的值并导入到parent中的 myimports 这个路径下。假设parent和child初始的values如下:

# 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的values的值为:

# parent's final values
myimports:
  myint: 999
  mybool: true
  mystring: "helm rocks!"

可看出parent中的values把myint和mybool从subchart1里面import了进来。

3)父chart中修改子chart的values.yaml

假设子chart名字是hello, 要修改hello的values.yaml文件的root下的image的值,那么可以在父chart中通过一下方式进行修改。

父values.yaml内容:

# in parent's values.yaml
...
hello:
    image: 'xxxx/test:hello'

这样hello(子chart)的values.yaml文件的image值就会被覆盖修改

3)利用global关键字

若父chart下所有子chart都有共同的变量A,要通过以上方式修改其值显示比较麻烦,这时可用关键字global。

子values.yaml内容:

# subchart1's values.yaml file
global:
    affinityValue: "test"

父values.yaml内容:

# in parent's values.yaml
global:
    affinityValue: "debug"

这样所有子chart的 global.affinityValue 都将被父values.yaml中的内容覆盖修改。

0

评论区