k8s Helm


Helm簡述

Helm 是一個軟件包管理器,提供了一種簡單的方法來查找、共享和使用為 Kubernetes 而構建的軟件。類似於Linux系統下的包管理器,如yum/apt等,可以方便快捷的將之前打包好的yaml文件快速部署進kubernetes內,方便管理維護。

Helm 能夠管理 k8s 中的資源依賴,能夠重用 chart 包,能夠為不同 k8s 集群制定不同的配置。

Helm 的生態圈和 Helm 官方所提供的眾多包含有最佳實踐的 chart 包。

helm 具有版本控制,可以保存歷史配置進行回退等操作。

舉個栗子

比如需要部署一個 nginx 服務,那么就需要分別去創建對應的 Pod 資源、Service 資源和 ingress 資源。 通過這種方式來部署幾個服務還是可以接受的,但是如果服務數量眾多,這種一個一個的操作方式不僅效率低下,而且非常容易出錯。能盡量減少人工的操作那么就需要盡量去減少,甚至消除人工操作。k8s 僅僅只是針對資源對象定義了操作,而非對一個服務整體,又或者是一個應用整體進行定義,它是一種細粒度的編排管理。出於這樣的原因,k8s 對高層次的服務或應用編排的支持可能就不夠了。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,它會將渲染模板返回,以便可以看到輸出
View Code

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 }}
View Code

通過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 參數
View Code

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:直接不再去拉取鏡像了,使用本地的;如果本地不存在就報異常了。
View Code

  使用場景一:

    當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
View Code

 在 helm 的values.yaml  配置 imagePullSecrets: kzfsecret


免責聲明!

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



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