系统环境:
- 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 nginx
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/nginx 5.1.1 1.16.1 Chart for the nginx server
bitnami/nginx-ingress-controller 5.2.2 0.26.2 Chart for the nginx Ingress controller
stable/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-lego
stable/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 << EOF
service.type: NodePort
service.nodePorts.http: 30002
EOF
应用更新
$ helm upgrade -f values.yaml nginx bitnami/nginx
查看新配置是否生效
$ helm get values nginx
USER-SUPPLIED VALUES:
service.nodePorts.http: 30002
service.type: NodePort
应用回滚
如果升级过程发生错误,进行回滚,首先查看应用的历史版本:
$ helm history nginx
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Sat Nov 23 17:40:40 2019 superseded nginx-4.3.13 1.16.1 Install complete
2 Sat Nov 23 17:44:44 2019 deployed nginx-4.3.13 1.16.1 Upgrade complete
知道 REVISION 号后就可以进行回滚操作:
$ helm rollback nginx 1
Rollback was a success! Happy Helming!
五、模板介绍
结构:
mychart/
Chart.yaml
values.yaml
charts/
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.yaml
name: hello-world
version: 1.0
EOF
# # 创建模板文件,用于生成 Kubernetes 资源清单(manifests)
$ mkdir ./templates
$ cat <<EOF >./templates/deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello-world
spec:
replicas: 1
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: hub.yangguoxiang.com/library/myapp:v1.0
ports:
- containerPort: 80
protocol: TCP
EOF
$ cat <<EOF >./templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: hello-world
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: hello-world
EOF
$ helm install hello-world .
NAME: hello-world
LAST DEPLOYED: Fri Jan 10 16:24:45 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
引入 values.yaml 规范
# # 配置配置文件 values.yaml
$ cat <<EOF >./values.yaml
image:
repository: hub.yangguoxiang.com/library/myapp
tag: v1.0
EOF
# # 这个文件中定义的值,在模板文件中可以通过 .Values 对象访问到
$ cat <<EOF >./templates/deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello-world
spec:
replicas: 1
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
ports:
- containerPort: 8080
protocol: TCP
EOF
# # 在 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 .