什么是Helm
簡單來說就是Kubernetes的包管理工具,類似於Centos的yum或Ubuntu的apt。不過他管理的是Kubernetes的yaml文件
組件(2.0與3.0)
在2.0的時候區分為客戶端與服務端
客戶端:
- 本地chart的編寫
- 倉庫的管理
- 與服務端Tiller交互
- 發送chart安裝
- 關系chart版本信息獲取
- 升級或者卸載安裝的chart
服務端:
負責與helm客戶端交互,並且與Kubernetes的api server通信
- 監聽客戶端發送的請求
- 合並chart與配置文件,構建release
- 安裝chart到Kubernetes集群,跟進后續版本
- 通過與Kubernetes交互升級或者卸載chart
架構圖2.0:
在3.0的時候就沒有服務端,客戶端功能與上面一樣。但是服務端變為了helm庫,它有接口直接與Kubernetes通信,而服務端的功能也轉移到了它的身上。
架構圖3.0:
使用Helm,需要一個Kubernetes集群。對於Helm的最新版本,我們建議使用Kubernetes的最新穩定版, 在大多數情況下,它是倒數第二個次版本。
三大概念
Chart 代表着 Helm 包。它包含在 Kubernetes 集群內部運行應用程序,工具或服務所需的所有資源定義。你可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在Kubernetes 中的等價物。
Repository(倉庫) 是用來存放和共享 charts 的地方。它就像 Fedora 的 軟件包倉庫,只不過它是供 Kubernetes 包所使用的。
Release 是運行在 Kubernetes 集群中的 chart 的實例。一個 chart 通常可以在同一個集群中安裝多次。每一次安裝都會創建一個新的release。以 MySQL chart為例,如果你想在你的集群中運行兩個數據庫,你可以安裝該chart兩次。每一個數據庫都會擁有它自己的release 和 release name。
在了解了上述這些概念以后,就可以這樣來解釋 Helm:
Helm 安裝 charts 到 Kubernetes 集群中,每次安裝都會創建一個新的 release。你可以在 Helm 的 chart repositories 中尋找新的 chart。
常用命令
helm [options] [release name]
helm search 檢索chart包
helm fetch/pull 拉去chart包 --untar 下載直接解壓縮 --untardir 下載指定目錄解壓縮
helm delete 刪除版本
helm delete --purge 接觸安裝這個參數好像在3中沒有了
helm upgrade 更新release
helm uninstall 卸載chart包
helm install 安裝chart包
helm rollback 回滾release --recreate-pods配合這個參數能達成刪除更新的效果
helm create 創建chart
helm repo add/list/remove/update helm倉庫添加/列出/移除/更新
helm history 查看release安裝歷史版本
helm list/ls 查看安裝的release
helm status 查看安裝release狀態
helm show/inspect all/chart/readme/values 查看參數信息(可重定向到文件中)
helm get all/manifest/notes/values 查看安裝的release相關信息
helm package 打包chart
helm lint 檢索打包chart的錯誤
helm dependency 管理chart依賴
helm completion 命令補全類似於kubernetes的那種需要先安裝
安裝方法:
在線安裝
helm install --namespace test url
本地安裝有兩種
第一種:壓縮包方式安裝
helm install --namespace test nginx-0.1.0.tar.gz
第二種:本地目錄安裝
helm install --namespace test /root/mysql
修改默認參數安裝
helm install mysql /root/mysql --values values.yaml
指定參數文件安裝
helm install mysql /root/mysql -f values.yaml
Helm文件結構
[root@master ~]# tree sql sql ├── charts ├── Chart.yaml ├── templates │ ├── _helpers.tpl │ ├── mysql-conf.yaml │ ├── mysql-password-ok.yaml │ ├── mysql-svc.yaml │ └── NOTES.txt └── Values.yaml 2 directories, 7 files
chart是helm的打包格式。或者說是Kubernetes的一組相關資源文件的集合。單個chart能部署簡單的應用也可以部署復雜的應用。
chart.yaml 關於這個chart包的描述信息
README.md 預留的注意事項信息
values.yaml 變量值
charts 子chart或者說是依賴
crds 自定義資源
template 模板
NOTES.txt 運行提示的信息,將安裝后說明發送給helm用戶
index.yaml 本地架設存儲庫才會有,里面存的是所有chart的索引。可以用helm repo index根據chart目錄生成
_helpers.tpl
。該文件是模板局部文件的默認位置
chart.yaml
apiVersion: The chart API version (required)
#有兩種一種是v1另一種是v2,兩者區別是在於依賴關系。v1版本是把依賴關系定義在requirements.yaml中,而v2版本是在chart.yaml中加入depencies字段,在該字段下定義。還有一種是把依賴放在charts目錄下
name: The name of the chart (required)
#chart名字
version: A SemVer 2 version (required)
#這個是chart的版本,打包命名就是用的chart名字+chart版本
kubeVersion: A SemVer range of compatible Kubernetes versions (optional)
#指明受支持的kubernetes版本
description: A single-sentence description of this project (optional)
#描述信息
type: The type of the chart (optional)
#類型有兩種,一種是應用圖表,另一種是庫圖表。application or library,使用v2的時候二選一
keywords:
#此項目的關鍵字 - A list of keywords about this project (optional)
home: The URL of this projects home page (optional)
#項目主頁url
sources:
#項目源代碼url - A list of URLs to source code for this project (optional)
dependencies: # A list of the chart requirements (optional)
#依賴 - name: The name of the chart (nginx) version: The version of the chart ("1.2.3") repository: (optional) The repository URL ("https://example.com/charts") or alias ("@repo-name") condition: (optional) A yaml path that resolves to a boolean, used for enabling/disabling charts (e.g. subchart1.enabled )
#條件字段優先級高於tags如果,同時存在以condition為准如果不存在以tag為准,為真啟用,為假不用
tags: # (optional) - Tags can be used to group charts for enabling/disabling together import-values: # (optional) - ImportValues holds the mapping of source values to parent key to be imported. Each item can be a string or pair of child/parent sublist items. alias: (optional) Alias to be used for the chart. Useful when you have to add the same chart multiple times
maintainers: # (optional)
#維護人員信息 - name: The maintainers name (required for each maintainer) email: The maintainers email (optional for each maintainer) url: A URL for the maintainer (optional for each maintainer)
icon: A URL to an SVG or PNG image to be used as an icon (optional).
appVersion: The version of the app that this contains (optional). Needn't be SemVer. Quotes recommended.
#應用版本
deprecated: Whether this chart is deprecated (optional, boolean)
#棄用chart
annotations: example: A list of annotations keyed by name (optional).
子chart細節
1、子chart被認為是獨立的,所以永遠不能明確依賴於父chart
2、子chart不能訪問父chart值,也不能訪問其他chart值
3、父chart值可以覆蓋子chart值
4、Helm有一個global values的概念,所有的charts都可以訪問
依賴項中的tags與condition(控制是否啟用依賴chart)
# parentchart/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
# parentchart/values.yaml subchart1: enabled: true tags: front-end: false back-end: true
在上面的示例中,所有帶有標簽的圖表front-end
都將被禁用,但是由於subchart1.enabled
路徑在父級值中的值為“ true”,因此該條件將覆蓋front-end
標簽並被subchart1
啟用。
由於subchart2
已標記為,back-end
且該標記的評估結果為true
,因此 subchart2
將被啟用。另請注意,盡管subchart2
已指定條件,但父級值中(還要看values的定義)沒有相應的路徑和值,因此該條件無效。
在標簽和條件下使用CLI
該--set
參數可以照常使用,以更改標簽和條件值。
helm install --set tags.front-end=true --set subchart2.enabled=false
標簽(tags)和條件(condition)解析
- 條件(在值中設置時)始終會覆蓋標簽。存在的第一個條件路徑將獲勝,而該圖表的后續條件路徑將被忽略。
- 標簽被評估為“如果圖表的任何標簽為真,則啟用圖表”。
- 標簽和條件值必須設置在頂級父項的值中。(就是父chart中定義)
tags:
值中的鍵必須是頂級鍵。tags:
當前不支持全局和嵌套表。(就是父chart中定義)
通過依賴項導入子值
在某些情況下,希望允許子chart的值傳播到父chart並作為通用默認值共享。
可以使用YAML列表在父chart的dependencies
字段中指定包含要導入的值的鍵import-values
。列表中的每個項目都是從子chart的exports
字段中導入的鍵。
要導入exports
鍵中未包含的值,請使用子代父(第二種)格式。
方法有兩種:
第一種:exports
這是在data在包含值的情況下
父chart
# parent's Chart.yaml file dependencies: - name: subchart repository: http://localhost:10191 version: 0.1.0 import-values: - data 子chart # child's values.yaml file exports: data: myint: 99 結果 # parent's values myint: 99
第二種:
data不包含值的情況下
# parent's Chart.yaml file
dependencies: - name: subchart1 repository: http://localhost:10191
version: 0.1.0 ... import-values: - child: default.data parent: myimports default.data在子chart中找到的值會被導入到父chart的myimports中,有值的會被覆蓋
# parent's values.yaml file
myimports: myint: 0 mybool: false mystring: "helm rocks!" # subchart1's values.yaml file
default: data: myint: 999 mybool: true 結果 # parent's final values
myimports: myint: 999 mybool: true mystring: "helm rocks!"
依賴安裝時的影響
如果需要對依賴性進行更多控制,則可以通過將依賴性chart復制到charts/
目錄中來明確表示這些依賴性。
依賴項可以是chart壓縮包(foo-1.2.3.tgz
)或未打包的目錄。但是其名稱不能以_
或.開頭。此類文件將被加載器忽略。
wordpress: Chart.yaml # ... charts/ apache/ Chart.yaml # ... mysql/ Chart.yaml # ...
helm install 與 helm upgrade影響如何
假設一個名為“ A”的chart創建了以下Kubernetes對象
- 命名空間“ A-Namespace”
- statefulset“ A-StatefulSet”
- 服務“ A-服務”
此外,A依賴於創建對象的chart B
- 命名空間“ B-Namespace”
- 復制集“ B-ReplicaSet”
- 服務“ B服務”
在安裝/升級chart A之后,創建/修改單個Helm版本。將按照以下順序創建/更新上述所有Kubernetes對象:
- 名稱空間
- B命名空間
- 服務
- B服務
- B-復制集
- 狀態集
這是因為當Helm安裝/升級chart時,chart中的Kubernetes對象及其所有依賴項都是
- 聚合成一個集合;然后
- 按類型排序,再按名稱排序;然后
- 以該順序創建/更新。
模板和參數
只有一點需要注意,就是在命令行與模板同時存在的時候命令行的參數會覆蓋模板參數進行配置
而且在命令行指定參數值文件的時候,值文件名可以任意
依賴范圍
父chart可以訪問子chart中的值,但是子chart不能訪問父chart的值,也不可以訪問其他chart的值。
title: "My WordPress Site" # Sent to the WordPress template mysql: max_connections: 100 # Sent to MySQL password: "secret" apache: port: 8080 # Passed to Apache
對於父chart,它可以訪問MySQL密碼字段.Values.mysql.password
。但是對於MySQL chart來說,它將密碼字段簡單地顯示為.Values.password
全局值
title: "My WordPress Site" # Sent to the WordPress template global: app: MyWordPress mysql: max_connections: 100 # Sent to MySQL password: "secret" apache: port: 8080 # Passed to Apache
title: "My WordPress Site" # Sent to the WordPress template global: app: MyWordPress mysql: global: app: MyWordPress max_connections: 100 # Sent to MySQL password: "secret" apache: global: app: MyWordPress port: 8080 # Passed to Apache
所以全局的值可以在任意chart中使用,所有chart共享一個變量值(父chart中定義)。如果是子chart只會向下傳遞,子chart定義的值不會向上傳遞影響父chart的值。
父chart的全局變量優先於子chart
helm有一個合並的問題,不存在會合並有的時候就會導致問題出現,例如存活檢測如果配置文件用的exec,而命令行用的http那么因為exec與http不同,就會出現存活檢測有兩種方式出現,但是在一個存活檢測下。那么在Kubernetes中讀取時就會出席那錯誤。
在命令行指定的時候,--set livenessprobe.httpget=null就可以解決掉,實際就是把httpget置空,只使用exec。
父chart與子chart可以共享模板,任何chart中定義的任何塊都可以用於其他chart
{{- define "label" }}from: mychart{{ end }}
include與template的一個區別是,include可以動態引用模板
{{ include $mytemplate }}
正常引用就是{{ include "模板名字"}}
以上將取消引用$mytemplate
。template
相反,該函數將僅接受字符串文字。
如果想忽略helm中的文件,可以在.helmignore進行匹配
該.helmignore
文件用於指定您不想包含在helm chart中的文件。
如果存在此文件,則在打包應用程序時,該helm package
命令將忽略與該文件中指定模式匹配的所有文件.helmignore
。
這可以幫助避免在文件打包時添加不必要或敏感的文件或目錄。
該.helmignore
文件支持Unix shell全局匹配,相對路徑匹配和否定(以!前綴反向匹配)。每行僅考慮一種模式。
這是一個示例.helmignore
文件:
# comment .git */temp*
*/*/temp* temp?
https://v2.helm.sh/docs/chart_best_practices/