利用Helm簡化Kubernetes應用部署(2)
目錄
- 定義Charts
- 使用Helm部署Demo
- Helm常用操作命令
定義Charts
回到之前的“charts”目錄,我們依次進行解讀並進行簡單的修改。
-
Chart.yaml
配置示例:
apiVersion: v1 appVersion: "1.1" description: A demo Helm chart for Kubernetes name: k8sapp version: 0.1.1
如上述定義所示,Chart.yaml用於提供Charts相關的元資料定義,比如名稱、版本,屬於必備檔案。主要欄位如下所示:
欄位 |
是否必填 |
說明 |
name |
✔ |
當前Chart名稱 |
version |
✔ |
版本號 |
apiVersion |
✔ |
chart API 版本,一直為“v1” |
description |
Chart描述 |
|
keywords |
關鍵字列表 |
|
home |
專案主頁URL |
|
kubeVersion |
依賴的Kubernetes版本 |
|
sources |
原始碼地址列表 |
|
maintainers |
維護者列表,由name、email、url組成 |
|
engine |
模板引擎名稱,預設為gotpl,即go模板 |
|
icon |
圖示地址 |
|
appVersion |
應用程式版本 |
|
deprecated |
是否已廢棄 |
|
tillerVersion |
依賴的Tiller版本,例如">2.0.0" |
-
values.yaml和模板
values.yaml配置示例:
# 定義k8sapp的預設配置 fullnameOverride: k8sapp replicaCount: 1 #副本數 image: #映象配置 repository: ccr.ccs.tencentyun.com/magicodes/k8sapp tag: latest
pullPolicy: Always #映象拉取策略,Always表示總是拉取最新映象,IfNotPresent表示如果本地存在則不拉取,Never則表示只使用本地映象
service: #Service配置 type: NodePort #NodePort服務型別,以便外部訪問 port: 80 secrets: {} ingress: enabled: false #不配置ingress #資源限制 resources: limits: cpu: 1 memory: 228Mi requests: cpu: 100m memory: 128Mi
如以上示例配置所示,我們在一個values.yaml配置了Deployment和Service的配置,整個配置簡單幹淨,當然我們還能配置更多,比如ingress和secrets等等。那麼我們的配置是怎麼起作用的呢?這裡的配置又是如何轉換為對應的Deployment、Service等配置的呢?我們來開啟“templates”目錄下的deployment.yaml模板檔案:
apiVersion: apps/v1beta2 kind: Deployment metadata: name: {{ template "k8sapp.fullname" . }} labels: app: {{ template "k8sapp.name" . }} chart: {{ template "k8sapp.chart" . }} draft: {{ default "draft-app" .Values.draft }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: {{ template "k8sapp.name" . }} release: {{ .Release.Name }} template: metadata: labels: app: {{ template "k8sapp.name" . }} draft: {{ default "draft-app" .Values.draft }} release: {{ .Release.Name }} annotations: buildID: {{ .Values.buildID }} spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - name: http containerPort: 80 protocol: TCP env: {{- $root := . }} {{- range $ref, $values := .Values.secrets }} {{- range $key, $value := $values }} - name: {{ $ref }}_{{ $key }} valueFrom: secretKeyRef: name: {{ template "k8sapp.fullname" $root }}-{{ $ref | lower }} key: {{ $key }} {{- end }} {{- end }} resources: {{ toYaml .Values.resources | indent 12 }} {{- with .Values.imagePullSecrets }} imagePullSecrets: {{ toYaml . | indent 8 }} {{- end }}
如上所示,這是一個使用Go模板的Deployment模板檔案,它通過讀取“Chart.yaml”和“values.yaml”中的配置進行轉換。同樣的,service.yaml、ingress.yaml也是如此,同時我們也可以基於其語法編寫更多的模板。這些模板在執行“helm install”命令時進行轉換。
值得注意的是,“.Values”物件可以訪問values.yaml中的任何配置,如果使用自定義的值則會覆蓋此值。“. Release”物件則為預定義的值,可用於任意模板,並且無法被覆蓋。其中,常用的預定義值如下所示:
名稱 |
說明 |
Release.Name |
釋出的資源例項名稱 |
Release.Time |
Chart最後釋出時間 |
Release.Namespace |
名稱空間 |
Release.Service |
釋出服務名稱,通常是“Tiller” |
Release.IsUpgrade |
當前操作是否升級 |
Release.IsInstall |
當前操作是否為安裝 |
Release.Revision |
修訂號,從1開始遞增 |
Chart |
對應“Chart.yaml” |
Files |
可以訪問所有的非模板檔案和非特殊檔案 |
-
requirements.yaml
requirements.yaml用於管理依賴關係。例如:
dependencies: - name: apache version: 1.2.3 repository: http://example.com/charts - name: mysql version: 3.2.1 repository: http://another.example.com/charts
如上所示,常用的欄位如下所示:
-
name表示Chart名稱;
-
version表示Chart版本;
-
repository表示Chart儲存庫地址,注意,我們還必須使用“helm repo add”命令在本地新增該儲存庫地址;
-
alias表示別名;
-
tags用於指定僅裝載匹配的Chart;
-
condition用於設定條件來裝載匹配的Chart;
-
import-values則用於匯入子Chart的多個值。
如果要對依賴關係進行更好的控制,我們可以手工將被依賴的Charts複製到應用的Charts目錄下,以明確的表達這種依賴關係。例如WordPress依賴於Apache和MySQL,則其依賴關係以目錄的形式體現如下所示:
使用Helm部署Demo
好了,嘮嗑了這麼多,也該來點實際的了。接下來我們基於以上的認知和Demo配置來進行部署,部署流程如下所示:
如上圖所示,我們來開始Helm的部署之旅。
1.準備Chart
Chart我們已經準備好了,具體看上一節的“values.yaml”示例。
2.推送Chart
接下來我們來推送到倉庫。這裡為了簡單,我們直接使用騰訊雲的Tencent Hub提供的免費的Helm倉庫。Tencent Hub的操作比較簡單,我們這裡略過。接下來,我們將該倉庫新增到本地:
helm repo add {mycharts} https://hub.tencentyun.com/charts/mycharts --username {myname} --password {mypassword}
“helm repo add”命令用於將倉庫新增到本地倉庫列表,以上命令中的變數說明如下所示:
-
mycharts 替換為自己倉庫的名稱空間 (使用者名稱或組織名)
-
myname 替換為 Tencent Hub 賬號使用者名稱
-
mypassword 替換為 Tencent Hub 賬號密碼
新增完成後,我們可以使用命令“helm repo list”列出本地倉庫列表:
接下來,我們需要將我們的Chart包推送到Tencent Hub的Helm倉庫,在推送之前,我們還需要安裝平臺的推送外掛:
yum install git #如果本地已經安裝git,可以忽略此步驟
helm plugin install https://github.com/imroc/helm-push #安裝Tencent Hub推送外掛
外掛安裝完畢之後,我們就可以開始我們的操作了。首先,確保Chart檔案在Helm客戶端所在的機器上已經準備就緒,如下圖中的“k8sapp”目錄:
然後就可以執行推送命令了:
helm push ./k8sapp xinlai
如上所示,“helm push”用於推送Chart,“./k8sapp”是目錄位置,“xinlai”是儲存庫的名稱。執行以上指令碼會自動將目標目錄打包並推送:
接下來,我們可以在Tencent Hub管理介面上看到我們的包了:
不僅如此,我們還能檢視詳情:
-
拉取並執行部署
如果是在雲端的k8s叢集進行Helm應用部署,操作非常簡單,雲供應基本上都提供了封裝:
建立完成後如下所示:
如上圖所示,此Helm應用建立了Deployment資源和Service資源,其中Service的型別為NodePort,埠為“32160”,接下來我們可以通過節點埠訪問:
如果是本地叢集呢?我們可以通過以下指令碼拉取Chart並執行部署:
helm repo update && helm fetch xinlai/k8sapp helm install xinlai/k8sapp
部署完成後如圖所示:
注意:我們可以通過“--version”引數來部署指定版本的Helm應用:
如圖所示,我們得到了Service的埠為“32705”,同樣的通過本地節點埠訪問如下所示:
至此,通過Helm我們部署了一個簡單的“k8sapp”Demo應用。部署完成後,我們可以通過命令“helm list”來檢視已部署的Release:
Helm常用操作命令
除了上面提到的一些Helm命令之外,一些常用的操作Demo如下所示:
-
升級和更新
helm upgrade zeroed-rodent xinlai/k8sapp --version 0.1.6
#“zeroed-rodent”為Release名稱,“xinlai/k8sapp”為Chart地址。
helm upgrade --set imageTag=20190731075922 zeroed-rodent xinlai/k8sapp
#更新映象
-
檢視版本歷史
helm history zeroed-rodent
#檢視Release歷史
-
回滾
helm rollback zeroed-rodent 1
#回滾到版本1
-
刪除
helm delete zeroed-rodent
#刪除Release
-
下載Chart
helm fetch xinlai/k8sapp
#下載Chart
-
基於本地Chart目錄部署
helm install ./k8sapp
#基於目錄“k8sapp”部署
-
打包
helm package ./k8sapp
#會打包壓縮生成類似於“/k8sapp-0.1.5.tgz”的檔案
-
搜尋
helm search k8sapp
#在所有倉庫裡搜尋Chart“k8sapp”
-
啟動本地倉儲服務
helm serve
#預設地址為“127.0.0.1:8879”,可以使用“--address”引數繫結其他地址和埠
往期內容連結
Docker+ Kubernetes已成為雲端計算的主流(二十五)
容器化之後如何節省雲端成本?(二十六)
瞭解Kubernetes主體架構(二十七)
使用Minikube部署本地Kubernetes叢集(二十八)
使用kubectl管理k8s叢集(二十九)
使用Kubeadm建立k8s叢集之部署規劃(三十)
使用Kubeadm建立k8s叢集之節點部署(三十一)
叢集故障處理之處理思路以及健康狀態檢查(三十二)
叢集故障處理之處理思路以及聽診三板斧(三十三)
開源匯入匯出通用庫Magicodes.ExporterAndImporter釋出
使用Kubectl部署應用
通過Service訪問應用 (1)
通過Service訪問應用 (2)
使用Ingress來負載分發微服務
利用Helm簡化Kubernetes應用部署(