helm3自定義chart編寫


當我們安裝好helm之后我們可以開始自定義chart,那么我們需要先創建出一個模板如下:

helm create myapp

之后我們可以一下目錄結構,目錄的作用我簡要介紹一下:

templates/ 目錄包括了模板文件。當Helm評估chart時,會通過模板渲染引擎將所有文件發送到templates/目錄中。 然后收集模板的結果並發送給Kubernetes。

  • _helpers.tpl里面的內容是定義模板用的,所有模板都可以再這里定義,然后再任何yaml文件當中都可以調用這個文件下的模板
  • NOTES.txt: chart的"幫助文本"。這會在你的用戶執行helm install時展示給他們。
  • deployment.yaml: 創建Kubernetes 工作負載的基本清單
  • service.yaml: 為你的工作負載創建一個 service終端基本清單。
  • _helpers.tpl: 放置可以通過chart復用的模板輔助對象

values.yaml 文件也導入到了模板。這個文件包含了chart的 默認值 。這些值會在用戶執行helm install 或 helm upgrade時被覆蓋。

Chart.yaml 文件包含了該chart的描述。你可以從模板中訪問它。charts/目錄 可以 包含其他的chart(稱之為 子chart)。 指南稍后我們會看到當涉及模板渲染時這些是如何工作的。

 

$tree myapp/
myapp/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

3 directories, 10 files

現在展示一下我所創建的chart為例

$tree myapp/
myapp/
├── charts
├── Chart.yaml
├── templates
│   ├── configmap.yaml
│   └── _helpers.tpl
├── test.yaml
├── values.yaml
└── values.yaml.bak

2 directories, 7 files

其中我修改過的內容如下:

$cat values.yaml
favorite:
  drink: coffee
  food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
$cat templates/configmap.yaml
{{ $release := "ok" }}
apiVersion: v1
kind: ConfigMap
metadata:
    name: {{ .Release.Name }}-configmap
    labels:
    {{- include "mychart.labels" . | indent 8 }}
data:
    myvalue: "Hello World"
    {{- with .Values.favorite }}
    drink: {{ .drink }}
    food: {{ .food }}
    release: {{ $release }}
    {{- end }}
    {{- if eq .Values.favorite.drink "coffee" }}
    mug: true
    {{- end }}
    toppings: |-
        {{- range $.Values.pizzaToppings }}
        -{{ . | title | quote }}
        {{- end }}
    size: |-
        {{- range $index,$name := tuple "small" "medium" "large" }}
        {{ $index }}: {{ $name }}
        {{- end }}
$cat templates/_helpers.tpl
{{/* Generate basic labels */}}
{{- define "mychart.labels" }}
generator: helm
date: {{ now | htmlDate }}
chart: {{ .Chart.Name }}
version: {{ .Chart.Version }}
{{- end }}

 上述所需要的技術點:

設置自定義變量

{{ $release := "ok" }}

引用內部變量,其中.就是當前作用域的變量,Release.Name為helm install的名字

name: {{ .Release.Name }}-configmap

引用模板,其中{{-代表去除前面的空格-}}代表去除后面的空格,include代表引用模板,mychart.labels為引用模板的內容(內容再_helpers.tpl中),后面的.代表全局作用域,否則_helpers中的有些內容將獲取不到,管道符|代表把前面的內容賦予給管道符,然后縮進8個空格

{{- include "mychart.labels" . | indent 8 }}

with代表循環,循環的只為values.yam文件中的內容,注意,必須為大寫Values,{{.drink}}為所循環出來的下一級,也就是values.yaml下的favorite下的drink字段,其實也可以循環tuple等類型

{{- with .Values.favorite }}
    drink: {{ .drink }}
    food: {{ .food }}
    release: {{ $release }}
{{- end }}

if判斷語句,eq代表等於(還有ge,lt,ne等),那么下面的意思是如果values.yaml文件中favorite下的drink內容為coffee,那么就添加一個mug:true字段

{{- if eq .Values.favorite.drink "coffee" }}
mug: true
{{- end }}

range也代表循環,$代表頂級作用域,意思是說不管再那個作用域,只要出現$都可以調用頂級的變量,那么循環的內容也再_helpers.tpl文件中,.代表循環出來的單個內容然后給title處理變成抬頭,再給quote函數處理,quote代表字符串化

toppings: |-
        {{- range $.Values.pizzaToppings }}
        -{{ . | title | quote }}
        {{- end }}

對於range也可以循環tuple等類型,如下,其中$index代表索引,$name代表循環tuple的具體內容

size: |-
        {{- range $index,$name := tuple "small" "medium" "large" }}
        {{ $index }}: {{ $name }}
        {{- end }}

對於_helpers.tpl內容解釋如下,{{/* */}}代表注釋,{{- define代表定義一個模板,后面跟着模板名字,其中.Chart代表調用Chart.yaml文件的內容

{{/* Generate basic labels */}}
{{- define "mychart.labels" }}
generator: helm
date: {{ now | htmlDate }}
chart: {{ .Chart.Name }}
version: {{ .Chart.Version }}
{{- end }}

以上內容執行后如下:可以跟着文件對照一下結果

$helm install mytest ../myapp/ --dry-run --debug
install.go:173: [debug] Original chart version: ""
install.go:190: [debug] CHART PATH: /home/admin/myapp

NAME: mytest
LAST DEPLOYED: Thu Jun 10 19:08:17 2021
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}

COMPUTED VALUES:
favorite:
  drink: coffee
  food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions

HOOKS:
MANIFEST:
---
# Source: myapp/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
    name: mytest-configmap
    labels:
        generator: helm
        date: 2021-06-10
        chart: myapp
        version: 0.1.0
data:
    myvalue: "Hello World"
    drink: coffee
    food: pizza
    release: ok
    mug: true
    toppings: |-
        -"Mushrooms"
        -"Cheese"
        -"Peppers"
        -"Onions"
    size: |-
        0: small
        1: medium
        2: large

未完待續...................


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM