.NET Core + Kubernetes:Helm
Helm[1] 作為 Kubernetes 體系的包管理工具,已經(jīng)逐漸成為了應(yīng)用分發(fā)標(biāo)準(zhǔn),在 .NET 開(kāi)發(fā)中,可以理解為與 NuGet 包類似。回顧之前文章中的介紹,Kubernetes 中單個(gè)服務(wù)的部署有時(shí)會(huì)涉及到多種資源類型,如:Deployemet、Service、Ingress、PVC、ConfigMap、Secret 等,而通過(guò) Helm 可以把服務(wù)相關(guān)資源打包到一個(gè) chart 中,以 chart 為單位,進(jìn)行版本管理,簡(jiǎn)化 Kubernetes 部署應(yīng)用的版本控制、打包、發(fā)布、刪除、更新等操作。
以下是 Helm 3 的架構(gòu)圖,通過(guò) Helm Client 創(chuàng)建 chart ,然后把基于 chart 將相關(guān)資源在 Kubernetes 中創(chuàng)建,同時(shí) chart 可被保存到 chart 倉(cāng)庫(kù),進(jìn)行 chart 包管理與共享。
Helm 安裝與配置
Helm 3 的安裝參考文檔 Installing Helm[2] 簡(jiǎn)單幾步即可完成,我這里采用的是 Binary Releases 方式。安裝完成后需添加 chart 倉(cāng)庫(kù)源,有了 chart 倉(cāng)庫(kù)源才能進(jìn)行搜索與安裝。下面先添加 azure 和 aliyun 的倉(cāng)庫(kù)源:
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經(jīng)過(guò)以上配置,就可以通過(guò) helm search repo xxxx 搜索相關(guān) chart 包進(jìn)行安裝使用(和 docker search 類似)。如:
搭建 repo
這里將使用 harbor[3] 來(lái)保存 Helm chart,下載最新 harbor-offline-installer[4] 的 release 版本,解壓后對(duì) harbor.yml 進(jìn)行相關(guān)修改,主要調(diào)整配置如下(如果不使用 https ,需要注釋配置文件中 https 相關(guān)字段):
hostname: 192.168.124.9 # 訪問(wèn)地址 http:port: 8888 # 端口 chart:absolute_url: enabled首次安裝,執(zhí)行以下命令(之后停止或啟動(dòng)執(zhí)行 ./docker-compose start|stop):
./install.sh --with-clair --with-chartmuseum安裝成功后,訪問(wèn) ?http://192.168.124.9:8888,創(chuàng)建名為 charts 的項(xiàng)目作為接下來(lái)使用的 chart 倉(cāng)庫(kù)。
在 Helm 中添加自建的 repo http://192.168.124.9:8888/chartrepo/charts,因?yàn)?charts 項(xiàng)目是私有級(jí)別,所以在添加時(shí)需要傳入用戶名和密碼,如下:
helm repo add harbor http://192.168.124.9:8888/chartrepo/charts --username=admin --password=Harbor12345 helm repo update創(chuàng)建 Chart
執(zhí)行命令 helm create k8sdemo 創(chuàng)建名為 k8sdemo 的 chart,會(huì)生成一批文件,文件結(jié)構(gòu)如下圖,可以看出有些文件是我們比較熟悉的,如: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 下是相關(guān)的測(cè)試模板;
values.yaml:定義模板中需要使用的常量,如果需要對(duì)常量進(jìn)行二次處理,則需要在 _helpers.tpl 通過(guò)變量實(shí)現(xiàn),如:
在 templates 文件夾下的模板文件中包含大量的常量、變量的引用,具體語(yǔ)法就不詳細(xì)介紹了,基本多看兩眼都能理解
k8sdemo chart 創(chuàng)建主要包含以下 3 個(gè)文件的調(diào)整:
values.yaml 主要修改內(nèi)容如下,創(chuàng)建 3 個(gè) Pod,鏡像使用beckjin/k8sdemo:1.0.0 版本,以 NodePort 的方式提供服務(wù),對(duì)外端口為 31000,其他可保持默認(rèn):
replicaCount: 3image:repository: beckjin/k8sdemopullPolicy: IfNotPresenttag: "1.0.0"service:type: NodePortport: 80nodePort: 31000templates/deployment.yaml 主要修改健康檢查的配置,默認(rèn)是 / 路由,這里改成 /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其他的幾個(gè)模板文件暫無(wú)需調(diào)整,可通過(guò)查看每個(gè) yaml 文件的具體代碼,像 hpa.yaml、ingress.yaml、serviceaccount.yaml 都是含開(kāi)關(guān)控制的,默認(rèn)不啟用。最后可以通過(guò) helm lint k8sdemo/ 進(jìn)行語(yǔ)法檢查,如果沒(méi)問(wèn)題就可以直接打包成 chart 使用了。
推送到 repo
chart 的推送這里將使用 helm-push[5] 插件來(lái)完成,它的作用是將創(chuàng)建出來(lái)的 chart 包推送到遠(yuǎn)端的 chart 倉(cāng)庫(kù)。由于網(wǎng)絡(luò)上的問(wèn)題,建議直接下載對(duì)應(yīng)系統(tǒng)版本的 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 文件夾進(jìn)行打包,生成 k8sdemo-1.0.0.tgz
helm package k8sdemo/推送到 harbor
helm push k8sdemo-1.0.0.tgz harbor推送成功后在 charts 項(xiàng)目的 Helm Charts 下會(huì)有出現(xiàn)對(duì)應(yīng)的 chart 包:
安裝 Chart
在進(jìn)行安裝使用前,需要先進(jìn)行 helm repo update 操作,不然獲取不到最新的內(nèi)容,另外可執(zhí)行命令 helm search repo k8sdemo 查看結(jié)果:
執(zhí)行命令 helm install k8sdemo harbor/k8sdemo 進(jìn)行安裝,最終會(huì)輸出如下內(nèi)容,這部分信息其實(shí)是在 NOTES.txt 中定義的。我們可以根據(jù)提示信息執(zhí)行命令,獲取服務(wù)訪問(wèn)地址,當(dāng)然也可以直接通過(guò) kubectl get services 查看。
升級(jí)
如果 chart 需要升級(jí),可修改 Chart.yaml 中的 ?version 字段,重新打包并推送,然后 helm repo update 更新 chart 倉(cāng)庫(kù),最后執(zhí)行 helm upgrade k8sdemo harbor/k8sdemo 進(jìn)行升級(jí)。
回滾
通過(guò) helm history k8sdemo 查看歷史版本,然后執(zhí)行 helm rollback k8sdemo 版本號(hào) 即可回滾到之前的版本。
參考資料
[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
總結(jié)
以上是生活随笔為你收集整理的.NET Core + Kubernetes:Helm的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: .net core 中的经典设计模式的应
- 下一篇: .NET core3.1使用cookie