利用Helm簡化Kubernetes應用部署(2)

目錄

定義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"

/<tbody>/<table>
  • 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

可以訪問所有的非模板文件和非特殊文件

/<tbody>/<table>
  • 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简化Kubernetes应用部署(2)

    使用Helm部署Demo

好了,嘮嗑了這麼多,也該來點實際的了。接下來我們基於以上的認知和Demo配置來進行部署,部署流程如下所示:

利用Helm简化Kubernetes应用部署(2)

如上圖所示,我們來開始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”列出本地倉庫列表:

利用Helm简化Kubernetes应用部署(2)

接下來,我們需要將我們的Chart包推送到Tencent Hub的Helm倉庫,在推送之前,我們還需要安裝平臺的推送插件:

yum install git #如果本地已經安裝git,可以忽略此步驟

<code>helm plugin install https://github.com/imroc/helm-push #安裝Tencent Hub推送插件/<code>

插件安裝完畢之後,我們就可以開始我們的操作了。首先,確保Chart文件在Helm

客戶端所在的機器上已經準備就緒,如下圖中的“k8sapp”目錄:

利用Helm简化Kubernetes应用部署(2)

然後就可以執行推送命令了:

<code>helm push ./k8sapp xinlai/<code>

如上所示,“helm push”用於推送Chart,“./k8sapp”是目錄位置,“xinlai”是存儲庫的名稱。執行以上腳本會自動將目標目錄打包並推送:

利用Helm简化Kubernetes应用部署(2)

接下來,我們可以在Tencent Hub管理界面上看到我們的包了:

利用Helm简化Kubernetes应用部署(2)

不僅如此,我們還能查看詳情:

利用Helm简化Kubernetes应用部署(2)
  1. 拉取並執行部署

如果是在雲端的k8s集群進行Helm應用部署,操作非常簡單,雲供應基本上都提供了封裝:

利用Helm简化Kubernetes应用部署(2)

創建完成後如下所示:

利用Helm简化Kubernetes应用部署(2)

如上圖所示,此Helm應用創建了Deployment資源和Service資源,其中Service的類型為NodePort,端口為“32160”,接下來我們可以通過節點端口訪問:

利用Helm简化Kubernetes应用部署(2)

如果是本地集群呢?我們可以通過以下腳本拉取Chart並執行部署:

<code>helm repo update && helm fetch xinlai/k8sapp/<code><code>helm install xinlai/k8sapp/<code>

部署完成後如圖所示:

利用Helm简化Kubernetes应用部署(2)

注意:我們可以通過“--version”參數來部署指定版本的Helm應用:

利用Helm简化Kubernetes应用部署(2)

如圖所示,我們得到了Service的端口為“32705”,同樣的通過本地節點端口訪問如下所示:

利用Helm简化Kubernetes应用部署(2)

至此,通過Helm我們部署了一個簡單的“k8sapp”Demo應用。部署完成後,我們可以通過命令“helm list”來查看已部署的Release:

利用Helm简化Kubernetes应用部署(2)

    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”參數綁定其他地址和端口

利用Helm简化Kubernetes应用部署(2)
利用Helm简化Kubernetes应用部署(2)

如果喜歡作者的文章,請關注【麥扣聊技術】訂閱號以便第一時間獲得最新內容。本文版權歸作者和湖南心萊信息科技有限公司共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

文檔官網:docs.xin-lai.com


分享到:


相關文章: