天天看點

helm簡介helm簡介Helm 元件及相關術語Helm工作原理helm部署Helm Chart 結建構立自己的charthelm更新和回退一個應用使用Helm 部署 Wordpress應用執行個體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工作原理

helm簡介helm簡介Helm 元件及相關術語Helm工作原理helm部署Helm Chart 結建構立自己的charthelm更新和回退一個應用使用Helm 部署 Wordpress應用執行個體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 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 : : portforward.go: ] an error occurred forwarding -> : error forwarding port 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. --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. --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 d68f5c78f-nql2z           /       Running   m
  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 Scales worker nodes within agent pools
  4. stable/aerospike v3 A Helm chart for Aerospike in Kubernetes
  5. stable/anchore-engine Anchore container analysis and policy evaluatio...
  6. stable/artifactory Universal Repository Manager supporting all maj...
  7. stable/artifactory-ha Universal Repository Manager supporting all maj...
  8. stable/aws-cluster-autoscaler 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 :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: .
  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:
  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:
  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. directories, 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 }}

這是該應用的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:
  5. image:
  6. repository: nginx
  7. tag: stable
  8. pullPolicy: IfNotPresent
  9. service:
  10. name: nginx
  11. type: ClusterIP
  12. externalPort:
  13. internalPort:
  14. resources:
  15. limits:
  16. cpu: m
  17. memory: Mi
  18. requests:
  19. cpu: m
  20. memory: Mi

比如在

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:
  7. RELEASED: Tue Oct : :
  8. CHART: mychart
  9. USER-SUPPLIED VALUES:
  10. {}
  11. COMPUTED VALUES:
  12. image:
  13. pullPolicy: IfNotPresent
  14. repository: harbor jimmysong.io/ library/nginx
  15. tag:
  16. replicaCount:
  17. resources:
  18. limits:
  19. cpu: m
  20. memory: Mi
  21. requests:
  22. cpu: m
  23. memory: Mi
  24. service:
  25. externalPort:
  26. internalPort:
  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:
  43. targetPort:
  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:
  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:
  69. livenessProbe:
  70. httpGet:
  71. path: /
  72. port:
  73. readinessProbe:
  74. httpGet:
  75. path: /
  76. port:
  77. resources:
  78. limits:
  79. cpu: m
  80. memory: Mi
  81. requests:
  82. cpu: m
  83. memory: Mi

我們可以看到Deployment和Service的名字前半截由兩個随機的單詞組成,最後才是我們在

values.yaml

中配置的值。

部署到kubernetes

mychart

目錄下執行下面的指令将nginx部署到kubernetes叢集上。

  1. helm install .
  2. NAME: eating-hound
  3. LAST DEPLOYED: Wed Oct : :
  4. NAMESPACE: default
  5. STATUS: DEPLOYED
  6. RESOURCES:
  7. ==> v1/Service
  8. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  9. eating-hound-mychart < none> /TCP s
  10. ==> extensions/v1beta1/Deployment
  11. NAME DESIRED CURRENT UP- TO- DATE AVAILABLE AGE
  12. eating-hound-mychart s
  13. NOTES:
  14. 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 :

現在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 :

在本地通路

http://127.0.0.1:8080

即可通路到nginx。

檢視部署的relaese

  1. $ helm list
  2. NAME REVISION UPDATED STATUS CHART NAMESPACE
  3. eating-hound Wed Oct : : DEPLOYED mychart 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,如果你要綁定到其它網絡接口,可使用以下指令:

$ 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 檔案中:

  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         A Helm chart for Kubernetes

依賴

我們可以在

requirement.yaml

中定義應用所依賴的chart,例如定義對

mariadb

的依賴:

  1. dependencies:
  2. - name: mariadb
  3. version: .
  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: .
  7. $ helm package mychart
  8. Successfully packaged chart and saved it to: /home/k8s/mychart- . .tgz
  • 查詢本地倉庫中的 Chart 資訊

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

  1. $ helm search mychart -l
  2. NAME          CHART VERSION APP VERSION DESCRIPTION
  3. local/mychart .         A Helm chart for Kubernetes
  4. local/mychart .         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 : :
  4. NAMESPACE: default
  5. STATUS: DEPLOYED
  6. RESOURCES:
  7. ==> v1/Pod(related)
  8. NAME                                READY   STATUS   RESTARTS  AGE
  9. mike- test-mychart d56f8c8c9-d685v   /    Running   m
  10. ==> v1/Service
  11. NAME               TYPE       CLUSTER-IP       EXTERNAL-IP  PORT(S)  AGE
  12. mike- test-mychart  ClusterIP    < none>       /TCP   m
  13. ==> v1beta2/Deployment
  14. NAME               DESIRED   CURRENT  UP- TO- DATE  AVAILABLE  AGE
  15. mike- test-mychart   m
  16. NOTES:
  17. 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 :

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

  1. $ helm list
  2. NAME      REVISION  UPDATED                   STATUS    CHART         NAMESPACE
  3. mike-test         Mon Jul : :  DEPLOYED  mychart- . 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.         Mon Jul : :  DEPLOYED    mychart Upgrade complete

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

  1. $ helm rollback mike- test
  2. Rollback was a success! Happy Helming!
注:其中的參數 1 是 helm history 檢視到 Release 的曆史記錄中 REVISION 對應的值。

最後,我們使用

helm list

helm 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.         Mon Jul : :  SUPERSEDED  mychart Upgrade complete
  8.         Mon Jul : :  DEPLOYED    mychart Rollback to

删除一個應用

如果需要删除一個已部署的 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         Mon Jul : :  DELETED mychart- . default

也可以使用

--deleted

參數來列出已經删除的 Release

  1. $ helm ls --deleted
  2. NAME      REVISION  UPDATED                   STATUS  CHART         NAMESPACE
  3. mike-test         Mon Jul : :  DELETED mychart- . 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.         Mon Jul : :  SUPERSEDED  mychart Upgrade complete
  5.         Mon Jul : :  DELETED     mychart 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     m
  8. wordpress- test-wordpress   m
  9. ==> v1/Pod(related)
  10. NAME                                       READY   STATUS   RESTARTS  AGE
  11. wordpress- test-mariadb b866bf95-n26ff     /    Running   m
  12. wordpress- test-wordpress ff8c64b6c-sgtvv   /    Running   m
  13. ==> v1/Secret
  14. NAME                       TYPE     DATA  AGE
  15. wordpress- test-mariadb     Opaque   m
  16. wordpress- test-wordpress   Opaque   m
  17. ==> v1/ConfigMap
  18. NAME                           DATA  AGE
  19. wordpress- test-mariadb         m
  20. wordpress- test-mariadb-tests   m
  21. ==> v1/Service
  22. NAME                       TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)                   AGE
  23. wordpress- test-mariadb    ClusterIP     < none>       /TCP                   m
  24. wordpress- test-wordpress  NodePort    < none>       : /TCP, : /TCP   m
  25. NOTES:
  26. 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. 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工作原理helm部署Helm Chart 結建構立自己的charthelm更新和回退一個應用使用Helm 部署 Wordpress應用執行個體Helm 其它使用技巧

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簡介helm簡介Helm 元件及相關術語Helm工作原理helm部署Helm Chart 結建構立自己的charthelm更新和回退一個應用使用Helm 部署 Wordpress應用執行個體Helm 其它使用技巧
  • 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: .
  4. repository: https: //kubernetes-charts.storage.googleapis.com/
  5. condition: mariadb.enabled
  6. tags:
  7. - wordpress-database
  8. - name: apache
  9. version: .
  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   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簡介

繼續閱讀