第3章灵份、初識 Chart
一、Chart 是什么哮洽?
還記得我們在第一章節(jié)時介紹 Helm 的三大概念時是如何介紹 chart
這個概念的嗎填渠?是的,chart
就像許多語言封裝的源碼包一樣鸟辅,它是 Helm 使用的封裝包的總稱氛什。
我們知道,Kubernetes 將其管理的對象稱為資源匪凉,例如 deployment枪眉、service、ingress 等再层。而 Helm 作為 K8s 的包管理器贸铜,其最大的作用就是通過 chart 的方式整合需要管理的 K8s 中的資源堡纬,再通過 Helm 客戶端 統(tǒng)一交由 K8s api server 去執(zhí)行。
二蒿秦、Chart 基礎(chǔ)使用
1烤镐、查找 Chart
Helm 提供了2種搜索命令,可用用來從兩種來源中進行搜索:
helm search hub
:從 Artifact Hub 中查找并列出 helm charts棍鳖。 Artifact Hub中存放了大量不同的倉庫职车。
helm search repo
:從你添加(使用helm repo add
)到本地 helm 客戶端中的倉庫中進行查找。該命令基于本地數(shù)據(jù)進行搜索鹊杖,無需連接互聯(lián)網(wǎng)。
1)搜索所有公開可用的 charts
執(zhí)行以下命令從 Artifact Hub
中搜索所有的 wordpress
charts:
# 命令: helm search hub <chart_name>
helm search hub wordpress
2)搜索本地 stable
源中可用的 charts
# 命令: helm search repo <repo_name>
helm search repo stable
3)模糊匹配搜索
Helm 的搜素使用模糊字符串匹配算法扛芽,只需要輸入名字的一部分就可以從本地倉庫記錄中進行搜索骂蓖,如下搜索 word
:
# 命令: helm search repo <string>
helm search repo word
2、安裝 Chart
使用
helm search
找到你想要安裝的 helm包后川尖,就可以使用helm install
來進行安裝登下。最簡單使用方案只需要傳入兩個參數(shù):release的名字
和chart的名稱
。
1)安裝helm包
執(zhí)行以下命令叮喳,即創(chuàng)建了一個新的 release
對象被芳,命名為 happy-panda
,如果想要自動生成一名名稱馍悟,可以使用--generate-name
參數(shù):
# 命令: helm install <release_name> <chart_name> (chart名稱須具體畔濒,如 bitnami/wordpress。不能只是關(guān)鍵字)
helm install happy-panda bitnami/wordpress
2)查看運行狀態(tài)
helm list
返回如下:
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
happy-panda default 1 2021-06-29 10:51:13.437131205 +0800 CST deployed wordpress-11.0.16 5.7.2
3)查看發(fā)布狀態(tài)
# 命令: helm status <release_name>
helm status happy-panda
返回值和安裝時的返回一樣锣咒。
4)卸載helm包
# 命令: helm uninstall <release_name>
helm uninstall happy-panda
3侵状、下載 Chart
Helm 的 chart 同時也支持下載,下載下來的是一個tar包毅整,解壓后即可獲得官方的 chart 目錄趣兄,基于目錄中提供的文件,我們可以對其中的內(nèi)容進行修改悼嫉,進行自定義的發(fā)布艇潭,同時也可以學習其語法。
1)下載
# 命令: helm pull <chart_name> (chart名稱須具體戏蔑,如 bitnami/kong蹋凝。不能只是關(guān)鍵字)
helm pull bitnami/kong
2)解壓
tar xf kong-3.7.5.tgz
3)目錄結(jié)構(gòu)
kong
├── Chart.lock
├── charts # kong 的 chart 依賴的其他 chart,數(shù)據(jù)庫
│ ├── cassandra
│ ├── common
│ └── postgresql
├── Chart.yaml # 包含了chart信息的YAML文件
├── ci
│ ├── values-editing-containers.yaml
│ ├── values-external-cassandra.yaml
│ ├── values-external-postgresql.yaml
│ ├── values-ingress.yaml
│ └── values-metrics-hpa-pdb.yaml
├── crds # 自定義資源
│ └── custom-resource-definitions.yaml
├── README.md
├── templates # 資源模版辛臊,配置 values 進行渲染仙粱,生產(chǎn)有效的 K8s manifest
│ ├── dep-ds.yaml
│ ├── external-database-secret.yaml
│ ├── extra-list.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress-controller-rbac.yaml
│ ├── ingress.yaml
│ ├── kong-prometheus-rolebinding.yaml
│ ├── kong-prometheus-role.yaml
│ ├── kong-script-configmap.yaml
│ ├── metrics-exporter-configmap.yaml
│ ├── metrics-script-configmap.yaml
│ ├── metrics-service.yaml
│ ├── migrate-job.yaml
│ ├── NOTES.txt
│ ├── pdb.yaml
│ ├── servicemonitor.yaml
│ ├── service.yaml
│ └── tls-secrets.yaml
└── values.yaml # chart 默認的配置值
4、自建 Chart
除了從遠程 helm 倉庫中獲取官方或三方的 chart 外彻舰,Helm 更加重要的功能在于自建 chart伐割,它會創(chuàng)建一個 chart 需要的最小化目錄結(jié)構(gòu)以及各必要文件的模版候味。chart 的整體構(gòu)造比較類似 ansible 的 roles。
# 命令: helm create <chart_name>
helm create test_chart
5隔心、檢查 Chart
Helm 自動了語法檢查工具白群,其作用類似
nginx -t
,會對 chart 的格式或者一些信息進行自檢硬霍,并返回檢查結(jié)果帜慢,在發(fā)布前,進行語法檢查是很好的選擇唯卖。
# 命令: helm lint <chart_name>
helm lint test_chart
6粱玲、上傳 Chart
1)打包 Chart
在上面的一系列操作中我們知道,Helm 倉庫中存放的是一個個的 tar 包拜轨,而不是目錄抽减,因此如果你想上傳自建的 chart,就需要將其先行打包橄碾。Helm 提供了這樣一個命名來將你自建的 chart 打包出 Helm 可識別的格式卵沉。
# 命令: helm package <chart_name>
helm package test_chart
?? 為什么版本是 0.1.0?
這是由 Chart.yaml 中的
version
字段決定的法牲。
2)上傳至私有倉庫
四個步驟:
1)自建私有倉庫
2)生成史汗、更新 chart 索引文件
3)上傳 chart 和索引文件
4)更新本地 chart 倉庫
具體內(nèi)容在后續(xù)章節(jié)中介紹
3)上傳至 Helm Hub
?? 參考文檔:
https://blog.csdn.net/jeffzhesi/article/details/106565173
三、Chart 語法釋義
1拒垃、chart 基本元素釋義:
test_chart
├── charts # 可選: 本 chart 依賴的其他 chart
├── Chart.yaml # 必需: 用于描述 chart 相關(guān)信息停撞,包括名稱、描述信息悼瓮、api版本等
├── templates # 必需: 做用于 K8s 資源的 yaml 模版
│ ├── deployment.yaml # 用于生成 K8s deployment 資源的 yaml 模版怜森,發(fā)布應用的基本元素
│ ├── _helpers.tpl # 用于定義一些可重用的模板片斷,在此文件中的定義在任何資源定義模板中都可用
│ ├── hpa.yaml # 用于生成 K8s hpa 的 yaml 模版谤牡,如服務需要彈性伸縮策略副硅,則在該模版中定義
│ ├── ingress.yaml # 用于生成 K8s ingress 的 yaml 模版,如果服務需要對外放出翅萤,則在該模版中定義 ingress
│ ├── NOTES.txt # 必需: 用于介紹 chart 部署后的一些信息恐疲,比如如何使用這個 chart、列出缺省設(shè)置等
│ ├── serviceaccount.yaml # 用于生成 K8s serviceaccount 資源的 yaml 模版套么,如需要創(chuàng)建特定認證對象培己,則在該模版中定義
│ ├── service.yaml # 用于生成 K8s service 資源的 yaml 模版,發(fā)布應用的基本元素
│ └── tests # helm 的測試鉤子
│ └── test-connection.yaml
└── values.yaml # 必需: 用于存儲要渲染至 templates/ 下模版文件中的值
2胚泌、Chart.yaml
一個標準的 Chart.yaml 包含以下字段:
apiVersion: # 必需: chart API 版本, v2 版本為 helm3 語法省咨,v1 版本仍然保留使用
name: # 必需: chart名稱
version: # 必需: chart 的版本控制標識
kubeVersion: # 可選: 兼容Kubernetes版本的語義化版本,可以使用運算符玷室,形式如 >= 1.13.0 < 1.15.0
description: # 可選: 對于這個 chart 的描述信息
type: # 可選: chart類型, 支持2種類型零蓉,application 和 library笤受,默認使用 application
keywords: # 可選: 關(guān)于項目的一組關(guān)鍵字
- xxx
- xxx
home: # 可選: 項目home頁面的URL
sources: # 可選: 項目源碼的URL列表
- xxx
- xxx
dependencies: # 可選: chart 的依賴項,執(zhí)行 `helm dep up <chart_name>` 更新依賴敌蜂,依賴的 chart包 會下載至 charts/
- name: # chart名稱, 如 nginx
version: # chart版本, 如 "1.2.3"
repository: # 可選: 倉庫的完整URL ("https://example.com/charts") 或別名 ("@repo-name")
condition: # 可選: 解析為布爾值的yaml路徑箩兽,用于啟用/禁用chart (e.g. subchart1.enabled )
tags: # 可選: 用于一次啟用/禁用 一組chart的tag
- xxx
- xxx
import-values: # 可選: 保存源值到導入父鍵的映射。每項可以是字符串或者一對子/父列表項
- ImportValue
alias: # 可選: 依賴 chart 的別名章喉。當你要多次添加相同的chart時會很有用
maintainers: # 可選: 維護者信息
- name: # 維護者名字 (每個維護者都需要)
email: # 維護者郵箱 (每個維護者可選)
url: # 維護者URL (每個維護者可選)
icon: # 可選: 用做icon的SVG或PNG圖片URL
appVersion: # 可選: 與版本控制的 version 無關(guān)汗贫,用于指定應用的版本
deprecated: # 可選: 標記該 chart 已廢棄,使用方法為布爾值
annotations:
example: # 可選: 按名稱輸入的批注列表
1)使用 dependencies 表達式管理依賴
1. 基本原則
Helm3 中秸脱,棄用了 requeirements.yaml
落包,dependencies
字段被合并至了 Chart.yaml
中,但是就語法表達式來說摊唇,和之前沒有太大的變化妥色。使用方式比較類似 ansible 的 playbook 或 docker compose,其表達式如下遏片,是一個列表形式:
dependencies:
- name: nginx
version: 2.0.1
repository: https://example.com/charts
- name: mysql
version: 3.2.1
repository: https://another.example.com/charts
name
字段:所需依賴 chart 的名稱
version
字段:所需依賴 chart 的版本
repository
字段:chart 倉庫的完整 URL 或者 倉庫的名稱使用 URL :
https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
使用 倉庫名稱:
@stable
?? 倉庫必須事先使用
helm repo add
添加,執(zhí)行類似如下命令:helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
2. 示例說明
1?? 添加倉庫
helm repo add bitnami https://charts.bitnami.com/bitnami
2?? 寫依賴表達式
dependencies:
- name: nginx
version: 9.3.3
repository: "@bitnami"
- name: mariadb
version: 2.1.6
repository: "@bitnami"
3?? 更新依賴
helm dependency update
依賴的 chart 包 會被下載到 charts/
目錄下:
2)通過 charts/ 目錄手動管理依賴
Helm 提供了兩種管理依賴的方式撮竿,一種是如上所述的 dependencies
表達式吮便,它會遵循語法原則,自動的管理依賴孕锄,依賴包會被下載到 charts/
中夏伊;另一種方式就是通過 charts/
目錄來手動管理依賴件缸,這種方式可以對依賴的 chart 做更多的自定義設(shè)置。
1. 基本原則
charts/
下管理的依賴必須是一個 chart 包 (xxx-1.0.1.tgz
)或是一個解壓的 chart 目錄- 依賴的名稱不能以
_
或.
開頭僚匆,否則會被 chart 加載器忽略- 可以使用
helm pull
將依賴下載到charts/
下
2. 示例說明
比如 WordPress 的 chart 依賴 Apache 和 mariadb,其目錄形式應該如下:
wordpress:
Chart.yaml
# ...
charts/
apache/
Chart.yaml
# ...
mariadb/
Chart.yaml
# ...
memcached/
Chart.yaml
# ...
3)dependencies 中 condition 和 tags 使用釋義
1. 基本原則:
條件(condition)優(yōu)先
當設(shè)置 value 時搭幻,如果同時存在
condition
和tags
的值咧擂,那么condition
的效果會覆蓋tags
的效果。標簽(tags)最小化元素
當
tags
中的任意一個元素的值被設(shè)置為true
時檀蹋,帶有該tags
的 chart 就會被啟用松申。
condition
和tags
在 values.yaml 中必需在縮進的最頂層
tags
在 values.yaml 中需以以下形式:tags: xxx xxx
2. 示例說明:
文件: test_chart/Chart.yaml
dependencies:
- name: subchart1
repository: http://localhost:10191
version: 0.1.0
condition: subchart1.enabled, global.subchart1.enabled
tags:
- front-end
- subchart1
- name: subchart2
repository: http://localhost:10191
version: 0.1.0
condition: subchart2.enabled,global.subchart2.enabled
tags:
- back-end
- subchart2
文件: test_chart/values.yaml
subchart1:
enabled: true
如上表達式表示,condition
中帶有 subchart1
的 chart 會被啟動
tags:
front-end: false
back-end: true
如上表達式表示俯逾,tags
中帶有 back-end
的 chart 會被啟動贸桶,而帶有 front-end
的則不會被啟動
subchart1:
enabled: true
tags:
front-end: false
back-end: true
如上表達式,當 condition
和 tags
一起使用時桌肴,是會發(fā)生效果覆蓋的皇筛,比如,雖然 front-end
設(shè)置為了 false
坠七,但是由于 subchart1.enabled
設(shè)置為 true
水醋,條件發(fā)生覆蓋旗笔,所以 chart subchart1
還是會被啟用。
而當 back-end
設(shè)置為 true
的時候离例,條件讀取的就是 back-end: true
换团,因此,即使沒有設(shè)置 subchart2.enabled
為 true
宫蛆,chart subchart2
也會被啟用艘包。
4)dependencies 中的 alias 使用釋義(了解)
1. 基本原則
在 dependencies
的表達式中,可以使用 alias
對需求項添加別名耀盗,當存在依賴多次復用的時候就可以通過別名的方式來訪問該需求項想虎,以此加以區(qū)分。(比如 數(shù)據(jù)庫的主從叛拷、集群等使用場景)
2. 示例說明
文件: parent_chart/Chart.yaml
dependencies:
- name: subchart
repository: http://localhost:10191
version: 0.1.0
alias: new-subchart-1
- name: subchart
repository: http://localhost:10191
version: 0.1.0
alias: new-subchart-2
- name: subchart
repository: http://localhost:10191
version: 0.1.0
如上情況舌厨,parent_chart
中相當于有 3 個依賴項,subchart
忿薇、new-subchart-1
裙椭、new-subchart-2
,雖然他們是基于同一個 chart 的署浩,但是可以被區(qū)別對待揉燃。
5)dependencies 中的 import-values 使用釋義(了解)
從上文中,我們知道筋栋,在 charts/
目錄下面管理的其實也是 chart炊汤,那么它就會遵循 chart 的原則,那么這種情況下弊攘,目錄結(jié)構(gòu)就是一種 父-子
的關(guān)系抢腐。在某些場景中,我們可能會需要讀取 子 char 的值襟交,Helm 則提供了 import-values
這樣一種實現(xiàn)方式迈倍。
1. 基本原則
目錄結(jié)構(gòu)和文件關(guān)系如下
parent_chart: # 父 chart Chart.yaml # dependencies - child_chart - import-values - Key # ... charts/ child_chart/ # 子 chart Chart.yaml values.yaml # exports - Key - value # ...
加載器會根據(jù)
dependencies - name
找 子 chart,根據(jù)dependencies - import-values
的 key 解析 子 chart 中對應的值加載器默認識別
exports
沒有
exports
捣域,需要以parent-child
方式明確指明要注入的 子 chart 的值的 Key 和 要被注入的 父 chart 的值的名稱import 子 chart 所得的值最終會被合并入 父 chart 的 values 中授瘦,并會覆蓋原有鍵值
2. 示例說明
1?? 使用 exports
的方式
文件: parent_chart/Chart.yaml
dependencies:
- name: child_chart
repository: http://localhost:10191
version: 0.1.0
import-values:
- data # 引用子 chart 的變量 - data
文件: parent_chart/charts/child_chart/values.yaml
exports: # 聲明變量 data
data:
port: 3306
Helm 會在 import-values
的列表到入內(nèi)容時,將其中的元素作為 Key竟宋,并以此到 子 chart 的 exports
字段查找對應的 Key提完,并將對應的 value 注入 父 chart 的 values 中,所以最終我們可以在 父 chart 中可獲取到的值為:
port: 3306
2?? 使用 parent — child
的方式
?? 注意:
如果在 子 chart 的 values.yaml 中沒有使用
exports
丘侠,就必須指定要注入的 子 chart 值的 源Key 以及 被注入的 父 chart 的值的名稱徒欣。
文件: parent_chart/Chart.yaml
dependencies:
- name: child_chart
repository: http://localhost:10191
version: 0.1.0
...
import-values:
- child: default.data
parent: myimports
文件: parent_chart/charts/child_chart/values.yaml
default:
data:
myint: 999
mybool: true
文件: parent_chart/values.yaml
myimports:
myint: 0
mybool: false
mystring: "helm tests!"
如上述示例,import-values
的加載器蜗字,根據(jù) child
去 child_chart 的 values.yaml 中找 default - data
打肝,并解析出其值脂新,并將其注入到 父 chart 中,并會覆蓋原有的鍵值粗梭,由此 父 chart 最終的 values 會合并如下:
myimports:
myint: 999
mybool: true
mystring: "helm tests!"
3争便、templates/ 和 values.yaml
1)Values 的生效機制
Values 通過模板中.Values
對象可訪問的values.yaml
文件,也可以通過 .Chart
對象可訪問的 Chart.yaml
断医,以此類推滞乙。另外 ,Helm 中有一些預定義的 values鉴嗤,可以將其視為環(huán)境變量斩启,具體如下:
.Release
該對象描述了版本發(fā)布本身。
使用方法如醉锅,
{{ .Release.Name }}
(獲取 release 的名稱).Values
訪問
values.yaml
的內(nèi)容兔簇。使用方法如,
{{ .Values.image.repository }}
(獲取 values.yaml 中image - repository
的值).Chart
訪問
Chart.yaml
的內(nèi)容硬耍。使用方法如垄琐,
{{ .Chart.Version }}
(獲得 chart 的版本)、{{ .Chart.Maintainers }}
(獲取 chart 的維護者)語法風格遵循 go 模版規(guī)則经柴,類似 jinja2狸窘。是一種層級檢索的方式,
.
表示層級口锭,最頂層的.
即根
。.Files
訪問 chart 中存在的文件的內(nèi)容 (
.helmignore
除外)介杆。使用方法如鹃操,
{{ index .Files "file.name" }}
(獲取該文件中name
的值),它等效于{{ .Files.Get name }}
方法春哨。
{{ .Files.GetBytes }}
方法等效于訪問文件中的[]byte
對象.Capabilities
訪問 K8s 的
Capabilities
對象荆隘。使用方法如,
{{ .Capabilities.KubeVersion }}
(獲取 K8s 版本)赴背、{{ .Capabilities.APIVersions.Has "batch/v1" }}
(獲取支持的 K8s API 版本)
2)templates/ 中的模版
模板文件遵守書寫Go模板的標準慣例(查看 文本/模板 Go 包文檔了解更多)椰拒。以發(fā)布一個 nginx 的 templates/deployment.yaml
的示例模版為例,內(nèi)容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Chart.Name }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
app: {{ .Chart.Name }}
template:
metadata:
labels:
app: {{ .Chart.Name }}
spec:
imagePullSecrets:
- name: harborsecret
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: {{ .Values.service.port }}
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
{{- toYaml .Values.resources | nindent 12 }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
3)取值 values.yaml 渲染模版
根據(jù)如上模版的變量關(guān)系凰荚,進行對應文件 value 的配置燃观,涉及到 Chart.yaml
和 values.yaml
兩個文件:
1. Chart.yaml
的必要值
apiVersion: v2
name: test_chart
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"
2. values.yaml
的必要值
replicaCount: 1
image:
repository: nginx
tag: "stable"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
autoscaling: # hpa 需求,可以不管
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80
nodeSelector: {}
tolerations: []
affinity: {}
3. 驗證渲染效果
我們可以通過在 helm install
時使用 --dry-run
參數(shù)來只渲染模版便瑟,而進行直接部署缆毁,這樣我們就可以驗證效果了。執(zhí)行如下命令:
helm install --dry-run demo test_chart/
渲染后的 manifest 如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: test_chart
spec:
replicas: 1
selector:
matchLabels:
app: test_chart
template:
metadata:
labels:
app: test_chart
spec:
imagePullSecrets:
- name: harborsecret
containers:
- name: test_chart
image: "nginx:stable"
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
4)--set
指定參數(shù)渲染
當我們在執(zhí)行 helm install
或者 helm upgrade
時到涂,除了直接通過 values.yaml 渲染外脊框,也支持直接在命令行通過 --set
參數(shù)傳參颁督,傳入的參數(shù)會覆蓋 values.yaml 中的預設(shè)值。
示例:通過 --set
修改 鏡像版本
和 端口
helm install --set image.tag="1.16.0" --set service.port=9999 --dry-run demo test_chart/
渲染后的 manifest 如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: test_chart
spec:
replicas: 1
selector:
matchLabels:
app: test_chart
template:
metadata:
labels:
app: test_chart
spec:
imagePullSecrets:
- name: harborsecret
containers:
- name: test_chart
image: "nginx:1.16.0" # 鏡像版本由原來的 stable 更改為 1.16.0
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 9999 # 端口由原來的 80 更改為 9999
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
5)通過 -f
指定 Values 文件
chart 默認的 Values 文件命名為 values.yaml
浇雹,當你在執(zhí)行 helm install
或 helm upgrade
時沉御,如果名稱不是 values.yaml
,執(zhí)行就會出錯昭灵。通過命令行 -f
參數(shù)吠裆,可以指定 Values 文件,這樣文件的名稱就不受限制了虎锚。
示例:
創(chuàng)建文件 test_chart/demo.yaml
硫痰,內(nèi)容如下:
replicaCount: 1
image:
repository: mysql
tag: "8.7.0"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 3306
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80
nodeSelector: {}
tolerations: []
affinity: {}
執(zhí)行如下命令,進行渲染測試:
helm install -f test_chart/demo.yaml --dry-run demo test_chart
渲染后的 manifest 如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: test_chart
spec:
replicas: 1
selector:
matchLabels:
app: test_chart
template:
metadata:
labels:
app: test_chart
spec:
imagePullSecrets:
- name: harborsecret
containers:
- name: test_chart
image: "mysql:8.7.0" # 鏡像已更改
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 3306 # 端口已更改
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
4窜护、架構(gòu)文件 values.schema.json
是否還記得效斑,在第1章中我們介紹過 Helm3 的新功能中增加了 使用JSON Schema
來驗證 Chart 的 Values 的機制?事實上柱徙,它在 Chart 的表現(xiàn)就是 values.schema.json
文件缓屠。在其中required
可以用于定義哪些字段是必須的,type
可用用于定義哪些字段需要是什么字段類型等护侮。
?? 當我們在執(zhí)行如下命令時敌完,Helm 將會以該 Json 定義的架構(gòu)格式去驗證 .Values 對象是否符合規(guī)格,只有當驗證通過后羊初,才能正常發(fā)送給 K8s 執(zhí)行滨溉。
- helm install
- helm upgrade
- helm lint
- helm template
1)格式示例:
{
"$schema": "https://json-schema.org/draft-07/schema#",
"properties": {
"image": {
"description": "Container Image",
"properties": {
"repo": {
"type": "string"
},
"tag": {
"type": "string"
}
},
"type": "object"
},
"name": {
"description": "Service name",
"type": "string"
},
"port": {
"description": "Port",
"minimum": 0,
"type": "integer"
},
"protocol": {
"type": "string"
}
},
"required": [
"protocol",
"port"
],
"title": "Values",
"type": "object"
}
2)示例說明
required
字段定義了 Values 中必要的字段,如上例所示长赞,即 protocol
和 port
晦攒。另外,name
默也是必須的得哆,因為 service name
是一個 Release
的必要元素脯颜,因此,一個符合該架構(gòu)要求的最精簡 values.yaml 應該如下:
name: nginx
protocol: http
port: 80
?? 注意:
上面有提到過贩据,架構(gòu)文件驗證的對象是
.Values 對象
栋操,而不是 values.yaml ,也就是說饱亮,使用--set
指定的參數(shù)也屬于其檢測的范疇矾芙,因此,如下這種情況也是可以的通過檢查的:values.yaml
name: fronend protocol: https
命令行指定 port
helm install --set port=443
5近上、用戶自定義資源 —— CRD
CRD(Custom Resource Definition
)是 K8s 提供的一種自定義資源對象的機制蠕啄。在 Helm3 中,使用 crds/
目錄來對其進行管理,Helm3 會在安裝 chart 之前檢查該目錄是否存在 CRD 的 yaml 文件歼跟,如果存在和媳,則會先加載該目錄下的 所有yaml文件至 K8s,然后再進行 chart 的發(fā)布哈街。
?? 注意以下幾點:
- 多個 CRD 的表達式可以寫在一個 yaml 文件中留瞳,但需要以 開始結(jié)束符 "
---
" 進行分割- CRD文件無法套用 Helm 模版,必須是普通的 yaml 格式文件
- 安裝 chart 時骚秦,會先上傳 CRD(如有)她倘,并同時暫停安裝,直到 CRD 被 api server 調(diào)用作箍,才會開始后續(xù) chart 渲染步驟硬梁。
1)使用示例
如果要創(chuàng)建一個針對 crontab
的 CRD,需要遵循以下目錄結(jié)構(gòu)和語法規(guī)則:
1. 目錄結(jié)構(gòu)
test_chart/
Chart.yaml
crds/
crontab.yaml
templates/
mycrontab.yaml
2. crontab.yaml 的寫法
?? 注意: CRD 不支持 Helm 模版指令胞得,所以 crontab.yaml 只能使用 K8s 經(jīng)典聲明表達式荧止。
kind: CustomResourceDefinition
metadata:
name: crontabs.stable.example.com
spec:
group: stable.example.com
versions:
- name: v1
served: true
storage: true
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
3. mycrontab.yaml 模版文件
CRD 的信息在被加載至 K8s 后,就會在 Helm 模版的 .Capabilities
中生效阶剑,指定 apiVersion
就可以引用跃巡。和其他資源對象一樣,你需要通過創(chuàng)建模版牧愁,并通過 Values 渲染來創(chuàng)建實例素邪。CRD 的模版文件同其他 template 文件一樣。
apiVersion: stable.example.com
kind: CronTab
metadata:
name: {{ .Values.name }}
spec:
# ...
2)CRD 的限制
和大部分的 K8s 資源對象不同猪半,CRD 是全局性的兔朦,故 Helm 對其的管理較為慎重,并對其設(shè)置了一下限制:
不會重復安裝
如果
crds/
目錄下的 CRD已存在磨确,無論是否有版本區(qū)別沽甥,都不會重新安裝覆蓋,不會自動升級不會在升級俐填、回滾時安裝
只有在第一次
helm install
時才會被安裝不會被自動刪除
自動刪除 CRD 會刪除所有
namespace
中的所有CRD
安接,故不能通過 Helm 刪除希望升級或刪除 CRD翔忽,需要進行手動操作英融,操作需謹慎