系统环境:

  • Helm 版本:v3.0.2
  • Kubernetes 版本:v1.15.1

参考地址:

一、Helm 介绍

Helm 是一款能够帮助你管理 Kubernetes 应用的程序,它可以让你创建自己的应用模板(chart),然后模板来创建配置很多可自定义参数,每次我们只需要设定很少或者不设置参数(使用默认参数)就可以将应用部署到Kubernetes 中,后期就可以通过 Helm 来进行升级、回滚、删除等等操作的管理。

Helm 的 Charts 类似于应用商店,里面存有很多公司提供不同应用的模板,例如常部署的 Redis、Mysql、Nginx 等等,可以让我们很方便的采用别人的模板,然后进行一定的配置,就能在我们的 Kubernetes 集群中创建对应的应用。

Helm 还经常与 CI\CD 配置使用,在这个过程中用于维护应用程序的安装、升级、回滚等操作。

如上,现在学习如何安装、使用 Helm,已经是学习如何使用 Kubernetes 的重要部分了,下面将记录一下这个安装过程。

二、下载并安装 Helm 客户端

访问 Helm Github 下载页面 https://github.com/helm/helm/releases 找到最新的客户端,里面有不同系统下的包,这里我们选择 Linux amd64,然后在 Linux 系统中使用 wget 命令进行下载。

  1. # # 下载Helm客户端
  2. $ wget https://get.helm.sh/helm-v3.0.2-linux-amd64.tar.gz
  3. $ helm repo add elastic https://helm.elastic.co
  4. $ helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
  5. $ helm repo add bitnami https://charts.bitnami.com/bitnami
  6. $ helm search repo nginx

接下来解压下载的包,然后将客户端放置到 /usr/local/bin/ 目录下:

  1. $ tar -zxvf helm-v3.0.2-linux-amd64.tar.gz
  2. $ cp linux-amd64/helm /usr/local/bin/

注意:helm 客户端需要下载到安装了 kubectl 并且能执行能正常通过 kubectl 操作 kubernetes 的服务器上,否则 helm 将不可用。

三、添加 Chart 仓库

在 Helm 3.0 版本中,默认是不会添加 Chart 仓库,所以这里我们需要手动添加,下面是添加一些常用的 Charts 库,命令如下:

  1. # # $ helm repo add stable https://kubernetes-charts.storage.googleapis.com
  2. $ helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
  3. $ helm repo add elastic https://helm.elastic.co
  4. $ helm repo add bitnami https://charts.bitnami.com/bitnami
  5. $ helm repo add gitlab https://charts.gitlab.io
  6. $ helm repo add harbor https://helm.goharbor.io
  7. $ helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com

增加完仓库后,需要执行更新命令,将仓库中的信息进行同步:

  1. $ helm repo update

注意:如果有的仓库不能正常解析,请更换 DNS 地址,在测试过程中,发现有的能正常解析,有的不能。如果还不行,就直接将域名和对应的地址写死在 Host 文件中。

四、Helm 的基本操作

安装应用

通过 Helm 在 Repo 中查询可安装的 Redis 包:

  1. $ helm search repo nginx
  2. NAME CHART VERSION APP VERSION DESCRIPTION
  3. bitnami/nginx 5.1.1 1.16.1 Chart for the nginx server
  4. bitnami/nginx-ingress-controller 5.2.2 0.26.2 Chart for the nginx Ingress controller
  5. stable/nginx-ingress 0.9.5 0.10.2 An nginx Ingress controller that uses ConfigMap...
  6. stable/nginx-lego 0.3.1 Chart for nginx-ingress-controller and kube-lego
  7. stable/gcloud-endpoints 0.1.0 Develop, deploy, protect and monitor your APIs ...

安装测试:

  1. $ helm install nginx bitnami/nginx

查看应用状态

  1. $ helm status nginx

卸载应用

卸载应用,并保留安装记录

  1. $ helm uninstall nginx --keep-history

查看全部应用(包含安装和卸载的应用)

  1. $ helm list --all

卸载应用,不保留安装记录

  1. $ helm uninstall nginx

升级应用

创建新的配置

  1. $ cat > values.yaml << EOF
  2. service.type: NodePort
  3. service.nodePorts.http: 30002
  4. EOF

应用更新

  1. $ helm upgrade -f values.yaml nginx bitnami/nginx

查看新配置是否生效

  1. $ helm get values nginx
  2. USER-SUPPLIED VALUES:
  3. service.nodePorts.http: 30002
  4. service.type: NodePort

应用回滚

如果升级过程发生错误,进行回滚,首先查看应用的历史版本:

  1. $ helm history nginx
  2. REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
  3. 1 Sat Nov 23 17:40:40 2019 superseded nginx-4.3.13 1.16.1 Install complete
  4. 2 Sat Nov 23 17:44:44 2019 deployed nginx-4.3.13 1.16.1 Upgrade complete

知道 REVISION 号后就可以进行回滚操作:

  1. $ helm rollback nginx 1
  2. Rollback was a success! Happy Helming!

五、模板介绍

结构:

  1. mychart/
  2. Chart.yaml
  3. values.yaml
  4. charts/
  5. templates/
  6. ...

templates/目录用于模板文件。当Helm评估图表时,它将templates/通过模板渲染引擎发送目录中的所有文件。然后,它将收集这些模板的结果并将其发送到Kubernetes。

values.yaml文件对模板也很重要。该文件包含图表的 默认值。在helm install或期间,用户可能会覆盖这些值 helm upgrade

Chart.yaml文件包含对图表的描述。您可以从模板中访问它。该charts/目录可能包含其他图表(我们称为subcharts)。在本指南的后面,我们将看到模板渲染时它们如何工作。

六、第一个自定义模板

固定语法

  1. # # 创建文件夹
  2. $ mkdir ./hello-world
  3. $ cd ./hello-world
  1. # # 创建自描述文件 Chart.yaml,这个文件必须有 name 和 version 定义
  2. $ cat <<EOF >./Chart.yaml
  3. name: hello-world
  4. version: 1.0
  5. EOF
  1. # # 创建模板文件,用于生成 Kubernetes 资源清单(manifests)
  2. $ mkdir ./templates
  3. $ cat <<EOF >./templates/deployment.yaml
  4. apiVersion: extensions/v1beta1
  5. kind: Deployment
  6. metadata:
  7. name: hello-world
  8. spec:
  9. replicas: 1
  10. template:
  11. metadata:
  12. labels:
  13. app: hello-world
  14. spec:
  15. containers:
  16. - name: hello-world
  17. image: hub.yangguoxiang.com/library/myapp:v1.0
  18. ports:
  19. - containerPort: 80
  20. protocol: TCP
  21. EOF
  22. $ cat <<EOF >./templates/service.yaml
  23. apiVersion: v1
  24. kind: Service
  25. metadata:
  26. name: hello-world
  27. spec:
  28. type: NodePort
  29. ports:
  30. - port: 80
  31. targetPort: 80
  32. protocol: TCP
  33. selector:
  34. app: hello-world
  35. EOF
  1. $ helm install hello-world .
  2. NAME: hello-world
  3. LAST DEPLOYED: Fri Jan 10 16:24:45 2020
  4. NAMESPACE: default
  5. STATUS: deployed
  6. REVISION: 1
  7. TEST SUITE: None

引入 values.yaml 规范

  1. # # 配置配置文件 values.yaml
  2. $ cat <<EOF >./values.yaml
  3. image:
  4. repository: hub.yangguoxiang.com/library/myapp
  5. tag: v1.0
  6. EOF
  1. # # 这个文件中定义的值,在模板文件中可以通过 .Values 对象访问到
  2. $ cat <<EOF >./templates/deployment.yaml
  3. apiVersion: extensions/v1beta1
  4. kind: Deployment
  5. metadata:
  6. name: hello-world
  7. spec:
  8. replicas: 1
  9. template:
  10. metadata:
  11. labels:
  12. app: hello-world
  13. spec:
  14. containers:
  15. - name: hello-world
  16. image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
  17. ports:
  18. - containerPort: 8080
  19. protocol: TCP
  20. EOF
  1. # # 在 values.yaml 中的值可以被部署 release 时用到的参数
  2. # # --values YAML_FILE_PATH 或 --set key1=value1, key2=value2 覆盖掉
  3. $ helm install --set image.tag='v3.0' hello-world .
  4. # 升级版本
  5. $ helm upgrade -f values.yaml hello-world .