Helm 作爲 Kubernetes 體系的包管理工具,已經逐漸成爲了應用分發標準,在 .NET 開發中,可以理解爲與 NuGet 包類似。回顧之前文章中的介紹,Kubernetes 中單個服務的部署有時會涉及到多種資源類型,如:Deployemet
、Service
、Ingress
、PVC
、ConfigMap
、Secret
等,而通過 Helm 可以把服務相關資源打包到一個 chart 中,以 chart 爲單位,進行版本管理,簡化 Kubernetes 部署應用的版本控制、打包、發佈、刪除、更新等操作。
以下是 Helm 3 的架構圖,通過 Helm Client 創建 chart ,然後把基於 chart 將相關資源在 Kubernetes 中創建,同時 chart 可被保存到 chart 倉庫,進行 chart 包管理與共享。
Helm 安裝與配置
Helm 3 的安裝參考文檔 Installing Helm 簡單幾步即可完成,我這裏採用的是 Binary Releases 方式。安裝完成後需添加 chart 倉庫源,有了 chart 倉庫源才能進行搜索與安裝。下面先添加 azure
和 aliyun
的倉庫源:
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update
經過以上配置,就可以通過 helm search repo xxxx
搜索相關 chart 包進行安裝使用(和 docker search 類似)。如:
搭建 repo
這裏將使用 harbor 來保存 Helm chart,下載最新 harbor-offline-installer 的 release 版本,解壓後對 harbor.yml
進行相關修改,主要調整配置如下(如果不使用 https ,需要註釋配置文件中 https 相關字段):
hostname: 192.168.124.9 # 訪問地址
http:
port: 8888 # 端口
chart:
absolute_url: enabled
首次安裝,執行以下命令(之後停止或啓動執行 ./docker-compose start|stop
):
./install.sh --with-clair --with-chartmuseum
安裝成功後,訪問 http://192.168.124.9:8888
,創建名爲 charts
的項目作爲接下來使用的 chart 倉庫。
在 Helm 中添加自建的 repo http://192.168.124.9:8888/chartrepo/charts
,因爲 charts 項目是私有級別,所以在添加時需要傳入用戶名和密碼,如下:
helm repo add harbor http://192.168.124.9:8888/chartrepo/charts --username=admin --password=Harbor12345
helm repo update
創建 Chart
執行命令 helm create k8sdemo
創建名爲 k8sdemo
的 chart,會生成一批文件,文件結構如下圖,可以看出有些文件是我們比較熟悉的,如:deployement.yaml
、ingress.yaml
、service.yaml
:
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
- charts:存放該 chart 依賴的所有子 chart;
- Chart.yaml:基本信息定義,如:名稱、版本、描述等;
-
templates:存放模板文件,
_helpers.tpl
定義變量,NOTES.txt
註釋文件,yaml 文件則是各資源類型定義模板,tests
下是相關的測試模板; -
values.yaml:定義模板中需要使用的常量,如果需要對常量進行二次處理,則需要在
_helpers.tpl
通過變量實現,如:
{{- define "k8sdemo.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
在 templates 文件夾下的模板文件中包含大量的常量、變量的引用,具體語法就不詳細介紹了,基本多看兩眼都能理解
k8sdemo chart 創建主要包含以下 3 個文件的調整:
values.yaml
主要修改內容如下,創建 3 個 Pod,鏡像使用beckjin/k8sdemo:1.0.0
版本,以 NodePort 的方式提供服務,對外端口爲 31000,其他可保持默認:
replicaCount: 3
image:
repository: beckjin/k8sdemo
pullPolicy: IfNotPresent
tag: "1.0.0"
service:
type: NodePort
port: 80
nodePort: 31000
templates/deployment.yaml
主要修改健康檢查的配置,默認是 /
路由,這裏改成 /weatherforecast
,如下:
livenessProbe:
httpGet:
path: /weatherforecast
port: http
readinessProbe:
httpGet:
path: /weatherforecast
port: http
templates/service.yaml
主要修改 nodePort 字段,引用常量 Values.service.nodePort
,如下:
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
nodePort: {{ .Values.service.nodePort }}
protocol: TCP
name: http
其他的幾個模板文件暫無需調整,可通過查看每個 yaml 文件的具體代碼,像 hpa.yaml
、ingress.yaml
、serviceaccount.yaml
都是含開關控制的,默認不啓用。最後可以通過 helm lint k8sdemo/
進行語法檢查,如果沒問題就可以直接打包成 chart 使用了。
推送到 repo
chart 的推送這裏將使用 helm-push 插件來完成,它的作用是將創建出來的 chart 包推送到遠端的 chart 倉庫。由於網絡上的問題,建議直接下載對應系統版本的 release 包,上傳至 Helm 的插件目錄,Linux 下爲:/root/.local/share/helm/plugins/
。
└── helm-push
├── bin
│ └── helmpush
├── helm-push_0.8.1_linux_amd64.tar.gz
├── LICENSE
└── plugin.yaml
將 k8sdemo 文件夾進行打包,生成 k8sdemo-1.0.0.tgz
helm package k8sdemo/
推送到 harbor
helm push k8sdemo-1.0.0.tgz harbor
推送成功後在 charts 項目的 Helm Charts
下會有出現對應的 chart 包:
安裝 Chart
在進行安裝使用前,需要先進行 helm repo update
操作,不然獲取不到最新的內容,另外可執行命令 helm search repo k8sdemo
查看結果:
執行命令 helm install k8sdemo harbor/k8sdemo
進行安裝,最終會輸出如下內容,這部分信息其實是在 NOTES.txt
中定義的。我們可以根據提示信息執行命令,獲取服務訪問地址,當然也可以直接通過 kubectl get services
查看。
升級
如果 chart 需要升級,可修改 Chart.yaml
中的 version
字段,重新打包並推送,然後 helm repo update
更新 chart 倉庫,最後執行 helm upgrade k8sdemo harbor/k8sdemo
進行升級。
回滾
通過 helm history k8sdemo
查看歷史版本,然後執行 helm rollback k8sdemo 版本號
即可回滾到之前的版本。