目錄
- 定義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應用部署(1)
作者:雪雁
出處:http://www.cnblogs.com/codelove/
溝通管道:程式設計交流群<85318032> 産品交流群<897857351>
如果喜歡作者的文章,請關注【麥扣聊技術】訂閱号以便第一時間獲得最新内容。本文版權歸作者和湖南心萊資訊科技有限公司共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
靜聽鳥語花香,漫賞雲卷雲舒。