Helm簡述
Helm 是一個軟件包管理器,提供了一種簡單的方法來查找、共享和使用為 Kubernetes 而構建的軟件。類似於Linux系統下的包管理器,如yum/apt等,可以方便快捷的將之前打包好的yaml文件快速部署進kubernetes內,方便管理維護。
Helm 能夠管理 k8s 中的資源依賴,能夠重用 chart 包,能夠為不同 k8s 集群制定不同的配置。
Helm 的生態圈和 Helm 官方所提供的眾多包含有最佳實踐的 chart 包。
helm 具有版本控制,可以保存歷史配置進行回退等操作。
舉個栗子
基本概念
helm:一個命令行下客戶端工具,主要用於kubernetes應用chart的創建/打包/發布以及創建和管理和遠程Chart倉庫。
Tiller:helm的服務端,部署於kubernetes內,Tiller接受helm的請求,並根據chart生成kubernetes部署文件(helm稱為release),然后提交給 Kubernetes 創建應用。Tiller 還提供了 Release 的升級、刪除、回滾等一系列功能。
Chart: helm的軟件包,采用tar 格式或者目錄,其中包含運行一個應用所需的所有鏡像/依賴/資源定義等,還可能包含kubernetes集群中服務定義
Release:在kubernetes中集群中運行的一個Chart實例,在同一個集群上,一個Chart可以安裝多次,每次安裝均會生成一個新的release,后期的更新/刪除等操作是基於release 名稱完成的
Repository:用於發布和存儲Chart的倉庫
命令介紹
創建一個 chart
helm create chart-name #生產完整的chart 目錄結構根據實際情況再做定制化修改
創建一個release(啟動服務)
helm install ./configmap-test -n configmaptest --namespace kzf #安裝chart 包,啟動一個release。#第一個參數:chart 目錄 -n release 名 --namesapce 指定創建資源在哪個命名空間
注意:不指定release 名字隨機生成;默認命名空間default;相同chart可部署多個release,只要release 名字不沖突,即使不同命名空間都不能沖突;可以通過-f 指定特定的values.yaml 文件,默認用chart 目錄里面的
刪除一個運行的服務
helm del --purge release-name #刪除的時候是在全局而不是命名空間下
更新配置
helm upgrade -i --namespace kzf --set config=dev1 configmaptest ./configmap-test #-i release 如果不存在就install --set 設置變量默認覆蓋value.yml中的同名變量, release 名字,chart目錄
注意:chart 里面templates/*.yaml 中如果變更了資源名稱,那么upgrade 不是創建新的資源也是更改資源名稱。如果release 變了,有-i 參數就會創建新的release 和資源 如果是更新的話沒必要指定命名空間,因為release 是全局唯一
但是第一次執行此命令就相當於創建所以要指定命名空間
查詢歷史版本
helm history configmaptest #根據 release 名查詢所有的版本歷史
回滾
helm rollback configmaptest 2 #版本號通過helm history 查詢REVISION 列得知,根據release 名及版本號回滾
查詢信息
helm get manifest configmaptest #查詢此release 信息包括由哪個chart 創建而來以及創建的資源信息等
測試安裝
helm install --debug --dry-run ./mychart #這會將 chart 發送到 Tiller 服務器,它將渲染模板。但不是安裝 chart,它會將渲染模板返回,以便可以看到輸出
chart 文件介紹
Chart文件組織
myapp/ # Chart 目錄
├── charts # 這個 charts 依賴的其他子項目的 charts,始終被安裝
├── Chart.yaml # 描述這個 Chart 的相關信息、包括名字、描述信息、版本等
├── templates # 模板目錄,大多數此目錄下的文件文件被視為包含 Kubernetes manifests,NOTES.txt 是一個例外,名稱以下划線“_”開頭的文件被假定為沒有內部 manifest。
│ ├── deployment.yaml # deployment 控制器的 Go 模板文件
│ ├── _helpers.tpl # 以 _ 開頭的文件不會部署到 k8s 上,可用於定制通用信息以供引用(定義命名模板然后在需要這些命名模板中的配置的template下的模板文件中引用)
│ ├── ingress.yaml # ingress 資源定義的模板文件
│ ├── NOTES.txt # Chart 部署到集群后的一些信息,例如:如何使用、列出缺省值
│ ├── service.yaml # service 的 Go 模板文件
│ └── tests
│ └── test-connection.yaml
└── values.yaml # 模板文件中的一些配置的值通常不會直接配置在文件中,而是通過Values內置對象來引入此文件中的具體配置的值
values.yaml 和模板文件關系示例
在chart 目錄下的values.yaml 文件中定義值通過Values對象傳遞到templates下的模本文件中
cat values.yaml
replicas: 1
imagePullSecrets: regcred
image:
repository: registry.cn-beijing.aliyuncs.com/kouzf
pullPolicy: Always
...
cat templates/deployment.yaml
...
metadata:
labels:
app: {{ .Release.Name }}
name: {{ .Release.Name }}
namespace: {{ .Release.Namespace }}
spec:
replicas: {{ .Values.replicas }}
...
template:
...
spec:
containers:
- name: {{ .Release.Name }}
image: {{ .Values.image.repository }}/{{ .Release.Name }}:{{ .Values.image.tag }}
imagePullPolicy: {{ .Values.image.pullPolicy }}
通過Values對象引入其配置的值,但是注意這只是Values 對象默認的取值路徑,實際上它有四個內容來源:
1、chart 中的 values.yaml 文件 2、如果這是一個子 chart,會被來自父 chart 的 values.yaml 文件中相同的值覆蓋 3、value 文件通過 helm install 或 helm upgrade 的 - f 標志傳入文件(helm install -f myvals.yaml ./mychart) 4、通過 --set(例如 helm install --set foo=bar ./mychart) 如果您需要從默認值中刪除一個鍵,可以覆蓋該鍵的值為 null,在這種情況下,Helm 將從覆蓋值合並中刪除該鍵。 上面的列表按照特定優先級的順序排列:默認values.yaml < 父級 chart values.yaml < 用戶提供的 -f values 文件 < --set 參數
helm 使用注意事項
1、templates目錄下只放有用文件,即使a.yaml.old 也會被識別,為了避免報錯備份文件不要放在此處。
2、第一次發布錯誤,第二次以后的更新就會報錯 UPGRADE FAILED: "kzf-test" has no deployed releases。解決辦法:helm delete --purge $RELEASE_NAME
3、Helm 創建/更新 一個 release 時候指定的namespace 必須提前創建,helm 不能新建namespace
4、values.yaml 文件中 image 配置pullPolicy
pullPolicy 有三個參數:
Always :總是拉取遠程鏡像
IfNotPresent :如果本地存在鏡像就優先使用本地鏡像。
Never:直接不再去拉取鏡像了,使用本地的;如果本地不存在就報異常了。
使用場景一:
當k8s node 節點拉取遠程倉庫沒有權限或者網絡問題時就需要在其本地下載鏡像,設置為Never或IfNotPresent 允許使用本地鏡像。而不是always參數配置。
使用場景二:
當在kubectl 客戶端打包一個鏡像再推送至遠程倉庫,第二次打包的tag 與第一次一樣,這樣同樣可以更新鏡像文件內容。但是節點上本地鏡像是以第一次創建容器時拉取的 鏡像,沒有更新,所以應該配置為Always ,這樣就 會拉取遠程倉庫的新的鏡像到本地並以此啟動容器。
5、通過helm 創建release 的時候,node 節點查看創建的pod 顯示鏡像拉取錯誤。原因:node 節點沒有私有倉庫的拉取鏡像權限,需要配置登錄憑證,而且是指定命名空間下。配置命令如下:
kubectl -n k8s-ecoysystem-apps create secret docker-registry kzfsecret \ --docker-server=registry.wuling.com \ --docker-username=admin\ --docker-password=<your-pword> \ --docker-email=12341243@qq.com
在 helm 的values.yaml 配置 imagePullSecrets: kzfsecret
