系统环境:
- 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 命令进行下载。
# # 下载Helm客户端$ wget https://get.helm.sh/helm-v3.0.2-linux-amd64.tar.gz$ helm repo add elastic https://helm.elastic.co$ helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts$ helm repo add bitnami https://charts.bitnami.com/bitnami$ helm search repo nginx
接下来解压下载的包,然后将客户端放置到 /usr/local/bin/ 目录下:
$ tar -zxvf helm-v3.0.2-linux-amd64.tar.gz$ cp linux-amd64/helm /usr/local/bin/
注意:helm 客户端需要下载到安装了 kubectl 并且能执行能正常通过 kubectl 操作 kubernetes 的服务器上,否则 helm 将不可用。
三、添加 Chart 仓库
在 Helm 3.0 版本中,默认是不会添加 Chart 仓库,所以这里我们需要手动添加,下面是添加一些常用的 Charts 库,命令如下:
# # $ helm repo add stable https://kubernetes-charts.storage.googleapis.com$ helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts$ helm repo add elastic https://helm.elastic.co$ helm repo add bitnami https://charts.bitnami.com/bitnami$ helm repo add gitlab https://charts.gitlab.io$ helm repo add harbor https://helm.goharbor.io$ helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com
增加完仓库后,需要执行更新命令,将仓库中的信息进行同步:
$ helm repo update
注意:如果有的仓库不能正常解析,请更换 DNS 地址,在测试过程中,发现有的能正常解析,有的不能。如果还不行,就直接将域名和对应的地址写死在 Host 文件中。
四、Helm 的基本操作
安装应用
通过 Helm 在 Repo 中查询可安装的 Redis 包:
$ helm search repo nginxNAME CHART VERSION APP VERSION DESCRIPTIONbitnami/nginx 5.1.1 1.16.1 Chart for the nginx serverbitnami/nginx-ingress-controller 5.2.2 0.26.2 Chart for the nginx Ingress controllerstable/nginx-ingress 0.9.5 0.10.2 An nginx Ingress controller that uses ConfigMap...stable/nginx-lego 0.3.1 Chart for nginx-ingress-controller and kube-legostable/gcloud-endpoints 0.1.0 Develop, deploy, protect and monitor your APIs ...
安装测试:
$ helm install nginx bitnami/nginx
查看应用状态
$ helm status nginx
卸载应用
卸载应用,并保留安装记录
$ helm uninstall nginx --keep-history
查看全部应用(包含安装和卸载的应用)
$ helm list --all
卸载应用,不保留安装记录
$ helm uninstall nginx
升级应用
创建新的配置
$ cat > values.yaml << EOFservice.type: NodePortservice.nodePorts.http: 30002EOF
应用更新
$ helm upgrade -f values.yaml nginx bitnami/nginx
查看新配置是否生效
$ helm get values nginxUSER-SUPPLIED VALUES:service.nodePorts.http: 30002service.type: NodePort
应用回滚
如果升级过程发生错误,进行回滚,首先查看应用的历史版本:
$ helm history nginxREVISION UPDATED STATUS CHART APP VERSION DESCRIPTION1 Sat Nov 23 17:40:40 2019 superseded nginx-4.3.13 1.16.1 Install complete2 Sat Nov 23 17:44:44 2019 deployed nginx-4.3.13 1.16.1 Upgrade complete
知道 REVISION 号后就可以进行回滚操作:
$ helm rollback nginx 1Rollback was a success! Happy Helming!
五、模板介绍
结构:
mychart/Chart.yamlvalues.yamlcharts/templates/...
该templates/目录用于模板文件。当Helm评估图表时,它将templates/通过模板渲染引擎发送目录中的所有文件。然后,它将收集这些模板的结果并将其发送到Kubernetes。
该values.yaml文件对模板也很重要。该文件包含图表的 默认值。在helm install或期间,用户可能会覆盖这些值 helm upgrade。
该Chart.yaml文件包含对图表的描述。您可以从模板中访问它。该charts/目录可能包含其他图表(我们称为subcharts)。在本指南的后面,我们将看到模板渲染时它们如何工作。
六、第一个自定义模板
固定语法
# # 创建文件夹$ mkdir ./hello-world$ cd ./hello-world
# # 创建自描述文件 Chart.yaml,这个文件必须有 name 和 version 定义$ cat <<EOF >./Chart.yamlname: hello-worldversion: 1.0EOF
# # 创建模板文件,用于生成 Kubernetes 资源清单(manifests)$ mkdir ./templates$ cat <<EOF >./templates/deployment.yamlapiVersion: extensions/v1beta1kind: Deploymentmetadata:name: hello-worldspec:replicas: 1template:metadata:labels:app: hello-worldspec:containers:- name: hello-worldimage: hub.yangguoxiang.com/library/myapp:v1.0ports:- containerPort: 80protocol: TCPEOF$ cat <<EOF >./templates/service.yamlapiVersion: v1kind: Servicemetadata:name: hello-worldspec:type: NodePortports:- port: 80targetPort: 80protocol: TCPselector:app: hello-worldEOF
$ helm install hello-world .NAME: hello-worldLAST DEPLOYED: Fri Jan 10 16:24:45 2020NAMESPACE: defaultSTATUS: deployedREVISION: 1TEST SUITE: None
引入 values.yaml 规范
# # 配置配置文件 values.yaml$ cat <<EOF >./values.yamlimage:repository: hub.yangguoxiang.com/library/myapptag: v1.0EOF
# # 这个文件中定义的值,在模板文件中可以通过 .Values 对象访问到$ cat <<EOF >./templates/deployment.yamlapiVersion: extensions/v1beta1kind: Deploymentmetadata:name: hello-worldspec:replicas: 1template:metadata:labels:app: hello-worldspec:containers:- name: hello-worldimage: {{ .Values.image.repository }}:{{ .Values.image.tag }}ports:- containerPort: 8080protocol: TCPEOF
# # 在 values.yaml 中的值可以被部署 release 时用到的参数# # --values YAML_FILE_PATH 或 --set key1=value1, key2=value2 覆盖掉$ helm install --set image.tag='v3.0' hello-world .# 升级版本$ helm upgrade -f values.yaml hello-world .
