## 1. values.yaml
上面的內置對象中有一個對象就是 Values,該對象提供對傳入 chart 的值的訪問,Values 對象的值有4個來源:
- chart 包中的 `values.yaml` 文件
- 父 chart 包的 `values.yaml` 文件
- 通過 `helm install` 或者 `helm upgrade` 的-f或者`--values`參數傳入的自定義的 yaml 文件
- 通過`--set` 參數傳入的值
chart 的 `values.yaml` 提供的值可以被用戶提供的 `values` 文件覆蓋,而該文件同樣可以被`--set`提供的參數所覆蓋。
這里我們來重新編輯 `mychart/values.yaml` 文件,將默認的值全部清空,添加一個新的數據:(values.yaml)
```bash
course: k8s
```
然后我們在上面的 `templates/configmap.yaml` 模板文件中就可以使用這個值了:(`configmap.yaml`)
```bash
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
course: {{ .Values.course }}
```
可以看到最后一行我們是通過`{{ .Values.course }}`來獲取 `course` 的值的。現在我們用 `debug` 模式來查看下我們的模板會被如何渲染:
```bash
$ helm install --dry-run --debug ./mychart
helm install --dry-run --debug .
[debug] Created tunnel using local port: '33509'
[debug] SERVER: "127.0.0.1:33509"
[debug] Original chart version: ""
[debug] CHART PATH: /root/course/kubeadm/helm/mychart
NAME: nasal-anaconda
REVISION: 1
RELEASED: Sun Sep 9 17:37:52 2018
CHART: mychart-0.1.0
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
course: k8s
HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nasal-anaconda-configmap
data:
myvalue: "Hello World"
course: k8s
```
我們可以看到 ConfigMap 中 `course` 的值被渲染成了 k8s,這是因為在默認的 `values.yaml` 文件中該參數值為 k8s,同樣的我們可以通過`--set`參數來輕松的覆蓋 course 的值:
```bash
$ helm install --dry-run --debug --set course=python ./mychart
[debug] Created tunnel using local port: '44571'
......
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: named-scorpion-configmap
data:
myvalue: "Hello World"
course: python
```
由于`--set` 比默認 `values.yaml` 文件具有更高的優先級,所以我們的模板生成為 `course: python`。
values 文件也可以包含更多結構化內容,例如,我們在 `values.yaml` 文件中可以創建 course 部分,然后在其中添加幾個鍵:
```bash
course:
k8s: devops
python: django
```
現在我們稍微修改模板:
```bash
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
k8s: {{ .Values.course.k8s }}
python: {{ .Values.course.python }}
```
同樣可以使用 `debug` 模式查看渲染結果:
```bash
$ helm install --dry-run --debug ./mychart
[debug] Created tunnel using local port: '33801'
......
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: exhaling-turtle-configmap
data:
myvalue: "Hello World"
k8s: devops
python: django
```
可以看到模板中的參數已經被 values.yaml 文件中的值給替換掉了。雖然以這種方式構建數據是可以的,但我們還是建議保持 value 樹淺一些,平一些,這樣維護起來要簡單一點。