[k8s 生態鏈 完美組合 Day15] helm values 介紹
昨天介紹完,簡易的建立自己的 helm chart 後,今年我們要談談,怎麼使用 helm 裡面的 values 的功能,以及它階層的功能。
首先我們先看我我設定了一個情境,那個情境為,我要做一個流量計數器,實作方式,我會透過 golang 寫一個 http server ,透過 http request 進來,會使用 redis 做 incr。 這邊有 code。
再來看看我們要怎麼使用 helm 設計這個結構呢? 先看下面的資料夾結構
上面藍色框框的就是我在一個 counter 的 charts 資料夾裡面,又多建立一個 redis charts。 這種做法我把它稱為 sub charts,我把它理解為, counter 需要 depend on redis。
這裡面教大家一個 helm 預先 render 的小訣竅。
$ helm template ./redis
# Source: redis/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
labels:
helm.sh/chart: redis-0.1.0
app.kubernetes.io/name: redis
app.kubernetes.io/instance: RELEASE-NAME
app.kubernetes.io/version: "1.16.0"
app.kubernetes.io/managed-by: Helm
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: redis
app.kubernetes.io/instance: RELEASE-NAME
template:
metadata:
labels:
app.kubernetes.io/name: redis
app.kubernetes.io/instance: RELEASE-NAME
spec:
serviceAccountName: redis
securityContext:
{}
containers:
- name: redis
securityContext:
{}
image: "redis:5.0.5"
imagePullPolicy: IfNotPresent
ports:
- name: redis
containerPort: 6479
protocol: TCP
resources:
{}
--- 下略...
透過這個方式可以知道你的 yaml 檔有沒有如你預期的樣子。
回到主題,我們看到上面目前 redis image 的版本是用 5.0.5版,因為它預設吃到的是 redis 自己的 value.yaml
也就是如圖示
注意它不是吃到下面那個 value.yaml,是藍色框框指到的 value.yaml
這時侯我們來實驗一件事情,我們要怎麼透過父層 value.yaml 來修改子層呢? 我們只要在 counter 的 value.yaml
加入如下
redis:
image:
tag: "5.0.4"
這時侯你下
# 注意 這邊是對 counter render 上面是對 redis render
$ helm template ./counter
# Source: counter/charts/redis/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
labels:
helm.sh/chart: redis-0.1.0
app.kubernetes.io/name: redis
app.kubernetes.io/instance: RELEASE-NAME
app.kubernetes.io/version: "1.16.0"
app.kubernetes.io/managed-by: Helm
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: redis
app.kubernetes.io/instance: RELEASE-NAME
template:
metadata:
labels:
app.kubernetes.io/name: redis
app.kubernetes.io/instance: RELEASE-NAME
spec:
serviceAccountName: redis
securityContext:
{}
containers:
- name: redis
securityContext:
{}
image: "redis:5.0.4"
imagePullPolicy: IfNotPresent
ports:
- name: redis
containerPort: 6479
protocol: TCP
resources:
{}
--- 下略...
有沒有注意到? 我們 redis 的版本被改成 5.0.4 了,由這邊我們知道 value.yaml,會由最父層開始讀取,如果沒有父層,才會取子層。
這邊補充一下,helm value 裡面有提供一個保留字叫做 global
,因為他的階層關係都是用 helm 的 name 去做定義。所以假設今天我有兩個服務都要透過同一個 mysql 服務,我怎麼用同一個 value.yaml 去控制呢?
global:
mysql:
address: 127.0.0.1:3306
password: test1234
db: default
那在 template上面描寫就可以如下
containers:
- name: example
securityContext:
{}
image: "example"
imagePullPolicy: IfNotPresent
env:
- mysql_address: {{.Values.global.mysql.address}}
- mysql_password: {{.Values.global.mysql.password}}
- mysql_db: {{.Values.global.mysql.db}}
value: "redis:6379"
上面的 helm chart 這邊有 code 可以參考
明天我會實際分享一下,我們專案的 helm 架構分享。