Kubernetes CKA課程筆記 36

Helm功能介紹與安裝

ZONGRU Li
7 min readOct 29, 2021

接著為了建置Ingress,主要分為兩個步驟:

  1. 安裝Ingress Controller
  2. 建立Ingress Componentmanifest file描述Routing rules

所以首先要先透過Helm來安裝Ingress Controller:

何謂Helm, Helm Charts:

  • 是為Kubernetes的打包管理系統
  • 並有幾個重要的功能代表
  • 試考慮今天要在Kubernetes Cluster內建置"ElasticSearch的應用系統"
  • 的情況,我們將需要建立幾樣Kubernetes元件:
  • 1.Stateful Set : 建立應用系統當作DB一樣
  • 2.ConfigMap : 設置外部設定檔
  • 3.Secret : 加密的外部設定檔
  • 4.K8s User權限設置
  • 5.一些Services
  • 以上各種元件找範例Configuration Files一個個收集後建起來驗證
  • 肯定要花不少時間
  • 所以若有一個地方剛好已經統一收集好”ElasticSearch的應用系統”
  • 所需的上述YAML Configuration Files
  • 然後大家要用的時候就可以統一拿去使用一樣版本
  • 這樣綁在一起的YAML Files就給一個稱呼為 : Helm Charts
  • 而統一儲存的地方則稱之為Helm Repository
  • Helm就是提供從Helm Repository下載或上傳Helm Charts的系統
  • 通常會使用到的就是一些比較複雜的系統,例如:
  • Database APP,mongo DB,MY SQL,ElasticSearch
  • 或是監控系統例如Prometheus等等會比較複雜的K8s元件建置時候
  • 只要透過Helm install Charts Name指令來快速重複利用YAML建置
  • 有時候不確定是否已經有人建立相關Helm Charts,也能透過指令查找:

helm search <關鍵字>

  • 或乾脆地到公開的Helm庫(Helm Hub)去找
  • 當然也會有私有庫(Private Registries)的相關支援

Helm的第二個重要功能 →Templating Engine:

  • 先假定要在某個K8s Cluster內部屬N個不同的微服務應用Pod
  • 我們可能會寫出N個Pod的Configuration YAML Files
  • 這些YAML Files幾乎格式都長得差不多,可能差異只在例如:
  • 應用程式名稱,版本,Docker image名稱或版本
  • 不用Helm情況下就是每一個Pod都要YAML檔:
不用Helm時要寫N份YAML檔
  • 同理deploymentServiceYAML檔也是要寫N份
  • 然後內容就只差一些名稱或版本(就那幾行或值不一樣)
  • 而透過HelmTemplate則可以建立通用的藍圖
  • 並且裡面有些欄位值是可以透過placeholders動態傳入的
  • 這樣的檔案就稱為 →Template File (類似如下圖範例)
Pod Template File範例
  • 上圖這些{{.Values…}}的值可以來自於外部設定檔
  • 這類外部設定檔稱為:values store yaml (類似如下圖)
values store yaml範例
  • 並且可以對應傳入給Template執行使用
  • 並且這類.Values.的數值也可以不用values store yaml傳入
  • 而可以透過--設定的flag,這樣的形式在執行Template直接代入
  • 透過以上講解Template,原本N個Configuration YAML Files就只要寫一個
  • 這樣的方式特別適合用於CI/CD在建置相關PIPELINE時使用

其他Helm應用場景:

  1. 不同環境建置(DEV / Staging / Prod等)
  • 要提供給各環境建置的K8s元建打包為Helm Charts給不同環境佈署
  • 甚至是不同的K8s Cluster佈署使用,並且只需要執行一次指令就佈署全部

Helm Chart Structure:

  • 基本上會是一個目錄結構與各層解說(如下圖示)
  • 當執行以下指令時:
  • helm install <chartname>
  • 裡面的template file就會被填入values.yaml內的值
  • 並且執行建立出Manifests Files(也就是Configuration Files)
  • 並且其實目錄內還可以允許放置"Readme"或"licence"等檔案

了解Value Injection:

  • 上面有說到values.yaml是用來當templateDefault注入的值
  • 也就是可以用其他值依狀況來取代values.yaml內容值,例如執行指令:
  • helm install --values=my-values.yaml <chartName>
  • 將得到以下結果:
  • 另外還有另一個可以取代預設的values.yaml裡面的值,例如執行:
  • helm install --set version=2.0.0
  • 如上也可以直接給值,但是就沒有檔案紀錄了

Helm安裝:

  • 經過上述介紹已經知道何謂Helm
  • 接著在master node上進行Helm安裝,安裝前看到:
還沒安裝Helm時,執行出現的錯誤提示
  • 然後到master機上貼上執行!!(一口氣安裝完成!)
  • 接著確認安裝,可以試著執行helm
出現很多指令提示!
  • 也可執行版本確認指令:

helm version

看到是3.7.1版
  • 接著就可以用helm來安裝”K8s Nginx Ingress Controller”到K8s Cluster
  • 但是有一點應該要有疑問的是:

Helm是怎麼認得整個K8s Cluster?

  • 早在第17篇筆記上,剛安裝的kubectl也是不認得整個K8s Cluster
  • 後來是在使用者home目錄下
  • 將有描述K8s Cluster"~/.kube/config"設置好
  • 也就是kubectl預設會看”~/.kube/config”來確認Cluster資訊

然後Helm也將其沿用...

參考課程(reference)

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet