helm簡介

目錄

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 過程:

  1. Helm從指定的目錄或者tgz文件中解析出Chart結構信息
  2. Helm將指定的Chart結構和Values信息通過gRPC傳遞給Tiller
  3. Tiller根據Chart和Values生成一個Release
  4. Tiller將Release發送給Kubernetes用於生成Release

Chart Update過程:

  1. Helm從指定的目錄或者tgz文件中解析出Chart結構信息
  2. Helm將要更新的Release的名稱和Chart結構,Values信息傳遞給Tiller
  3. Tiller生成Release並更新指定名稱的Release的History
  4. Tiller將Release發送給Kubernetes用於更新Release

Chart Rollback過程:

  1. Helm將要回滾的Release的名稱傳遞給Tiller
  2. Tiller根據Release的名稱查找History
  3. Tiller從History中獲取上一個Release
  4. Tiller將上一個Release發送給Kubernetes用於替換當前Release

helm部署

一、Helm 客戶端安裝

Helm 的安裝方式很多,這裏採用二進制的方式安裝。更多安裝方法可以參考 Helm 的官方幫助文檔。

方式一:使用官方提供的腳本一鍵安裝

  1. curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh
  2. $ chmod 700 get_helm.sh
  3. $ ./get_helm.sh

方式二:手動下載安裝

  1. #從官網下載最新版本的二進制安裝包到本地:https://github.com/kubernetes/helm/releases
  2. tar -zxvf helm-2.9.0.tar.gz # 解壓壓縮包
  3. # 把 helm 指令放到bin目錄下
  4. mv helm-2.9.0/helm /usr/local/bin/helm
  5. helm help # 驗證

二、Helm 服務端安裝Tiller

注意:先在 K8S 集羣上每個節點安裝 socat 軟件(yum install -y socat ),不然會報如下錯誤:

  1. 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.
  2. Error: cannot connect to Tiller

Tiller 是以 Deployment 方式部署在 Kubernetes 集羣中的,只需使用以下指令便可簡單的完成安裝。

$ helm init

由於 Helm 默認會去 storage.googleapis.com 拉取鏡像,如果你當前執行的機器不能訪問該域名的話可以使用以下命令來安裝:

  1. helm init --client-only --stable-repo-url https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts/
  2. helm repo add incubator https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
  3. helm repo update
  1. # 創建服務端
  2. 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
  3. # 創建TLS認證服務端,參考地址:https://github.com/gjmzj/kubeasz/blob/master/docs/guide/helm.md
  4. 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 的服務帳號和綁定角色

  1. $ kubectl create serviceaccount --namespace kube-system tiller
  2. $ kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller

爲 Tiller 設置帳號

  1. # 使用 kubectl patch 更新 API 對象
  2. $ kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
  3. deployment.extensions "tiller-deploy" patched

查看是否授權成功

  1. $ kubectl get deploy --namespace kube-system   tiller-deploy  --output yaml|grep  serviceAccount
  2. serviceAccount: tiller
  3. serviceAccountName: tiller

四、驗證 Tiller 是否安裝成功

  1. $ kubectl -n kube-system get pods|grep tiller
  2. tiller-deploy-6d68f5c78f-nql2z          1/1       Running   0          5m
  3. $ helm version
  4. Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
  5. Server: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}

五、卸載 Helm 服務器端 Tiller

如果你需要在 Kubernetes 中卸載已部署的 Tiller,可使用以下命令完成卸載。

  1. $ helm reset
  2. $helm reset --force

六、Helm 使用

1)更換倉庫:

若遇到Unable to get an update from the “stable” chart repository (https://kubernetes-charts.storage.googleapis.com) 錯誤
手動更換stable 存儲庫爲阿里雲的存儲庫

  1. # 先移除原先的倉庫
  2. helm repo remove stable
  3. # 添加新的倉庫地址
  4. helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
  5. # 更新倉庫
  6. helm repo update

2)查看在存儲庫中可用的所有 Helm charts:

  1. helm search
  2. NAME CHART VERSION APP VERSION DESCRIPTION
  3. stable/acs-engine-autoscaler 2.1.3 2.1.1 Scales worker nodes within agent pools
  4. stable/aerospike 0.1.7 v3.14.1.2 A Helm chart for Aerospike in Kubernetes
  5. stable/anchore-engine 0.1.3 0.1.6 Anchore container analysis and policy evaluatio...
  6. stable/artifactory 7.0.3 5.8.4 Universal Repository Manager supporting all maj...
  7. stable/artifactory-ha 0.1.0 5.8.4 Universal Repository Manager supporting all maj...
  8. stable/aws-cluster-autoscaler 0.3.2 Scales worker nodes within autoscaling groups.
  9. ... ...

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:

  1. # 添加新的源
  2. helm repo add monocular https://kubernetes-helm.github.io/monocular
  3. # 安裝
  4. helm install monocular/monocular -f custom-repos.yaml
  5. # custom-repos.yaml 內容
  6. cat custom-repos.yaml
  7. api:
  8. config:
  9. repos:
  10. - name: stable
  11. url: https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts
  12. source: https://github.com/kubernetes/charts/tree/master/stable
  13. - name: incubator
  14. url: https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator
  15. source: https://github.com/kubernetes/charts/tree/master/incubator
  16. - name: monocular
  17. url: https://kubernetes-helm.github.io/monocular
  18. source: https://github.com/kubernetes-helm/monocular/tree/master/charts

5)查看K8S中已安裝的charts:

  1. helm list
  2. NAME REVISION UPDATED STATUS CHART NAMESPACE
  3. amber-seal 1 Mon Jul 2 17:29:25 2018 DEPLOYED nginx-ingress-0.9.5 default
  4. my-release 1 Mon Jul 2 15:19:44 2018 DEPLOYED spark-0.1.10 default
  5. nonplussed-panther 1 Mon Jul 2 17:27:41 2018 FAILED nginx-ingress-0.9.5 default
  6. turbulent-tuatara 1 Mon Jul 2 17:31:33 2018 DEPLOYED monocular-0.6.2 default

6)刪除安裝的charts:

  1. # 刪除:helm delete xxx
  2. helm delete amber-seal

Helm Chart 結構

Chart 目錄結構

  1. examples/
  2. Chart.yaml # Yaml文件,用於描述Chart的基本信息,包括名稱版本等
  3. LICENSE # [可選] 協議
  4. README.md # [可選] 當前Chart的介紹
  5. values.yaml # Chart的默認配置文件
  6. requirements.yaml # [可選] 用於存放當前Chart依賴的其它Chart的說明文件
  7. charts/ # [可選]: 該目錄中放置當前Chart依賴的其它Chart
  8. templates/ # [可選]: 部署文件模版目錄,模版使用的值來自values.yaml和由Tiller提供的值
  9. templates/NOTES.txt # [可選]: 放置Chart的使用指南

Chart.yaml 文件

  1. name: [必須] Chart的名稱
  2. version: [必須] Chart的版本號,版本號必須符合 SemVer 2:http://semver.org/
  3. description: [可選] Chart的簡要描述
  4. keywords:
  5. - [可選] 關鍵字列表
  6. home: [可選] 項目地址
  7. sources:
  8. - [可選] 當前Chart的下載地址列表
  9. maintainers: # [可選]
  10. - name: [必須] 名字
  11. email: [可選] 郵箱
  12. engine: gotpl # [可選] 模版引擎,默認值是gotpl
  13. icon: [可選] 一個SVG或PNG格式的圖片地址

requirements.yaml 和 charts目錄

requirements.yaml 文件內容:

  1. dependencies:
  2. - name: example
  3. version: 1.2.3
  4. repository: http://example.com/charts
  5. - name: Chart名稱
  6. version: Chart版本
  7. repository: 該Chart所在的倉庫地址

 

Chart支持兩種方式表示依賴關係,可以使用requirements.yaml或者直接將依賴的Chart放置到charts目錄中。

templates 目錄

templates目錄中存放了Kubernetes部署文件的模版。
例如:

  1. # db.yaml
  2. apiVersion: v1
  3. kind: ReplicationController
  4. metadata:
  5. name: deis-database
  6. namespace: deis
  7. labels:
  8. heritage: deis
  9. spec:
  10. replicas: 1
  11. selector:
  12. app: deis-database
  13. template:
  14. metadata:
  15. labels:
  16. app: deis-database
  17. spec:
  18. serviceAccount: deis-database
  19. containers:
  20. - name: deis-database
  21. image: {{.Values.imageRegistry}}/postgres:{{.Values.dockerTag}}
  22. imagePullPolicy: {{.Values.pullPolicy}}
  23. ports:
  24. - containerPort: 5432
  25. env:
  26. - name: DATABASE_STORAGE
  27. value: {{default "minio" .Values.storage}}

 

模版語法擴展了 golang/text/template的語法:

  1. # 這種方式定義的模版,會去除test模版尾部所有的空行
  2. {{- define "test"}}
  3. 模版內容
  4. {{- end}}
  5. # 去除test模版頭部的第一個空行
  6. {{- template "test" }}

用於yaml文件前置空格的語法:

  1. # 這種方式定義的模版,會去除test模版頭部和尾部所有的空行
  2. {{- define "test" -}}
  3. 模版內容
  4. {{- end -}}
  5. # 可以在test模版每一行的頭部增加4個空格,用於yaml文件的對齊
  6. {{ include "test" | indent 4}}

創建自己的chart

我們創建一個名爲mongodb的chart,看一看chart的文件結構。

  1. $ helm create mongodb
  2. $ tree mongodb
  3. mongodb
  4. ├── Chart.yaml #Chart本身的版本和配置信息
  5. ├── charts #依賴的chart
  6. ├── templates #配置模板目錄
  7. │ ├── NOTES.txt #helm提示信息
  8. │ ├── _helpers.tpl #用於修改kubernetes objcet配置的模板
  9. │ ├── deployment.yaml #kubernetes Deployment object
  10. │ └── service.yaml #kubernetes Serivce
  11. └── values.yaml #kubernetes object configuration
  12. 2 directories, 6 files

模板

Templates目錄下是yaml文件的模板,遵循Go template語法。使用過Hugo的靜態網站生成工具的人應該對此很熟悉。

我們查看下deployment.yaml文件的內容。

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: {{ template "fullname" . }}
  5. labels:
  6. chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
  7. spec:
  8. replicas: {{ .Values.replicaCount }}
  9. template:
  10. metadata:
  11. labels:
  12. app: {{ template "fullname" . }}
  13. spec:
  14. containers:
  15. - name: {{ .Chart.Name }}
  16. image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
  17. imagePullPolicy: {{ .Values.image.pullPolicy }}
  18. ports:
  19. - containerPort: {{ .Values.service.internalPort }}
  20. livenessProbe:
  21. httpGet:
  22. path: /
  23. port: {{ .Values.service.internalPort }}
  24. readinessProbe:
  25. httpGet:
  26. path: /
  27. port: {{ .Values.service.internalPort }}
  28. resources:
  29. {{ toyaml .Values.resources | indent 12 }}

這是該應用的Deployment的yaml配置文件,其中的雙大括號包擴起來的部分是Go template,其中的Values是在values.yaml文件中定義的:

  1. # Default values for mychart.
  2. # This is a yaml-formatted file.
  3. # Declare variables to be passed into your templates.
  4. replicaCount: 1
  5. image:
  6. repository: nginx
  7. tag: stable
  8. pullPolicy: IfNotPresent
  9. service:
  10. name: nginx
  11. type: ClusterIP
  12. externalPort: 80
  13. internalPort: 80
  14. resources:
  15. limits:
  16. cpu: 100m
  17. memory: 128Mi
  18. requests:
  19. cpu: 100m
  20. 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文件。

  1. $ helm install --dry-run --debug mychart
  2. Created tunnel using local port: '58406'
  3. SERVER: "localhost:58406"
  4. CHART PATH: /Users/jimmy/Workspace/github/bitnami/charts/incubator/mean/charts/mychart
  5. NAME: filled-seahorse
  6. REVISION: 1
  7. RELEASED: Tue Oct 24 18:57:13 2017
  8. CHART: mychart-0.1.0
  9. USER-SUPPLIED VALUES:
  10. {}
  11. COMPUTED VALUES:
  12. image:
  13. pullPolicy: IfNotPresent
  14. repository: harbor-001.jimmysong.io/library/nginx
  15. tag: 1.9
  16. replicaCount: 1
  17. resources:
  18. limits:
  19. cpu: 100m
  20. memory: 128Mi
  21. requests:
  22. cpu: 100m
  23. memory: 128Mi
  24. service:
  25. externalPort: 80
  26. internalPort: 80
  27. name: nginx
  28. type: ClusterIP
  29. HOOKS:
  30. MANIFEST:
  31. ---
  32. # Source: mychart/templates/service.yaml
  33. apiVersion: v1
  34. kind: Service
  35. metadata:
  36. name: filled-seahorse-mychart
  37. labels:
  38. chart: "mychart-0.1.0"
  39. spec:
  40. type: ClusterIP
  41. ports:
  42. - port: 80
  43. targetPort: 80
  44. protocol: TCP
  45. name: nginx
  46. selector:
  47. app: filled-seahorse-mychart
  48. ---
  49. # Source: mychart/templates/deployment.yaml
  50. apiVersion: extensions/v1beta1
  51. kind: Deployment
  52. metadata:
  53. name: filled-seahorse-mychart
  54. labels:
  55. chart: "mychart-0.1.0"
  56. spec:
  57. replicas: 1
  58. template:
  59. metadata:
  60. labels:
  61. app: filled-seahorse-mychart
  62. spec:
  63. containers:
  64. - name: mychart
  65. image: "harbor-001.jimmysong.io/library/nginx:1.9"
  66. imagePullPolicy: IfNotPresent
  67. ports:
  68. - containerPort: 80
  69. livenessProbe:
  70. httpGet:
  71. path: /
  72. port: 80
  73. readinessProbe:
  74. httpGet:
  75. path: /
  76. port: 80
  77. resources:
  78. limits:
  79. cpu: 100m
  80. memory: 128Mi
  81. requests:
  82. cpu: 100m
  83. memory: 128Mi

我們可以看到Deployment和Service的名字前半截由兩個隨機的單詞組成,最後纔是我們在values.yaml中配置的值。

部署到kubernetes

mychart目錄下執行下面的命令將nginx部署到kubernetes集羣上。

  1. helm install .
  2. NAME: eating-hound
  3. LAST DEPLOYED: Wed Oct 25 14:58:15 2017
  4. NAMESPACE: default
  5. STATUS: DEPLOYED
  6. RESOURCES:
  7. ==> v1/Service
  8. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  9. eating-hound-mychart 10.254.135.68 <none> 80/TCP 0s
  10. ==> extensions/v1beta1/Deployment
  11. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  12. eating-hound-mychart 1 1 1 0 0s
  13. NOTES:
  14. 1. Get the application URL by running these commands:
  15. export POD_NAME=$(kubectl get pods --namespace default -l "app=eating-hound-mychart" -o jsonpath="{.items[0].metadata.name}")
  16. echo "Visit http://127.0.0.1:8080 to use your application"
  17. kubectl port-forward $POD_NAME 8080:80

現在nginx已經部署到kubernetes集羣上,本地執行提示中的命令在本地主機上訪問到nginx實例。

  1. export POD_NAME=$(kubectl get pods --namespace default -l "app=eating-hound-mychart" -o jsonpath="{.items[0].metadata.name}")
  2. echo "Visit http://127.0.0.1:8080 to use your application"
  3. kubectl port-forward $POD_NAME 8080:80

在本地訪問http://127.0.0.1:8080即可訪問到nginx。

查看部署的relaese

  1. $ helm list
  2. NAME REVISION UPDATED STATUS CHART NAMESPACE
  3. eating-hound 1 Wed Oct 25 14:58:15 2017 DEPLOYED mychart-0.1.0 default

刪除部署的release

  1. $ helm delete eating-hound
  2. release "eating-hound" deleted

打包分享

我們可以修改Chart.yaml中的helm chart配置信息,然後使用下列命令將chart打包成一個壓縮文件。

helm package .

打包出mychart-0.1.0.tgz文件。

將應用發佈到 Repository

雖然我們已經打包了 Chart 併發布到了 Helm 的本地目錄中,但通過 helm search 命令查找,並不能找不到剛纔生成的 mychart包。

  1. $ helm search mychart
  2. No results found

這是因爲 Repository 目錄中的 Chart 包還沒有被 Helm 管理。通過 helm repo list 命令可以看到目前 Helm 中已配置的 Repository 的信息。

  1. $ helm repo list
  2. NAME    URL
  3. 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 端口上提供服務。

  1. $ helm serve &
  2. 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 文件中:

  1. # 更新 Helm Repository 的索引文件
  2. $ cd /home/k8s/.helm/repository/local
  3. $ helm repo index --url=http://192.168.100.211:8879 .

完成啓動本地 Helm Repository Server 後,就可以將本地 Repository 加入 Helm 的 Repo 列表。

  1. $ helm repo add local http://127.0.0.1:8879
  2. "local" has been added to your repositories

現在再次查找 mychart 包,就可以搜索到了。

  1. $ helm repo update
  2. $ helm search mychart
  3. NAME          CHART VERSION APP VERSION DESCRIPTION
  4. local/mychart 0.1.0         1.0         A Helm chart for Kubernetes

依賴

我們可以在requirement.yaml中定義應用所依賴的chart,例如定義對mariadb的依賴:

  1. dependencies:
  2. - name: mariadb
  3. version: 0.6.0
  4. 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 命令打包併發布到本地倉庫。

  1. $ cat mychart/Chart.yaml
  2. apiVersion: v1
  3. appVersion: "1.0"
  4. description: A Helm chart for Kubernetes
  5. name: mychart
  6. version: 0.2.0
  7. $ helm package mychart
  8. Successfully packaged chart and saved it to: /home/k8s/mychart-0.2.0.tgz
  • 查詢本地倉庫中的 Chart 信息

我們可以看到在本地倉庫中 mychart 有兩個版本。

  1. $ helm search mychart -l
  2. NAME          CHART VERSION APP VERSION DESCRIPTION
  3. local/mychart 0.2.0         1.0         A Helm chart for Kubernetes
  4. local/mychart 0.1.0         1.0         A Helm chart for Kubernetes

升級一個應用

現在用 helm upgrade 命令將已部署的 mike-test 升級到新版本。你可以通過 --version 參數指定需要升級的版本號,如果沒有指定版本號,則缺省使用最新版本。

  1. $ helm upgrade mike-test local/mychart
  2. Release "mike-test" has been upgraded. Happy Helming!
  3. LAST DEPLOYED: Mon Jul 23 10:50:25 2018
  4. NAMESPACE: default
  5. STATUS: DEPLOYED
  6. RESOURCES:
  7. ==> v1/Pod(related)
  8. NAME                                READY  STATUS   RESTARTS  AGE
  9. mike-test-mychart-6d56f8c8c9-d685v  1/1    Running  0         9m
  10. ==> v1/Service
  11. NAME               TYPE       CLUSTER-IP      EXTERNAL-IP  PORT(S)  AGE
  12. mike-test-mychart  ClusterIP  10.254.120.177  <none>       80/TCP   9m
  13. ==> v1beta2/Deployment
  14. NAME               DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
  15. mike-test-mychart  1        1        1           1          9m
  16. NOTES:
  17. 1. Get the application URL by running these commands:
  18. export POD_NAME=$(kubectl get pods --namespace default -l "app=mychart,release=mike-test" -o jsonpath="{.items[0].metadata.name}")
  19. echo "Visit http://127.0.0.1:8080 to use your application"
  20. kubectl port-forward $POD_NAME 8080:80

完成後,可以看到已部署的 mike-test 被升級到 0.2.0 版本。

  1. $ helm list
  2. NAME      REVISION  UPDATED                   STATUS    CHART         NAMESPACE
  3. mike-test 2         Mon Jul 23 10:50:25 2018  DEPLOYED  mychart-0.2.0 default

回退一個應用

如果更新後的程序由於某些原因運行有問題,需要回退到舊版本的應用。首先我們可以使用 helm history 命令查看一個 Release 的所有變更記錄。

  1. $ helm history mike-test
  2. REVISION  UPDATED                   STATUS      CHART         DESCRIPTION
  3. 1         Mon Jul 23 10:41:20 2018  SUPERSEDED  mychart-0.1.0 Install complete
  4. 2         Mon Jul 23 10:50:25 2018  DEPLOYED    mychart-0.2.0 Upgrade complete

其次,我們可以使用下面的命令對指定的應用進行回退。

  1. $ helm rollback mike-test 1
  2. Rollback was a success! Happy Helming!

注:其中的參數 1 是 helm history 查看到 Release 的歷史記錄中 REVISION 對應的值。

最後,我們使用 helm listhelm history 命令都可以看到 mychart 的版本已經回退到 0.1.0 版本。

  1. $ helm list
  2. NAME      REVISION  UPDATED                   STATUS    CHART         NAMESPACE
  3. mike-test 3         Mon Jul 23 10:53:42 2018  DEPLOYED  mychart-0.1.0 default
  4. $ helm history mike-test
  5. REVISION  UPDATED                   STATUS      CHART         DESCRIPTION
  6. 1         Mon Jul 23 10:41:20 2018  SUPERSEDED  mychart-0.1.0 Install complete
  7. 2         Mon Jul 23 10:50:25 2018  SUPERSEDED  mychart-0.2.0 Upgrade complete
  8. 3         Mon Jul 23 10:53:42 2018  DEPLOYED    mychart-0.1.0 Rollback to 1

刪除一個應用

如果需要刪除一個已部署的 Release,可以利用 helm delete 命令來完成刪除。

  1. $ helm delete mike-test
  2. release "mike-test" deleted

確認應用是否刪除,該應用已被標記爲 DELETED 狀態。

  1. $ helm ls -a mike-test
  2. NAME      REVISION  UPDATED                   STATUS  CHART         NAMESPACE
  3. mike-test 3         Mon Jul 23 10:53:42 2018  DELETED mychart-0.1.0 default

也可以使用 --deleted 參數來列出已經刪除的 Release

  1. $ helm ls --deleted
  2. NAME      REVISION  UPDATED                   STATUS  CHART         NAMESPACE
  3. mike-test 3         Mon Jul 23 10:53:42 2018  DELETED mychart-0.1.0 default

從上面的結果也可以看出,默認情況下已經刪除的 Release 只是將狀態標識爲 DELETED 了 ,但該 Release 的歷史信息還是繼續被保存的。

  1. $ helm hist mike-test
  2. REVISION  UPDATED                   STATUS      CHART         DESCRIPTION
  3. 1         Mon Jul 23 10:41:20 2018  SUPERSEDED  mychart-0.1.0 Install complete
  4. 2         Mon Jul 23 10:50:25 2018  SUPERSEDED  mychart-0.2.0 Upgrade complete
  5. 3         Mon Jul 23 10:53:42 2018  DELETED     mychart-0.1.0 Deletion complete

如果要移除指定 Release 所有相關的 Kubernetes 資源和 Release 的歷史記錄,可以用如下命令:

  1. $ helm delete --purge mike-test
  2. release "mike-test" deleted

再次查看已刪除的 Release,已經無法找到相關信息。

  1. $ helm hist mike-test
  2. Error: release: "mike-test" not found
  3. # helm ls 命令也已均無查詢記錄。
  4. $ helm ls --deleted
  5. $ helm ls -a mike-test

使用Helm 部署 Wordpress應用實例

以Wordpress 爲例,包括 MySQL、PHP 和 Apache。

由於測試環境沒有可用的 PersistentVolume(持久卷,簡稱 PV),這裏暫時將其關閉。

  1. $ helm install --name wordpress-test --set "persistence.enabled=false,mariadb.persistence.enabled=false,serviceType=NodePort"  stable/wordpress
  2. NAMESPACE: default
  3. STATUS: DEPLOYED
  4. RESOURCES:
  5. ==> v1beta1/Deployment
  6. NAME                      DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
  7. wordpress-test-mariadb    1        1        1           1          26m
  8. wordpress-test-wordpress  1        1        1           1          26m
  9. ==> v1/Pod(related)
  10. NAME                                       READY  STATUS   RESTARTS  AGE
  11. wordpress-test-mariadb-84b866bf95-n26ff    1/1    Running  1         26m
  12. wordpress-test-wordpress-5ff8c64b6c-sgtvv  1/1    Running  6         26m
  13. ==> v1/Secret
  14. NAME                      TYPE    DATA  AGE
  15. wordpress-test-mariadb    Opaque  2     26m
  16. wordpress-test-wordpress  Opaque  2     26m
  17. ==> v1/ConfigMap
  18. NAME                          DATA  AGE
  19. wordpress-test-mariadb        1     26m
  20. wordpress-test-mariadb-tests  1     26m
  21. ==> v1/Service
  22. NAME                      TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)                   AGE
  23. wordpress-test-mariadb    ClusterIP  10.254.99.67   <none>       3306/TCP                  26m
  24. wordpress-test-wordpress  NodePort   10.254.175.16  <none>       80:8563/TCP,443:8839/TCP  26m
  25. NOTES:
  26. 1. Get the WordPress URL:
  27. Or running:
  28. export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services wordpress-test-wordpress)
  29. export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
  30. echo http://$NODE_IP:$NODE_PORT/admin
  31. 2. Login with the following credentials to see your blog
  32. echo Username: user
  33. echo Password: $(kubectl get secret --namespace default wordpress-test-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)

訪問 Wordpress

部署完成後,我們可以通過上面的提示信息生成相應的訪問地址和用戶名、密碼等相關信息。

  1. # 生成 Wordpress 管理後臺地址
  2. $ export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services wordpress-test-wordpress)
  3. $ export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
  4. $ echo http://$NODE_IP:$NODE_PORT/admin
  5. http://192.168.100.211:8433/admin
  6. # 生成 Wordpress 管理帳號和密碼
  7. $ echo Username: user
  8. Username: user
  9. $ echo Password: $(kubectl get secret --namespace default wordpress-test-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)
  10. Password: 9jEXJgnVAY

給一張訪問效果圖吧:

Helm 其它使用技巧

  • 如何設置 helm 命令自動補全?

爲了方便 helm 命令的使用,Helm 提供了自動補全功能,如果使用 ZSH 請執行:

$ source <(helm completion zsh)

如果使用 BASH 請執行:

$ source <(helm completion bash)
  • 如何使用第三方的 Chart 存儲庫?

隨着 Helm 越來越普及,除了使用預置官方存儲庫,三方倉庫也越來越多了(前提是網絡是可達的)。你可以使用如下命令格式添加三方 Chart 存儲庫。

  1. $ helm repo add 存儲庫名 存儲庫URL
  2. $ helm repo update

一些三方存儲庫資源:

  1. # Prometheus Operator
  2. https://github.com/coreos/prometheus-operator/tree/master/helm
  3. # Bitnami Library for Kubernetes
  4. https://github.com/bitnami/charts
  5. # Openstack-Helm
  6. https://github.com/att-comdev/openstack-helm
  7. https://github.com/sapcc/openstack-helm
  8. # Tick-Charts
  9. 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。

  1. dependencies:
  2. - name: mariadb
  3. version: 2.1.1
  4. repository: https://kubernetes-charts.storage.googleapis.com/
  5. condition: mariadb.enabled
  6. tags:
  7. - wordpress-database
  8. - name: apache
  9. version: 1.4.0
  10. 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://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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章