前言
万恶的 Google 总是弄些标准化的东西,然后还有些傻吊跟风,比如部署 Kubernetets 服务的时候,常用的工具 helm,今天我们介绍下helm2(3也通用)。
在开发 helm 插件的时候,我们经常需要测试插件的模板和Values的生成结果,如果每一次使用都要部署一次到k8s上那就不可取了。
所以官方提供了 –dry-run --debug 参数。
今天给小伙伴们介绍两个内容:
- helm多级chart如何编写
- 通过helm命令动态给chart的values属性赋值
一、多级chart的开发
helm 插件开发调试
- 第一步、新建一个chart
$ mkdir /helm
$ cd helm/
$ helm create mychart
Creating mychart
# 下面可以不用执行,我这里删除是因为要做个简单的例子,要不文件太多容易乱。
$ rm -rf mychart/templates/*
- 第二步、做一个configmap.yaml 文件
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cfgmap2
data:
dessert: {{ .Values.dessert }}
- 第三步、我们在 values.yaml 里加入 dessert 属性。(可以看上面模板 .Values.dessert 代表从values.yaml 文件找dessert属性),如下:
- 我们可以测试了,独立测试这个Chart
$ helm install --dry-run --debug /helm/mychart
SERVER: "localhost:44134"
CHART PATH: /Users/mattbutcher/Code/Go/src/k8s.io/helm/_scratch/mychart
NAME: newbie-elk
TARGET NAMESPACE: default
CHART: mychart 0.1.0
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: newbie-elk-cfgmap2
data:
dessert: sunxy
helm 的子 chart 编写
helm 支持子Chart定义,也就是“包中包”,chart 里面 还有子chart。
首先定义方式比较简单,需要在主Chart的 charts 文件夹里面 再新建 一个Chart,
那么新建的就是这个主Chart的子chart了。
- 第一步、新建一个chart,在刚才的chart里面找到charts文件夹
$ cd helm/mychart/charts
$ helm create subchart
Creating subchart
# 下面可以不用执行,我这里删除是因为要做个简单的例子,要不文件太多容易乱。
$ rm -rf /helm/mychart/charts/subcahrt/templates/*
- 第二步、做一个configmap.yaml 文件,可以看到和刚才的主chart是一样的,连文件内容都一样,因为我们这是在模拟主/子chart的复制问题。
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cfgmap2
data:
dessert: {{ .Values.dessert }}
- 同样我们现在测试下子chart,独立测试这个
$ helm install --dry-run --debug /helm/mychart/charts/subchart
SERVER: "localhost:44134"
CHART PATH: /Users/mattbutcher/Code/Go/src/k8s.io/helm/_scratch/mychart/charts/subchart
NAME: newbie-elk
TARGET NAMESPACE: default
CHART: subchart 0.1.0
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: newbie-elk-cfgmap2
data:
dessert: sunxy
主 Values.yaml 如何给子chart赋值
要覆盖子chart中的值,可以在父chart 的values.yaml文件中这样写:
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
subchart: # 注意此处名称
dessert: airoot.cn
测试下,输入结果:
data:
dessert: airoot.cn
你也可以定义全局Value 属性,这样主chart 和 子chart都可以访问了。
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
subchart:
dessert: ice cream
global:
salad: caesar
二、我们可以动态变更Values的值吗?
通过 helm 的 set 动态赋值
可能很多小伙伴都不知道 helm 是可以动态赋值的。
helm动态赋值使用 set 功能功能举个例子:
$ helm install --dry-run --debug ./mychart --set dessert=www.airoot.cn
我们还可以通过 set设置子chart
看例子:
$ helm install --dry-run --debug ./ --set dessert=www.airoot.cn --set subchart.dessert==airoot-uisys
可以看到通过helm 的 set 参数可以动态的设置helm chart的 values,如果设置子chart 我们只需要通过子chart的文件夹名字加上其自value.yaml 中的属性名就行了,很容易理解。
好到此我们已经了解了编写方法。希望大家关注我,后续我会个大家推几款重磅技术流。