.NET Core + Kubernetes:Helm

Helm 作爲 Kubernetes 體系的包管理工具,已經逐漸成爲了應用分發標準,在 .NET 開發中,可以理解爲與 NuGet 包類似。回顧之前文章中的介紹,Kubernetes 中單個服務的部署有時會涉及到多種資源類型,如:DeployemetServiceIngressPVCConfigMapSecret 等,而通過 Helm 可以把服務相關資源打包到一個 chart 中,以 chart 爲單位,進行版本管理,簡化 Kubernetes 部署應用的版本控制、打包、發佈、刪除、更新等操作。

以下是 Helm 3 的架構圖,通過 Helm Client 創建 chart ,然後把基於 chart 將相關資源在 Kubernetes 中創建,同時 chart 可被保存到 chart 倉庫,進行 chart 包管理與共享。

Helm 安裝與配置

Helm 3 的安裝參考文檔 Installing Helm 簡單幾步即可完成,我這裏採用的是 Binary Releases 方式。安裝完成後需添加 chart 倉庫源,有了 chart 倉庫源才能進行搜索與安裝。下面先添加 azurealiyun 的倉庫源:

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.yamlingress.yamlservice.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.yamlingress.yamlserviceaccount.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 版本號 即可回滾到之前的版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章