kubernetes之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工作原理

https://www.kubernetes.org.cn/img/2018/05/20180111160842.jpg

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-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:v9.1  --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
  3.  
  4. # 创建TLS认证服务端,参考地址:https://github.com/gjmzj/kubeasz/blob/master/docs/guide/helm.md
  5. 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.  
  4. $ helm version
  5. Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
  6. 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.  
  3. NAME                            CHART VERSION   APP VERSION     DESCRIPTION                                      
  4. stable/acs-engine-autoscaler    2.1.3           2.1.1           Scales worker nodes within agent pools           
  5. stable/aerospike                0.1.7           v3.14.1.2       A Helm chart for Aerospike in Kubernetes         
  6. stable/anchore-engine           0.1.3           0.1.6           Anchore container analysis and policy evaluatio...
  7. stable/artifactory              0.3           5.8.4           Universal Repository Manager supporting all maj...
  8. stable/artifactory-ha           0.1.0           5.8.4           Universal Repository Manager supporting all maj...
  9. stable/aws-cluster-autoscaler   0.3.2                           Scales worker nodes within autoscaling groups.
  10. ... ...

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=truerbac.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.  
  6. # custom-repos.yaml 内容
  7. cat custom-repos.yaml
  8.  
  9. api:
  10.   config:
  11.     repos:
  12.       - name: stable
  13.         url: https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts
  14.         source: https://github.com/kubernetes/charts/tree/master/stable
  15.       - name: incubator
  16.         url: https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator
  17.         source: https://github.com/kubernetes/charts/tree/master/incubator
  18.       - name: monocular
  19.         url: https://kubernetes-helm.github.io/monocular
  20.         source: https://github.com/kubernetes-helm/monocular/tree/master/charts

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

  1. helm list
  2.  
  3. NAME                REVISION    UPDATED                     STATUS      CHART               NAMESPACE
  4. amber-seal          1           Mon Jul  2 17:29:25 2018    DEPLOYED    nginx-ingress-0.9.5 default 
  5. my-release          1           Mon Jul  2 15:19:44 2018    DEPLOYED    spark-0.1.10        default 
  6. nonplussed-panther  1           Mon Jul  2 17:27:41 2018    FAILED      nginx-ingress-0.9.5 default 
  7. 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 2http://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: [可选] 一个SVGPNG格式的图片地址

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.  
  6. # 去除test模版头部的第一个空行
  7. {{- template "test" }}

用于yaml文件前置空格的语法:

  1. # 这种方式定义的模版,会去除test模版头部和尾部所有的空行
  2. {{- define "test" -}}
  3. 模版内容
  4. {{- end -}}
  5.  
  6. # 可以在test模版每一行的头部增加4个空格,用于yaml文件的对齐
  7. {{ 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.  
  13. 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配置。该输出中包含了模板的变量配置与最终渲染的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.  
  12. COMPUTED VALUES:
  13. image:
  14.   pullPolicy: IfNotPresent
  15.   repository: harbor-001.jimmysong.io/library/nginx
  16.   tag: 1.9
  17. replicaCount: 1
  18. resources:
  19.   limits:
  20.     cpu: 100m
  21.     memory: 128Mi
  22.   requests:
  23.     cpu: 100m
  24.     memory: 128Mi
  25. service:
  26.   externalPort: 80
  27.   internalPort: 80
  28.   name: nginx
  29.   type: ClusterIP
  30.  
  31. HOOKS:
  32. MANIFEST:
  33.  
  34. ---
  35. # Source: mychart/templates/service.yaml
  36. apiVersion: v1
  37. kind: Service
  38. metadata:
  39.   name: filled-seahorse-mychart
  40.   labels:
  41.     chart: "mychart-0.1.0"
  42. spec:
  43.   type: ClusterIP
  44.   ports:
  45.   - port: 80
  46.     targetPort: 80
  47.     protocol: TCP
  48.     name: nginx
  49.   selector:
  50.     app: filled-seahorse-mychart
  51.  
  52. ---
  53. # Source: mychart/templates/deployment.yaml
  54. apiVersion: extensions/v1beta1
  55. kind: Deployment
  56. metadata:
  57.   name: filled-seahorse-mychart
  58.   labels:
  59.     chart: "mychart-0.1.0"
  60. spec:
  61.   replicas: 1
  62.   template:
  63.     metadata:
  64.       labels:
  65.         app: filled-seahorse-mychart
  66.     spec:
  67.       containers:
  68.       - name: mychart
  69.         image: "harbor-001.jimmysong.io/library/nginx:1.9"
  70.         imagePullPolicy: IfNotPresent
  71.         ports:
  72.         - containerPort: 80
  73.         livenessProbe:
  74.           httpGet:
  75.             path: /
  76.             port: 80
  77.         readinessProbe:
  78.           httpGet:
  79.             path: /
  80.             port: 80
  81.         resources:
  82.             limits:
  83.               cpu: 100m
  84.               memory: 128Mi
  85.             requests:
  86.               cpu: 100m
  87.               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.  
  7. RESOURCES:
  8. ==> v1/Service
  9. NAME                  CLUSTER-IP     EXTERNAL-IP  PORT(S)  AGE
  10. eating-hound-mychart  254.135.68  <none>       80/TCP   0s
  11.  
  12. ==> extensions/v1beta1/Deployment
  13. NAME                  DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
  14. eating-hound-mychart  1        1        1           0          0s
  15.  
  16.  
  17. NOTES:
  18. 1. Get the application URL by running these commands:
  19.   export POD_NAME=$(kubectl get pods --namespace default -l "app=eating-hound-mychart" -o jsonpath="{.items[0].metadata.name}")
  20.   echo "Visit http://127.0.0.1:8080 to use your application"
  21.   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.  
  8. $ helm package mychart
  9. 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.  
  7. RESOURCES:
  8. ==> v1/Pod(related)
  9. NAME                                READY  STATUS   RESTARTS  AGE
  10. mike-test-mychart-6d56f8c8c9-d685v  1/1    Running  0         9m
  11.  
  12. ==> v1/Service
  13. NAME               TYPE       CLUSTER-IP      EXTERNAL-IP  PORT(S)  AGE
  14. mike-test-mychart  ClusterIP  10.254.120.177  <none>       80/TCP   9m
  15.  
  16. ==> v1beta2/Deployment
  17. NAME               DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
  18. mike-test-mychart  1        1        1           1          9m
  19.  
  20. NOTES:
  21. 1. Get the application URL by running these commands:
  22. export POD_NAME=$(kubectl get pods --namespace default -l "app=mychart,release=mike-test" -o jsonpath="{.items[0].metadata.name}")
  23. echo "Visit http://127.0.0.1:8080 to use your application"
  24. 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 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.  
  5. $ helm history mike-test
  6. REVISION  UPDATED                   STATUS      CHART         DESCRIPTION
  7. 1         Mon Jul 23 10:41:20 2018  SUPERSEDED  mychart-0.1.0 Install complete
  8. 2         Mon Jul 23 10:50:25 2018  SUPERSEDED  mychart-0.2.0 Upgrade complete
  9. 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.  
  4. # helm ls 命令也已均无查询记录。
  5. $ helm ls --deleted
  6. $ 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.  
  3. NAMESPACE: default
  4. STATUS: DEPLOYED
  5.  
  6. RESOURCES:
  7. ==> v1beta1/Deployment
  8. NAME                      DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
  9. wordpress-test-mariadb    1        1        1           1          26m
  10. wordpress-test-wordpress  1        1        1           1          26m
  11.  
  12. ==> v1/Pod(related)
  13. NAME                                       READY  STATUS   RESTARTS  AGE
  14. wordpress-test-mariadb-84b866bf95-n26ff    1/1    Running  1         26m
  15. wordpress-test-wordpress-5ff8c64b6c-sgtvv  1/1    Running  6         26m
  16.  
  17. ==> v1/Secret
  18. NAME                      TYPE    DATA  AGE
  19. wordpress-test-mariadb    Opaque  2     26m
  20. wordpress-test-wordpress  Opaque  2     26m
  21.  
  22. ==> v1/ConfigMap
  23. NAME                          DATA  AGE
  24. wordpress-test-mariadb        1     26m
  25. wordpress-test-mariadb-tests  1     26m
  26.  
  27. ==> v1/Service
  28. NAME                      TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)                   AGE
  29. wordpress-test-mariadb    ClusterIP  10.254.99.67   <none>       3306/TCP                  26m
  30. wordpress-test-wordpress  NodePort   10.254.175.16  <none>       80:8563/TCP,443:8839/TCP  26m
  31.  
  32. NOTES:
  33. 1. Get the WordPress URL:
  34.  
  35. Or running:
  36.  
  37. export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services wordpress-test-wordpress)
  38. export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
  39. echo http://$NODE_IP:$NODE_PORT/admin
  40.  
  41. 2. Login with the following credentials to see your blog
  42.  
  43. echo Username: user
  44. 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.  
  7. # 生成 Wordpress 管理帐号和密码
  8. $ echo Username: user
  9. Username: user
  10. $ echo Password: $(kubectl get secret --namespace default wordpress-test-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)
  11. Password: 9jEXJgnVAY

给一张访问效果图吧:

https://img-blog.csdn.net/20180927094155852?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jid2FuZ2o=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

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.  
  4. # Bitnami Library for Kubernetes
  5. https://github.com/bitnami/charts
  6.  
  7. # Openstack-Helm
  8. https://github.com/att-comdev/openstack-helm
  9. https://github.com/sapcc/openstack-helm
  10.  
  11. # Tick-Charts
  12. https://github.com/jackzampolin/tick-charts
  • Helm 如何结合 CI/CD ?

采用 Helm 可以把零散的 Kubernetes 应用配置文件作为一个 Chart 管理,Chart 源码可以和源代码一起放到 Git 库中管理。通过把 Chart 参数化,可以在测试环境和生产环境采用不同的 Chart 参数配置。

下图是采用了 Helm 的一个 CI/CD 流程

https://img-blog.csdn.net/20180927100211355?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jid2FuZ2o=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

  • 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

                                                                                                                                                                               转载 菲宇的文章

你可能感兴趣的:(运维技术)