目錄
定義Charts
使用Helm部署Demo
Helm常用操作命令
定義Charts
回到之前的“charts”目錄,我們依次進行解讀並進行簡單的修改。
Chart.yaml
配置示例:
<code>apiVersion: v1/<code><code>appVersion: "1.1"/<code><code>description: A demo Helm chart for Kubernetes/<code><code>name: k8sapp/<code><code>version: 0.1.1/<code>
如上述定義所示,Chart.yaml用於提供Charts相關的元數據定義,比如名稱、版本,屬於必備文件。主要字段如下所示:
<table><tbody>
字段
是否必填
說明
name
✔
當前Chart名稱
version
✔
版本號
apiVersion
✔
chart API 版本,一直為“v1”
description
Chart描述
keywords
關鍵字列表
home
項目主頁URL
kubeVersion
依賴的Kubernetes版本
sources
源碼地址列表
maintainers
維護者列表,由name、email、url組成
engine
模板引擎名稱,默認為gotpl,即go模板
icon
圖標地址
app Version
應用程序版本
deprecated
是否已廢棄
tillerVersion
依賴的Tiller版本,例如">2.0.0"
values.yaml和模板
values.yaml配置示例:
<code># 定義k8sapp的默認配置/<code><code>fullnameOverride: k8sapp/<code><code>replicaCount: 1 #副本數/<code><code>image: #鏡像配置/<code><code> repository: ccr.ccs.tencentyun.com/magicodes/k8sapp /<code><code> tag: latest/<code>
pullPolicy: Always #鏡像拉取策略,Always表示總是拉取最新鏡像,IfNotPresent表示如果本地存在則不拉取,Never則表示只使用本地鏡像
<code>service: #Service配置/<code><code> type: NodePort #NodePort服務類型,以便外部訪問/<code><code> port: 80/<code><code>secrets: {}/<code><code>ingress:/<code><code> enabled: false #不配置ingress/<code><code>#資源限制/<code><code>resources:/<code><code> limits:/<code><code> cpu: 1/<code><code> memory: 228Mi/<code><code> requests:/<code><code> cpu: 100m/<code><code> memory: 128Mi/<code>
如以上示例配置所示,我們在一個values.yaml配置了Deployment和Service的配置,整個配置簡單幹淨,當然我們還能配置更多,比如ingress和secrets等等。那麼我們的配置是怎麼起作用的呢?這裡的配置又是如何轉換為對應的Deployment、Service等配置的呢?我們來打開“templates”目錄下的deployment.yaml模板文件:
<code>apiVersion: apps/v1beta2/<code><code>kind: Deployment/<code><code>metadata:/<code><code> name: {{ template "k8sapp.fullname" . }}/<code><code> labels:/<code><code> app: {{ template "k8sapp.name" . }}/<code><code> chart: {{ template "k8sapp.chart" . }}/<code><code> draft: {{ default "draft-app" .Values.draft }}/<code><code> release: {{ .Release.Name }}/<code><code> heritage: {{ .Release.Service }}/<code><code>spec:/<code><code> replicas: {{ .Values.replicaCount }}/<code><code> selector:/<code><code> matchLabels:/<code><code> app: {{ template "k8sapp.name" . }}/<code><code> release: {{ .Release.Name }}/<code><code> template:/<code><code> metadata:/<code><code> labels:/<code><code> app: {{ template "k8sapp.name" . }}/<code><code> draft: {{ default "draft-app" .Values.draft }}/<code><code> release: {{ .Release.Name }}/<code><code> annotations:/<code><code> buildID: {{ .Values.buildID }}/<code><code> spec:/<code><code> containers:/<code><code> - name: {{ .Chart.Name }}/<code><code> image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"/<code><code> imagePullPolicy: {{ .Values.image.pullPolicy }}/<code><code> ports:/<code><code> - name: http /<code><code> containerPort: 80/<code><code> protocol: TCP/<code><code> env:/<code><code> {{- $root := . }}/<code><code> {{- range $ref, $values := .Values.secrets }}/<code><code> {{- range $key, $value := $values }}/<code><code> - name: {{ $ref }}_{{ $key }}/<code><code> valueFrom:/<code><code> secretKeyRef:/<code><code> name: {{ template "k8sapp.fullname" $root }}-{{ $ref | lower }}/<code><code> key: {{ $key }}/<code><code> {{- end }}/<code><code> {{- end }}/<code><code> resources:/<code><code>{{ toYaml .Values.resources | indent 12 }}/<code><code> {{- with .Values.imagePullSecrets }}/<code><code> imagePullSecrets:/<code><code>{{ toYaml . | indent 8 }}/<code><code> {{- end }}/<code>
如上所示,這是一個使用Go模板的Deployment模板文件,它通過讀取“Chart.yaml”和“values.yaml”中的配置進行轉換。同樣的,service.yaml、ingress.yaml也是如此,同時我們也可以基於其語法編寫更多的模板。這些模板在執行“helm install”命令時進行轉換。
值得注意的是,“.Values”對象可以訪問values.yaml中的任何配置,如果使用自定義的值則會覆蓋此值。“. Release”對象則為預定義的值,可用於任意模板,並且無法被覆蓋。其中,常用的預定義值如下所示:
<table><tbody>名稱
說明
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用於管理依賴關係。例如:
<code>dependencies:/<code><code> - name: apache/<code><code> version: 1.2.3/<code><code> repository: http://example.com /charts/<code><code> - name: mysql/<code><code> version: 3.2.1/<code><code> repository: http://another.example.com/charts/<code>
如上所示,常用的字段如下所示:
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的操作比較簡單,我們這裡略過。接下來,我們將該倉庫添加到本地:
<code>helm repo add {mycharts} https://hub.tencentyun.com/charts/mycharts --username {myname} --password {mypassword}/<code>
“helm repo add”命令用於將倉庫添加到本地倉庫列表,以上命令中的變量說明如下所示:
mycharts 替換為自己倉庫的命名空間 (用戶名或組織名)
myname 替換為 Tencent Hub 賬號用戶名
mypassword 替換為 Tencent Hub 賬號密碼
添加完成後,我們可以使用命令“helm repo list”列出本地倉庫列表:
接下來,我們需要將我們的Chart包推送到Tencent Hub的Helm倉庫,在推送之前,我們還需要安裝平臺的推送插件:
yum install git #如果本地已經安裝git,可以忽略此步驟
<code>helm plugin install https://github.com/imroc/helm-push #安裝Tencent Hub推送插件/<code>
插件安裝完畢之後,我們就可以開始我們的操作了。首先,確保Chart文件在Helm
客戶端所在的機器上已經準備就緒,如下圖中的“k8sapp”目錄:然後就可以執行推送命令了:
<code>helm push ./k8sapp xinlai/<code>
如上所示,“helm push”用於推送Chart,“./k8sapp”是目錄位置,“xinlai”是存儲庫的名稱。執行以上腳本會自動將目標目錄打包並推送:
接下來,我們可以在Tencent Hub管理界面上看到我們的包了:
不僅如此,我們還能查看詳情:
拉取並執行部署
如果是在雲端的k8s集群進行Helm應用部署,操作非常簡單,雲供應基本上都提供了封裝:
創建完成後如下所示:
如上圖所示,此Helm應用創建了Deployment資源和Service資源,其中Service的類型為NodePort,端口為“32160”,接下來我們可以通過節點端口訪問:
如果是本地集群呢?我們可以通過以下腳本拉取Chart並執行部署:
<code>helm repo update && helm fetch xinlai/k8sapp/<code><code>helm install xinlai/k8sapp/<code>
部署完成後如圖所示:
注意:我們可以通過“--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”參數綁定其他地址和端口
如果喜歡作者的文章,請關注【麥扣聊技術】訂閱號以便第一時間獲得最新內容。本文版權歸作者和湖南心萊信息科技有限公司共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
文檔官網:docs.xin-lai.com
閱讀更多 心萊科技 的文章