目錄
helm簡介
Helm 元件及相關術語
Helm
Tiller
Chart
Repoistory
Release
Helm工作原理
helm部署
一、Helm 用戶端安裝
二、Helm 服務端安裝Tiller
三、給 Tiller 授權
四、驗證 Tiller 是否安裝成功
五、解除安裝 Helm 伺服器端 Tiller
六、Helm 使用
Helm Chart 結構
Chart 目錄結構
Chart.yaml 檔案
requirements.yaml 和 charts目錄
templates 目錄
建立自己的chart
模闆
檢查配置和模闆是否有效
部署到kubernetes
打包分享
将應用釋出到 Repository
依賴
helm更新和回退一個應用
更新一個應用
回退一個應用
删除一個應用
使用Helm 部署 Wordpress應用執行個體
Helm 其它使用技巧
helm簡介
很多人都使用過Ubuntu下的ap-get或者CentOS下的yum, 這兩者都是Linux系統下的包管理工具。采用apt-get/yum,應用開發者可以管理應用包之間的依賴關系,釋出應用;使用者則可以以簡單的方式查找、安裝、更新、解除安裝應用程式。
我們可以将Helm看作Kubernetes下的apt-get/yum。Helm是Deis (https://deis.com/) 開發的一個用于kubernetes的包管理器。每個包稱為一個Chart,一個Chart是一個目錄(一般情況下會将目錄進行打包壓縮,形成name-version.tgz格式的單一檔案,友善傳輸和存儲)。
對于應用釋出者而言,可以通過Helm打包應用,管理應用依賴關系,管理應用版本并釋出應用到軟體倉庫。
對于使用者而言,使用Helm後不用需要了解Kubernetes的Yaml文法并編寫應用部署檔案,可以通過Helm下載下傳并在kubernetes上安裝需要的應用。
除此以外,Helm還提供了kubernetes上的軟體部署,删除,更新,復原應用的強大功能。
Helm 元件及相關術語
Helm
Helm 是一個指令行下的用戶端工具。主要用于 Kubernetes 應用程式 Chart 的建立、打包、釋出以及建立和管理本地和遠端的 Chart 倉庫。
Tiller
Tiller 是 Helm 的服務端,部署在 Kubernetes 叢集中。Tiller 用于接收 Helm 的請求,并根據 Chart 生成 Kubernetes 的部署檔案( Helm 稱為 Release ),然後送出給 Kubernetes 建立應用。Tiller 還提供了 Release 的更新、删除、復原等一系列功能。
Chart
Helm 的軟體包,采用 TAR 格式。類似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一組定義 Kubernetes 資源相關的 YAML 檔案。
Repoistory
Helm 的軟體倉庫,Repository 本質上是一個 Web 伺服器,該伺服器儲存了一系列的 Chart 軟體包以供使用者下載下傳,并且提供了一個該 Repository 的 Chart 包的清單檔案以供查詢。Helm 可以同時管理多個不同的 Repository。
Release
使用
helm install
指令在 Kubernetes 叢集中部署的 Chart 稱為 Release。
注:需要注意的是:Helm 中提到的 Release 和我們通常概念中的版本有所不同,這裡的 Release 可以了解為 Helm 使用 Chart 包部署的一個應用執行個體。
Helm工作原理
Chart Install 過程:
- Helm從指定的目錄或者tgz檔案中解析出Chart結構資訊
- Helm将指定的Chart結構和Values資訊通過gRPC傳遞給Tiller
- Tiller根據Chart和Values生成一個Release
- Tiller将Release發送給Kubernetes用于生成Release
Chart Update過程:
- Helm從指定的目錄或者tgz檔案中解析出Chart結構資訊
- Helm将要更新的Release的名稱和Chart結構,Values資訊傳遞給Tiller
- Tiller生成Release并更新指定名稱的Release的History
- Tiller将Release發送給Kubernetes用于更新Release
Chart Rollback過程:
- Helm将要復原的Release的名稱傳遞給Tiller
- Tiller根據Release的名稱查找History
- Tiller從History中擷取上一個Release
- Tiller将上一個Release發送給Kubernetes用于替換目前Release
helm部署
一、Helm 用戶端安裝
Helm 的安裝方式很多,這裡采用二進制的方式安裝。更多安裝方法可以參考 Helm 的官方幫助文檔。
方式一:使用官方提供的腳本一鍵安裝
- curl https:/ /raw.githubusercontent.com/helm /helm/master /scripts/get > get_helm.sh
- $ chmod get_helm.sh
- $ ./get_helm.sh
方式二:手動下載下傳安裝
- #從官網下載下傳最新版本的二進制安裝包到本地:https://github.com/kubernetes/helm/releases
- tar -zxvf helm-2.9.0.tar.gz # 解壓壓縮包
- # 把 helm 指令放到bin目錄下
- mv helm-2.9.0/helm /usr/ local/bin/helm
- helm help # 驗證
二、Helm 服務端安裝Tiller
注意:先在 K8S 叢集上每個節點安裝 socat 軟體(yum install -y socat ),不然會報如下錯誤:
- E0522 : : portforward.go: ] an error occurred forwarding -> : error forwarding port to pod dc6da4ab99ad9c497c0cef1776b9dd18e0a612d507e2746ed63d36ef40f30174, uid : unable to do port forwarding: socat not found.
- Error: cannot connect to Tiller
Tiller 是以 Deployment 方式部署在 Kubernetes 叢集中的,隻需使用以下指令便可簡單的完成安裝。
$ helm init
由于 Helm 預設會去 storage.googleapis.com 拉取鏡像,如果你目前執行的機器不能通路該域名的話可以使用以下指令來安裝:
- helm init --client-only --stable-repo-url https: //aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts/
- helm repo add incubator https: //aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
- helm repo update
- # 建立服務端
- helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2. --stable-repo-url https: //kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
- # 建立 TLS認證服務端,參考位址:https: //github.com/gjmzj/kubeasz/blob/master/docs/guide/helm.md
- helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2. --tiller-tls-cert /etc/kubernetes/ssl/tiller001.pem --tiller-tls-key /etc/kubernetes/ssl/tiller001-key.pem --tls-ca-cert /etc/kubernetes/ssl/ca.pem --tiller-namespace kube-system --stable-repo-url https: //kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
在 Kubernetes 中安裝 Tiller 服務,因為官方的鏡像因為某些原因無法拉取,使用
-i
指定自己的鏡像,可選鏡像:registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1(阿裡雲),該鏡像的版本與helm用戶端的版本相同,使用
helm version
可檢視helm用戶端版本。
如果在用helm init安裝tiller server時一直部署不成功,檢查deployment,根據描述解決問題。
三、給 Tiller 授權
因為 Helm 的服務端 Tiller 是一個部署在 Kubernetes 中 Kube-System Namespace 下 的 Deployment,它會去連接配接 Kube-Api 在 Kubernetes 裡建立和删除應用。
而從 Kubernetes 1.6 版本開始,API Server 啟用了 RBAC 授權。目前的 Tiller 部署時預設沒有定義授權的 ServiceAccount,這會導緻通路 API Server 時被拒絕。是以我們需要明确為 Tiller 部署添加授權。
建立 Kubernetes 的服務帳号和綁定角色
- $ kubectl create serviceaccount --namespace kube-system tiller
- $ kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
為 Tiller 設定帳号
- # 使用 kubectl patch 更新 API 對象
- $ kubectl patch deploy --namespace kube-system tiller-deploy -p '{ "spec":{ "template":{ "spec":{ "serviceAccount": "tiller"}}}}'
- deployment.extensions "tiller-deploy" patched
檢視是否授權成功
- $ kubectl get deploy --namespace kube- system tiller-deploy --output yaml| grep serviceAccount
- serviceAccount: tiller
- serviceAccountName: tiller
四、驗證 Tiller 是否安裝成功
- $ kubectl -n kube-system get pods|grep tiller
- tiller-deploy d68f5c78f-nql2z / Running m
- $ helm version
- Client: &version.Version{SemVer: "v2.9.1", GitCommit: "20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState: "clean"}
- Server: &version.Version{SemVer: "v2.9.1", GitCommit: "20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState: "clean"}
五、解除安裝 Helm 伺服器端 Tiller
如果你需要在 Kubernetes 中解除安裝已部署的 Tiller,可使用以下指令完成解除安裝。
- $ helm reset 或
- $helm reset --force
六、Helm 使用
1)更換倉庫:
若遇到Unable to get an update from the “stable” chart repository (https://kubernetes-charts.storage.googleapis.com) 錯誤
手動更換stable 存儲庫為阿裡雲的存儲庫
- # 先移除原先的倉庫
- helm repo remove stable
- # 添加新的倉庫位址
- helm repo add stable https: //kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
- # 更新倉庫
- helm repo update
2)檢視在存儲庫中可用的所有 Helm charts:
- helm search
- NAME CHART VERSION APP VERSION DESCRIPTION
- stable/acs-engine-autoscaler Scales worker nodes within agent pools
- stable/aerospike v3 A Helm chart for Aerospike in Kubernetes
- stable/anchore-engine Anchore container analysis and policy evaluatio...
- stable/artifactory Universal Repository Manager supporting all maj...
- stable/artifactory-ha Universal Repository Manager supporting all maj...
- stable/aws-cluster-autoscaler Scales worker nodes within autoscaling groups.
- ... ...
3)更新charts清單:
helm repo update
4)安裝charts:
Monocular是一個開源軟體,用于管理kubernetes上以Helm Charts形式建立的服務,可以通過它的web頁面來安裝helm Charts
安裝Nginx Ingress controller,安裝的k8s叢集啟用了RBAC,則一定要加rbac.create=true參數
helm install stable/nginx-ingress --set controller.hostNetwork=true,rbac.create=true
安裝Monocular:
- # 添加新的源
- helm repo add monocular https:/ /kubernetes-helm.github.io/monocular
- # 安裝
- helm install monocular/monocular -f custom-repos.yaml
- # custom-repos.yaml 内容
- cat custom-repos.yaml
- api:
- config:
- repos:
- - name: stable
- url: https:/ /aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts
- source: https:/ /github.com/kubernetes /charts/tree /master/stable
- - name: incubator
- url: https:/ /aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator
- source: https:/ /github.com/kubernetes /charts/tree /master/incubator
- - name: monocular
- url: https:/ /kubernetes-helm.github.io/monocular
- source: https:/ /github.com/kubernetes-helm/monocular/tree/master/charts
5)檢視K8S中已安裝的charts:
- helm list
- NAME REVISION UPDATED STATUS CHART NAMESPACE
- amber-seal 1 Mon Jul 2 17 :29 :25 2018 DEPLOYED nginx-ingress-0 .9 .5 default
- my-release 1 Mon Jul 2 15 :19 :44 2018 DEPLOYED spark-0 .1 .10 default
- nonplussed-panther 1 Mon Jul 2 17 :27 :41 2018 FAILED nginx-ingress-0 .9 .5 default
- turbulent-tuatara 1 Mon Jul 2 17 :31 :33 2018 DEPLOYED monocular-0 .6 .2 default
6)删除安裝的charts:
- # 删除:helm delete xxx
- helm delete amber-seal
Helm Chart 結構
Chart 目錄結構
- examples/
- Chart.yaml # Yaml檔案,用于描述Chart的基本資訊,包括名稱版本等
- LICENSE # [可選] 協定
- README.md # [可選] 目前Chart的介紹
- values.yaml # Chart的預設配置檔案
- requirements.yaml # [可選] 用于存放目前Chart依賴的其它Chart的說明檔案
- charts/ # [可選]: 該目錄中放置目前Chart依賴的其它Chart
- templates/ # [可選]: 部署檔案模版目錄,模版使用的值來自values.yaml和由Tiller提供的值
- templates/NOTES.txt # [可選]: 放置Chart的使用指南
Chart.yaml 檔案
- name: [必須] Chart的名稱
- version: [必須] Chart的版本号,版本号必須符合 SemVer :http: //semver.org/
- description: [可選] Chart的簡要描述
- keywords:
- - [可選] 關鍵字清單
- home: [可選] 項目位址
- sources:
- - [可選] 目前Chart的下載下傳位址清單
- maintainers: # [可選]
- - name: [必須] 名字
- email: [可選] 郵箱
- engine: gotpl # [可選] 模版引擎,預設值是gotpl
- icon: [可選] 一個SVG或PNG格式的圖檔位址
requirements.yaml 和 charts目錄
requirements.yaml 檔案内容:
- dependencies:
- - name: example
- version: .
- repository: http: //example.com/charts
- - name: Chart名稱
- version: Chart版本
- repository: 該Chart所在的倉庫位址
Chart支援兩種方式表示依賴關系,可以使用requirements.yaml或者直接将依賴的Chart放置到charts目錄中。
templates 目錄
templates目錄中存放了Kubernetes部署檔案的模版。
例如:
- # db.yaml
- apiVersion: v1
- kind: ReplicationController
- metadata:
- name: deis-database
- namespace: deis
- labels:
- heritage: deis
- spec:
- replicas:
- selector:
- app: deis-database
- template:
- metadata:
- labels:
- app: deis-database
- spec:
- serviceAccount: deis-database
- containers:
- - name: deis-database
- image: {{.Values.imageRegistry}}/postgres:{{.Values.dockerTag}}
- imagePullPolicy: {{.Values.pullPolicy}}
- ports:
- - containerPort:
- env:
- - name: DATABASE_STORAGE
- value: {{ default "minio" .Values.storage}}
模版文法擴充了 golang/text/template的文法:
- # 這種方式定義的模版,會去除test模版尾部所有的空行
- {{- define "test"}}
- 模版内容
- {{- end}}
- # 去除test模版頭部的第一個空行
- {{- template "test" }}
用于yaml檔案前置空格的文法:
- # 這種方式定義的模版,會去除test模版頭部和尾部所有的空行
- {{- define "test" -}}
- 模版内容
- {{- end -}}
- # 可以在test模版每一行的頭部增加4個空格,用于yaml檔案的對齊
- {{ include "test" | indent 4}}
建立自己的chart
我們建立一個名為
mongodb
的chart,看一看chart的檔案結構。
- $ helm create mongodb
- $ tree mongodb
- mongodb
- ├── Chart.yaml #Chart本身的版本和配置資訊
- ├── charts #依賴的chart
- ├── templates #配置模闆目錄
- │ ├── NOTES.txt #helm提示資訊
- │ ├── _helpers.tpl #用于修改kubernetes objcet配置的模闆
- │ ├── deployment.yaml #kubernetes Deployment object
- │ └── service.yaml #kubernetes Serivce
- └── values.yaml #kubernetes object configuration
- directories, files
模闆
Templates
目錄下是yaml檔案的模闆,遵循Go template文法。使用過Hugo的靜态網站生成工具的人應該對此很熟悉。
我們檢視下
deployment.yaml
檔案的内容。
- apiVersion: extensions/v1beta1
- kind: Deployment
- metadata:
- name: {{ template "fullname" . }}
- labels:
- chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+ " "_ " }}"
- spec:
- replicas: {{ .Values.replicaCount }}
- template:
- metadata:
- labels:
- app: {{ template "fullname" . }}
- spec:
- containers:
- - name: {{ .Chart.Name }}
- image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
- imagePullPolicy: {{ .Values.image.pullPolicy }}
- ports:
- - containerPort: {{ .Values.service.internalPort }}
- livenessProbe:
- httpGet:
- path: /
- port: {{ .Values.service.internalPort }}
- readinessProbe:
- httpGet:
- path: /
- port: {{ .Values.service.internalPort }}
- resources:
- {{ toyaml .Values.resources | indent }}
這是該應用的Deployment的yaml配置檔案,其中的雙大括号包擴起來的部分是Go template,其中的Values是在
values.yaml
檔案中定義的:
- # Default values for mychart.
- # This is a yaml-formatted file.
- # Declare variables to be passed into your templates.
- replicaCount:
- image:
- repository: nginx
- tag: stable
- pullPolicy: IfNotPresent
- service:
- name: nginx
- type: ClusterIP
- externalPort:
- internalPort:
- resources:
- limits:
- cpu: m
- memory: Mi
- requests:
- cpu: m
- memory: Mi
比如在
Deployment.yaml
中定義的容器鏡像
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
其中的:
-
就是nginx.Values.image.repository
-
就是stable.Values.image.tag
以上兩個變量值是在create chart的時候自動生成的預設值。
我們将預設的鏡像位址和tag改成我們自己的鏡像
harbor-001.jimmysong.io/library/nginx:1.9
。
檢查配置和模闆是否有效
當使用kubernetes部署應用的時候實際上講templates渲染成最終的kubernetes能夠識别的yaml格式。
使用
helm install --dry-run --debug <chart_dir>
指令來驗證chart配置。該輸出中包含了模闆的變量配置與最終渲染的yaml檔案。
- $ helm install --dry-run --debug mychart
- Created tunnel using local port: '58406'
- SERVER: "localhost:58406"
- CHART PATH: / Users/jimmy/Workspace/github/bitnami/charts/incubator/mean/charts/mychart
- NAME: filled-seahorse
- REVISION:
- RELEASED: Tue Oct : :
- CHART: mychart
- USER-SUPPLIED VALUES:
- {}
- COMPUTED VALUES:
- image:
- pullPolicy: IfNotPresent
- repository: harbor jimmysong.io/ library/nginx
- tag:
- replicaCount:
- resources:
- limits:
- cpu: m
- memory: Mi
- requests:
- cpu: m
- memory: Mi
- service:
- externalPort:
- internalPort:
- name: nginx
- type: ClusterIP
- HOOKS:
- MANIFEST:
- ---
- # Source: mychart/templates/service.yaml
- apiVersion: v1
- kind: Service
- metadata:
- name: filled-seahorse-mychart
- labels:
- chart: "mychart-0.1.0"
- spec:
- type: ClusterIP
- ports:
- - port:
- targetPort:
- protocol: TCP
- name: nginx
- selector:
- app: filled-seahorse-mychart
- ---
- # Source: mychart/templates/deployment.yaml
- apiVersion: extensions/v1beta1
- kind: Deployment
- metadata:
- name: filled-seahorse-mychart
- labels:
- chart: "mychart-0.1.0"
- spec:
- replicas:
- template:
- metadata:
- labels:
- app: filled-seahorse-mychart
- spec:
- containers:
- - name: mychart
- image: "harbor-001.jimmysong.io/library/nginx:1.9"
- imagePullPolicy: IfNotPresent
- ports:
- - containerPort:
- livenessProbe:
- httpGet:
- path: /
- port:
- readinessProbe:
- httpGet:
- path: /
- port:
- resources:
- limits:
- cpu: m
- memory: Mi
- requests:
- cpu: m
- memory: Mi
我們可以看到Deployment和Service的名字前半截由兩個随機的單詞組成,最後才是我們在
values.yaml
中配置的值。
部署到kubernetes
在
mychart
目錄下執行下面的指令将nginx部署到kubernetes叢集上。
- helm install .
- NAME: eating-hound
- LAST DEPLOYED: Wed Oct : :
- NAMESPACE: default
- STATUS: DEPLOYED
- RESOURCES:
- ==> v1/Service
- NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- eating-hound-mychart < none> /TCP s
- ==> extensions/v1beta1/Deployment
- NAME DESIRED CURRENT UP- TO- DATE AVAILABLE AGE
- eating-hound-mychart s
- NOTES:
- Get the application URL by running these commands:
- export POD_NAME=$(kubectl get pods --namespace default -l "app=eating-hound-mychart" -o jsonpath="{.items[0].metadata.name}")
- echo "Visit http://127.0.0.1:8080 to use your application"
- kubectl port-forward $POD_NAME :
現在nginx已經部署到kubernetes叢集上,本地執行提示中的指令在本地主機上通路到nginx執行個體。
- export POD_NAME=$(kubectl get pods --namespace default -l "app=eating-hound-mychart" -o jsonpath= "{.items[0].metadata.name}")
- echo "Visit http://127.0.0.1:8080 to use your application"
- kubectl port-forward $POD_NAME :
在本地通路
http://127.0.0.1:8080
即可通路到nginx。
檢視部署的relaese
- $ helm list
- NAME REVISION UPDATED STATUS CHART NAMESPACE
- eating-hound Wed Oct : : DEPLOYED mychart default
删除部署的release
- $ helm delete eating-hound
- release "eating-hound" deleted
打包分享
我們可以修改
Chart.yaml
中的helm chart配置資訊,然後使用下列指令将chart打包成一個壓縮檔案。
helm package .
打包出
mychart-0.1.0.tgz
檔案。
将應用釋出到 Repository
雖然我們已經打包了 Chart 并釋出到了 Helm 的本地目錄中,但通過
helm search
指令查找,并不能找不到剛才生成的 mychart包。
- $ helm search mychart
- No results found
這是因為 Repository 目錄中的 Chart 包還沒有被 Helm 管理。通過
helm repo list
指令可以看到目前 Helm 中已配置的 Repository 的資訊。
- $ helm repo list
- NAME URL
- stable https: //kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
注:新版本中執行 helm init 指令後預設會配置一個名為 local 的本地倉庫。
我們可以在本地啟動一個 Repository Server,并将其加入到 Helm Repo 清單中。Helm Repository 必須以 Web 服務的方式提供,這裡我們就使用
helm serve
指令啟動一個 Repository Server,該 Server 預設使用
$HOME/.helm/repository/local
目錄作為 Chart 存儲,并在 8879 端口上提供服務。
- $ helm serve &
- Now serving you on :
預設情況下該服務隻監聽 127.0.0.1,如果你要綁定到其它網絡接口,可使用以下指令:
$ helm serve --address 192.168.100.211:8879 &
如果你想使用指定目錄來做為 Helm Repository 的存儲目錄,可以加上
--repo-path
參數:
$ helm serve --address : --repo-path /data/helm/repository/ --url http://192.168.100.211:8879/charts/
通過
helm repo index
指令将 Chart 的 Metadata 記錄更新在 index.yaml 檔案中:
- # 更新 Helm Repository 的索引檔案
- $ cd /home/k8s/.helm/repository/ local
- $ helm repo index --url=http: //192.168.100.211:8879 .
完成啟動本地 Helm Repository Server 後,就可以将本地 Repository 加入 Helm 的 Repo 清單。
- $ helm repo add local http: //127.0.0.1:8879
- "local" has been added to your repositories
現在再次查找 mychart 包,就可以搜尋到了。
- $ helm repo update
- $ helm search mychart
- NAME CHART VERSION APP VERSION DESCRIPTION
- local/mychart A Helm chart for Kubernetes
依賴
我們可以在
requirement.yaml
中定義應用所依賴的chart,例如定義對
mariadb
的依賴:
- dependencies:
- - name: mariadb
- version: .
- repository: https: //kubernetes-charts.storage.googleapis.com
使用
helm lint .
指令可以檢查依賴和模闆配置是否正确。
helm更新和回退一個應用
從上面
helm list
輸出的結果中我們可以看到有一個 Revision(更改曆史)字段,該字段用于表示某一個 Release 被更新的次數,我們可以用該特性對已部署的 Release 進行復原。
- 修改 Chart.yaml 檔案
将版本号從 0.1.0 修改為 0.2.0, 然後使用
helm package
指令打包并釋出到本地倉庫。
- $ cat mychart/Chart.yaml
- apiVersion: v1
- appVersion: "1.0"
- description: A Helm chart for Kubernetes
- name: mychart
- version: .
- $ helm package mychart
- Successfully packaged chart and saved it to: /home/k8s/mychart- . .tgz
- 查詢本地倉庫中的 Chart 資訊
我們可以看到在本地倉庫中 mychart 有兩個版本。
- $ helm search mychart -l
- NAME CHART VERSION APP VERSION DESCRIPTION
- local/mychart . A Helm chart for Kubernetes
- local/mychart . A Helm chart for Kubernetes
更新一個應用
現在用
helm upgrade
指令将已部署的 mike-test 更新到新版本。你可以通過
--version
參數指定需要更新的版本号,如果沒有指定版本号,則預設使用最新版本。
- $ helm upgrade mike-test local/mychart
- Release "mike-test" has been upgraded. Happy Helming!
- LAST DEPLOYED: Mon Jul : :
- NAMESPACE: default
- STATUS: DEPLOYED
- RESOURCES:
- ==> v1/Pod(related)
- NAME READY STATUS RESTARTS AGE
- mike- test-mychart d56f8c8c9-d685v / Running m
- ==> v1/Service
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- mike- test-mychart ClusterIP < none> /TCP m
- ==> v1beta2/Deployment
- NAME DESIRED CURRENT UP- TO- DATE AVAILABLE AGE
- mike- test-mychart m
- NOTES:
- Get the application URL by running these commands:
- export POD_NAME=$(kubectl get pods --namespace default -l "app=mychart,release=mike-test" -o jsonpath="{.items[0].metadata.name}")
- echo "Visit http://127.0.0.1:8080 to use your application"
- kubectl port-forward $POD_NAME :
完成後,可以看到已部署的 mike-test 被更新到 0.2.0 版本。
- $ helm list
- NAME REVISION UPDATED STATUS CHART NAMESPACE
- mike-test Mon Jul : : DEPLOYED mychart- . default
回退一個應用
如果更新後的程式由于某些原因運作有問題,需要回退到舊版本的應用。首先我們可以使用
helm history
指令檢視一個 Release 的所有變更記錄。
- $ helm history mike-test
- REVISION UPDATED STATUS CHART DESCRIPTION
- 1 Mon Jul 23 10:41:20 2018 SUPERSEDED mychart-0.1.0 Install complete
- Mon Jul : : DEPLOYED mychart Upgrade complete
其次,我們可以使用下面的指令對指定的應用進行回退。
- $ helm rollback mike- test
- Rollback was a success! Happy Helming!
注:其中的參數 1 是 helm history 檢視到 Release 的曆史記錄中 REVISION 對應的值。
最後,我們使用
helm list
和
helm history
指令都可以看到 mychart 的版本已經回退到 0.1.0 版本。
- $ helm list
- NAME REVISION UPDATED STATUS CHART NAMESPACE
- mike-test 3 Mon Jul 23 10:53:42 2018 DEPLOYED mychart-0.1.0 default
- $ helm history mike-test
- REVISION UPDATED STATUS CHART DESCRIPTION
- 1 Mon Jul 23 10:41:20 2018 SUPERSEDED mychart-0.1.0 Install complete
- Mon Jul : : SUPERSEDED mychart Upgrade complete
- Mon Jul : : DEPLOYED mychart Rollback to
删除一個應用
如果需要删除一個已部署的 Release,可以利用
helm delete
指令來完成删除。
- $ helm delete mike- test
- release "mike-test" deleted
确認應用是否删除,該應用已被标記為 DELETED 狀态。
- $ helm ls -a mike-test
- NAME REVISION UPDATED STATUS CHART NAMESPACE
- mike-test Mon Jul : : DELETED mychart- . default
也可以使用
--deleted
參數來列出已經删除的 Release
- $ helm ls --deleted
- NAME REVISION UPDATED STATUS CHART NAMESPACE
- mike-test Mon Jul : : DELETED mychart- . default
從上面的結果也可以看出,預設情況下已經删除的 Release 隻是将狀态辨別為 DELETED 了 ,但該 Release 的曆史資訊還是繼續被儲存的。
- $ helm hist mike-test
- REVISION UPDATED STATUS CHART DESCRIPTION
- 1 Mon Jul 23 10:41:20 2018 SUPERSEDED mychart-0.1.0 Install complete
- Mon Jul : : SUPERSEDED mychart Upgrade complete
- Mon Jul : : DELETED mychart Deletion complete
如果要移除指定 Release 所有相關的 Kubernetes 資源和 Release 的曆史記錄,可以用如下指令:
- $ helm delete --purge mike-test
- release "mike-test" deleted
再次檢視已删除的 Release,已經無法找到相關資訊。
- $ helm hist mike-test
- Error: release: "mike-test" not found
- # helm ls 指令也已均無查詢記錄。
- $ helm ls --deleted
- $ helm ls -a mike- test
使用Helm 部署 Wordpress應用執行個體
以Wordpress 為例,包括 MySQL、PHP 和 Apache。
由于測試環境沒有可用的 PersistentVolume(持久卷,簡稱 PV),這裡暫時将其關閉。
- $ helm install --name wordpress-test --set "persistence.enabled=false,mariadb.persistence.enabled=false,serviceType=NodePort" stable/wordpress
- NAMESPACE: default
- STATUS: DEPLOYED
- RESOURCES:
- ==> v1beta1/Deployment
- NAME DESIRED CURRENT UP- TO- DATE AVAILABLE AGE
- wordpress- test-mariadb m
- wordpress- test-wordpress m
- ==> v1/Pod(related)
- NAME READY STATUS RESTARTS AGE
- wordpress- test-mariadb b866bf95-n26ff / Running m
- wordpress- test-wordpress ff8c64b6c-sgtvv / Running m
- ==> v1/Secret
- NAME TYPE DATA AGE
- wordpress- test-mariadb Opaque m
- wordpress- test-wordpress Opaque m
- ==> v1/ConfigMap
- NAME DATA AGE
- wordpress- test-mariadb m
- wordpress- test-mariadb-tests m
- ==> v1/Service
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- wordpress- test-mariadb ClusterIP < none> /TCP m
- wordpress- test-wordpress NodePort < none> : /TCP, : /TCP m
- NOTES:
- Get the WordPress URL:
- Or running:
- export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services wordpress-test-wordpress)
- export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
- echo http://$NODE_IP:$NODE_PORT/ admin
- Login with the following credentials to see your blog
- echo Username: user
- echo Password: $(kubectl get secret --namespace default wordpress-test-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)
通路 Wordpress
部署完成後,我們可以通過上面的提示資訊生成相應的通路位址和使用者名、密碼等相關資訊。
- # 生成 Wordpress 管理背景位址
- $ export NODE_PORT=$(kubectl get --namespace default -o jsonpath= "{.spec.ports[0].nodePort}" services wordpress-test-wordpress)
- $ export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath= "{.items[0].status.addresses[0].address}")
- $ echo http:/ /$NODE_IP:$NODE_PORT/admin
- http:/ /192.168.100.211:8433/admin
- # 生成 Wordpress 管理帳号和密碼
- $ echo Username: user
- Username: user
- $ echo Password: $(kubectl get secret --namespace default wordpress-test-wordpress -o jsonpath= "{.data.wordpress-password}" | base64 --decode)
- Password: 9jEXJgnVAY
給一張通路效果圖吧:
Helm 其它使用技巧
- 如何設定 helm 指令自動補全?
為了友善
helm
指令的使用,Helm 提供了自動補全功能,如果使用 ZSH 請執行:
$ source <(helm completion zsh)
如果使用 BASH 請執行:
$ source <(helm completion bash)
- 如何使用第三方的 Chart 存儲庫?
随着 Helm 越來越普及,除了使用預置官方存儲庫,三方倉庫也越來越多了(前提是網絡是可達的)。你可以使用如下指令格式添加三方 Chart 存儲庫。
- $ helm repo add 存儲庫名 存儲庫URL
- $ helm repo update
一些三方存儲庫資源:
- # Prometheus Operator
- https: //github.com/coreos/prometheus-operator/tree/master/helm
- # Bitnami Library for Kubernetes
- https: //github.com/bitnami/charts
- # Openstack-Helm
- https: //github.com/att-comdev/openstack-helm
- https: //github.com/sapcc/openstack-helm
- # Tick-Charts
- https: //github.com/jackzampolin/tick-charts
- Helm 如何結合 CI/CD ?
采用 Helm 可以把零散的 Kubernetes 應用配置檔案作為一個 Chart 管理,Chart 源碼可以和源代碼一起放到 Git 庫中管理。通過把 Chart 參數化,可以在測試環境和生産環境采用不同的 Chart 參數配置。
下圖是采用了 Helm 的一個 CI/CD 流程
- Helm 如何管理多環境下 (Test、Staging、Production) 的業務配置?
Chart 是支援參數替換的,可以把業務配置相關的參數設定為模闆變量。使用
helm install
指令部署的時候指定一個參數值檔案,這樣就可以把業務參數從 Chart 中剝離了。例如:
helm install --values=values-production.yaml wordpress
。
- Helm 如何解決服務依賴?
在 Chart 裡可以通過 requirements.yaml 聲明對其它 Chart 的依賴關系。如下面聲明表明 Chart 依賴 Apache 和 MySQL 這兩個第三方 Chart。
- dependencies:
- - name: mariadb
- version: .
- repository: https: //kubernetes-charts.storage.googleapis.com/
- condition: mariadb.enabled
- tags:
- - wordpress-database
- - name: apache
- version: .
- repository: https: //kubernetes-charts.storage.googleapis.com/
- 如何讓 Helm 連接配接到指定 Kubernetes 叢集?
Helm 預設使用和 kubectl 指令相同的配置通路 Kubernetes 叢集,其配置預設在
~/.kube/config
中。
- 如何在部署時指定命名空間?
helm install
預設情況下是部署在 default 這個命名空間的。如果想部署到指定的指令空間,可以加上
--namespace
參數,比如:
$ helm install local/mychart --name mike-test --namespace mynamespace
- 如何檢視已部署應用的詳細資訊?
$ helm get wordpress-test
預設情況下會顯示最新的版本的相關資訊,如果想要檢視指定釋出版本的資訊可加上
--revision
參數。
$ helm get --revision wordpress-test
參考:
https://docs.helm.sh/using_helm/#installing-helm
https://mp.weixin.qq.com/s?__biz=MzI3MTI2NzkxMA==&mid=2247486154&idx=1&sn=becd5dd0fadfe0b6072f5dfdc6fdf786&chksm=eac52be3ddb2a2f555b8b1028db97aa3e92d0a4880b56f361e4b11cd252771147c44c08c8913&mpshare=1&scene=24&srcid=0927K11i8Vke44AuSuNdFclU#rd
https://jimmysong.io/kubernetes-handbook/practice/helm.html
https://imkira.com/a14.html
https://zhaohuabing.com/2018/04/16/using-helm-to-deploy-to-kubernetes/#undefined
https://help.aliyun.com/document_detail/58587.html?spm=a2c4e.11153940.blogcont159601.20.6703174aRHyZc9
目錄
helm簡介