目錄
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 700 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 22:22:15.492436 24409 portforward.go:331] an error occurred forwarding 38398 -> 44134: error forwarding port 44134 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.9.1 --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.9.1 --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-6d68f5c78f-nql2z 1/1 Running 0 5m
-
- $ 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 2.1.3 2.1.1 Scales worker nodes within agent pools
- stable/aerospike 0.1.7 v3.14.1.2 A Helm chart for Aerospike in Kubernetes
- stable/anchore-engine 0.1.3 0.1.6 Anchore container analysis and policy evaluatio...
- stable/artifactory 7.0.3 5.8.4 Universal Repository Manager supporting all maj...
- stable/artifactory-ha 0.1.0 5.8.4 Universal Repository Manager supporting all maj...
- stable/aws-cluster-autoscaler 0.3.2 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 2: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: 1.2.3
- 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: 1
- 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: 5432
- 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
-
- 2 directories, 6 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 12 }}
這是該應用的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: 1
- image:
- repository: nginx
- tag: stable
- pullPolicy: IfNotPresent
- service:
- name: nginx
- type: ClusterIP
- externalPort: 80
- internalPort: 80
- resources:
- limits:
- cpu: 100m
- memory: 128Mi
- requests:
- cpu: 100m
- memory: 128Mi
比如在Deployment.yaml
中定義的容器鏡像image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
其中的:
.Values.image.repository
就是nginx.Values.image.tag
就是stable
以上兩個變量值是在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: 1
- RELEASED: Tue Oct 24 18:57:13 2017
- CHART: mychart-0.1.0
- USER-SUPPLIED VALUES:
- {}
-
- COMPUTED VALUES:
- image:
- pullPolicy: IfNotPresent
- repository: harbor-001.jimmysong.io/library/nginx
- tag: 1.9
- replicaCount: 1
- resources:
- limits:
- cpu: 100m
- memory: 128Mi
- requests:
- cpu: 100m
- memory: 128Mi
- service:
- externalPort: 80
- internalPort: 80
- 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: 80
- targetPort: 80
- 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: 1
- template:
- metadata:
- labels:
- app: filled-seahorse-mychart
- spec:
- containers:
- - name: mychart
- image: "harbor-001.jimmysong.io/library/nginx:1.9"
- imagePullPolicy: IfNotPresent
- ports:
- - containerPort: 80
- livenessProbe:
- httpGet:
- path: /
- port: 80
- readinessProbe:
- httpGet:
- path: /
- port: 80
- resources:
- limits:
- cpu: 100m
- memory: 128Mi
- requests:
- cpu: 100m
- memory: 128Mi
我們可以看到Deployment和Service的名字前半截由兩個隨機的單詞組成,最後纔是我們在values.yaml
中配置的值。
部署到kubernetes
在mychart
目錄下執行下面的命令將nginx部署到kubernetes集羣上。
- helm install .
- NAME: eating-hound
- LAST DEPLOYED: Wed Oct 25 14:58:15 2017
- NAMESPACE: default
- STATUS: DEPLOYED
-
- RESOURCES:
- ==> v1/Service
- NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- eating-hound-mychart 10.254.135.68 <none> 80/TCP 0s
-
- ==> extensions/v1beta1/Deployment
- NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
- eating-hound-mychart 1 1 1 0 0s
-
-
- NOTES:
- 1. 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 8080:80
現在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 8080:80
在本地訪問http://127.0.0.1:8080
即可訪問到nginx。
查看部署的relaese
- $ helm list
- NAME REVISION UPDATED STATUS CHART NAMESPACE
- eating-hound 1 Wed Oct 25 14:58:15 2017 DEPLOYED mychart-0.1.0 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:8879
默認情況下該服務只監聽 127.0.0.1,如果你要綁定到其它網絡接口,可使用以下命令:
$ helm serve --address 192.168.100.211:8879 &
如果你想使用指定目錄來做爲 Helm Repository 的存儲目錄,可以加上 --repo-path
參數:
$ helm serve --address 192.168.100.211:8879 --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 0.1.0 1.0 A Helm chart for Kubernetes
依賴
我們可以在requirement.yaml
中定義應用所依賴的chart,例如定義對mariadb
的依賴:
- dependencies:
- - name: mariadb
- version: 0.6.0
- 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: 0.2.0
-
- $ helm package mychart
- Successfully packaged chart and saved it to: /home/k8s/mychart-0.2.0.tgz
-
查詢本地倉庫中的 Chart 信息
我們可以看到在本地倉庫中 mychart 有兩個版本。
- $ helm search mychart -l
- NAME CHART VERSION APP VERSION DESCRIPTION
- local/mychart 0.2.0 1.0 A Helm chart for Kubernetes
- local/mychart 0.1.0 1.0 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 23 10:50:25 2018
- NAMESPACE: default
- STATUS: DEPLOYED
-
- RESOURCES:
- ==> v1/Pod(related)
- NAME READY STATUS RESTARTS AGE
- mike-test-mychart-6d56f8c8c9-d685v 1/1 Running 0 9m
-
- ==> v1/Service
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- mike-test-mychart ClusterIP 10.254.120.177 <none> 80/TCP 9m
-
- ==> v1beta2/Deployment
- NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
- mike-test-mychart 1 1 1 1 9m
-
- NOTES:
- 1. 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 8080:80
完成後,可以看到已部署的 mike-test 被升級到 0.2.0 版本。
- $ helm list
- NAME REVISION UPDATED STATUS CHART NAMESPACE
- mike-test 2 Mon Jul 23 10:50:25 2018 DEPLOYED mychart-0.2.0 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
- 2 Mon Jul 23 10:50:25 2018 DEPLOYED mychart-0.2.0 Upgrade complete
其次,我們可以使用下面的命令對指定的應用進行回退。
- $ helm rollback mike-test 1
- 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
- 2 Mon Jul 23 10:50:25 2018 SUPERSEDED mychart-0.2.0 Upgrade complete
- 3 Mon Jul 23 10:53:42 2018 DEPLOYED mychart-0.1.0 Rollback to 1
刪除一個應用
如果需要刪除一個已部署的 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 3 Mon Jul 23 10:53:42 2018 DELETED mychart-0.1.0 default
也可以使用 --deleted
參數來列出已經刪除的 Release
- $ helm ls --deleted
- NAME REVISION UPDATED STATUS CHART NAMESPACE
- mike-test 3 Mon Jul 23 10:53:42 2018 DELETED mychart-0.1.0 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
- 2 Mon Jul 23 10:50:25 2018 SUPERSEDED mychart-0.2.0 Upgrade complete
- 3 Mon Jul 23 10:53:42 2018 DELETED mychart-0.1.0 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 1 1 1 1 26m
- wordpress-test-wordpress 1 1 1 1 26m
-
- ==> v1/Pod(related)
- NAME READY STATUS RESTARTS AGE
- wordpress-test-mariadb-84b866bf95-n26ff 1/1 Running 1 26m
- wordpress-test-wordpress-5ff8c64b6c-sgtvv 1/1 Running 6 26m
-
- ==> v1/Secret
- NAME TYPE DATA AGE
- wordpress-test-mariadb Opaque 2 26m
- wordpress-test-wordpress Opaque 2 26m
-
- ==> v1/ConfigMap
- NAME DATA AGE
- wordpress-test-mariadb 1 26m
- wordpress-test-mariadb-tests 1 26m
-
- ==> v1/Service
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- wordpress-test-mariadb ClusterIP 10.254.99.67 <none> 3306/TCP 26m
- wordpress-test-wordpress NodePort 10.254.175.16 <none> 80:8563/TCP,443:8839/TCP 26m
-
- NOTES:
- 1. 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
-
- 2. 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: 2.1.1
- repository: https://kubernetes-charts.storage.googleapis.com/
- condition: mariadb.enabled
- tags:
- - wordpress-database
- - name: apache
- version: 1.4.0
- 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 1 wordpress-test
參考:
https://docs.helm.sh/using_helm/#installing-helm
https://jimmysong.io/kubernetes-handbook/practice/helm.html
https://zhaohuabing.com/2018/04/16/using-helm-to-deploy-to-kubernetes/#undefined