HELM基礎簡介


什么是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 "模板名字"}}

 

以上將取消引用$mytemplatetemplate相反,函數將僅接受字符串文字。

 

 

 

如果想忽略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/


免責聲明!

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



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