.NET Core + Kubernetes:Helm
Helm[1] 作為 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[2] 簡單幾步即可完成,我這里采用的是 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[3] 來保存 Helm chart,下載最新 harbor-offline-installer[4] 的 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.yamlcharts:存放該 chart 依賴的所有子 chart;
Chart.yaml:基本信息定義,如:名稱、版本、描述等;
templates:存放模板文件,_helpers.tpl 定義變量,NOTES.txt 注釋文件,yaml 文件則是各資源類型定義模板,tests 下是相關的測試模板;
values.yaml:定義模板中需要使用的常量,如果需要對常量進行二次處理,則需要在 _helpers.tpl 通過變量實現,如:
在 templates 文件夾下的模板文件中包含大量的常量、變量的引用,具體語法就不詳細介紹了,基本多看兩眼都能理解
k8sdemo chart 創建主要包含以下 3 個文件的調整:
values.yaml 主要修改內容如下,創建 3 個 Pod,鏡像使用beckjin/k8sdemo:1.0.0 版本,以 NodePort 的方式提供服務,對外端口為 31000,其他可保持默認:
replicaCount: 3image:repository: beckjin/k8sdemopullPolicy: IfNotPresenttag: "1.0.0"service:type: NodePortport: 80nodePort: 31000templates/deployment.yaml 主要修改健康檢查的配置,默認是 / 路由,這里改成 /weatherforecast,如下:
livenessProbe:httpGet:path: /weatherforecastport: http readinessProbe:httpGet:path: /weatherforecastport: httptemplates/service.yaml 主要修改 nodePort 字段,引用常量 Values.service.nodePort,如下:
spec:type: {{ .Values.service.type }}ports:- port: {{ .Values.service.port }}targetPort: httpnodePort: {{ .Values.service.nodePort }}protocol: TCPname: http其他的幾個模板文件暫無需調整,可通過查看每個 yaml 文件的具體代碼,像 hpa.yaml、ingress.yaml、serviceaccount.yaml 都是含開關控制的,默認不啟用。最后可以通過 helm lint k8sdemo/ 進行語法檢查,如果沒問題就可以直接打包成 chart 使用了。
推送到 repo
chart 的推送這里將使用 helm-push[5] 插件來完成,它的作用是將創建出來的 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 版本號 即可回滾到之前的版本。
參考資料
[1]
Helm: https://helm.sh/
[2]Installing Helm: https://helm.sh/docs/intro/install/
[3]harbor: https://github.com/goharbor/harbor
[4]harbor-offline-installer: https://github.com/goharbor/harbor/releases
[5]helm-push: https://github.com/chartmuseum/helm-push
總結
以上是生活随笔為你收集整理的.NET Core + Kubernetes:Helm的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .net core 中的经典设计模式的应
- 下一篇: .NET core3.1使用cookie