1. helm介绍
helm 是一个用于管理部署在kubernetes上的应用的工具
使用要求:一个Kubernetes集群
2.下载安装
Helm Github Download
Helm Huawei Source
按照自己的操作系统版本下载相应的helm压缩包
并将helm添加到环境变量中;
# 检查是否安装成功
helm version
3.创建一个example
helm create example-nginx && cd example-nginx
# 开启ingress 和 hpa 配置
sed -i 's/enabled: false/enabled: true/g' values.yaml
以下即为helm生成的example-nginx的配置文件,
原理:将变量书写在values.yaml配置文件中,在使用helm install时会将这些变量替换到templates下所有的yaml文件中并应用至Kubernetes.
values.yaml
templates/deployment.yaml
# 安装当前应用到Kubernetes
helm upgrade --install example-nginx .
# 查看安装的example-nginx 服务
helm list
# 查看当前helm部署的Pod和Service
kubectl get po,svc,ing | grep example
Note: 若你发现你的ingress的ingressclass字段值为空,请先安装一个ingress-nginx控制器
请参考运维开发实践 - Kubernetes - 从外部访问k8s服务第二章节
并 reinstall 上述 example-nginx Chart
# 访问该应用
curl http://192.168.31.175:30001 -H "Host: chart-example.local"
4. Helm基本命令
可自行按顺序执行以下命令(已测试过)
# (0) 该目录用于测试使用
mkdir -p ~/helm_test && cd ~/helm_test
# (1)搜索应用
helm search repo nginx
# (2)!!以下命令3选1!!,我们可以任意安装上述搜索出来的应用
# i.直接安装
helm install example-nginx bitnami/nginx
# ii.升级example-nginx应用,若该应用不存在则直接安装
helm upgrade --install example-nginx bitnami/nginx
# iii.或者我们创建自定义应用
helm create example-nginx && helm upgrade --install example-nginx ~/helm_test/example-nginx
#(3)查看example-nginx应用的状态
helm status example-nginx
#(4) 查看安装的应用
helm list
#(5) 导出example-nginx应用的变量配置(values.yaml)
helm show values example-nginx > ~/helm_test/values.yaml
# 修改该values.yaml变量配置文件并开启ingress 和 hpa 配置
sed -i 's/host: chart-example.local/host: liyuan-nginx.com/g' ~/helm_test/values.yaml
sed -i 's/enabled: false/enabled: true/g' ~/helm_test/values.yaml
# (6) 应用该配置
helm upgrade --install -f values.yaml example-nginx ~/helm_test/example-nginx
# 查看ingress host是否被修改
kubectl get ing
#(7) 查看example-nginx应用部署的历史版本
helm history example-nginx
#(8)回滚应用到某个指定版本
helm rollback example-nginx 1
# 查看回滚是否生效
kubectl get ing
# (9) 将example-ngnix应用打包
helm package ~/helm_test/example-nginx
# (10)安装该应用包
helm install example-nginx2 ~/helm_test/example-nginx-0.1.0.tgz
helm list
#(10) 卸载应用
helm uninstall example-nginx
helm uninstall example-nginx2
5. helm templates模板语法
通过
helm create example-nginx && cd example-nginx
创建的应用默认包含 deployment*1, hpa*1, ingress*1, serviceaccount*1, service*1, 但通常来说默认的应用配置往往无法满足我们的业务需求,我们需要对其进行定制化…
helm create example-nginx3 && helm upgrade --install example-nginx3 ./example-nginx3
# 获取变量替换后的yaml文件
helm template example-nginx3 > tmp.yaml
# 我们可以看出该文件是example-nginx3 应用的是templates目录下所有文件从values.yaml中进行变量替换的值
vim tmp.yaml
如果现有的模板文件满足你的需求,直接修改value.yaml即可;
反之,需要你直接修改模板文件
Note: .Values 代表values.yaml
5.1.for循环
# ~/helm_test/example-nginx/values.yaml 添加如下声明
...
host: liyuan.com
ingresses:
- ingress:
name: ing-liyuan01
path: /liyuan01
backend:
name: liyuan01-svc
port: 8001
- ingress:
name: ing-liyuan02
path: /liyuan02
backend:
name: liyuan02-svc
port: 8002
- ingress:
name: ing-liyuan03
path: /liyuan03
backend:
name: liyuan03-svc
port: 8003
...
“.” 代表当前正在被遍历的元素
"$"代表values.yaml的root值
# !/helm_test/example-nginx/templates/test.yaml
{{- if .Values.ingresses}}
{{- range $ing:=.Values.ingresses}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ .ingress.name }}
spec:
rules:
# 此处 $ 代表 values.yaml的root
# quote 表示打上引号
- host: {{ $.Values.host | quote}}
http:
paths:
- path: {{ .ingress.path }}
pathType: ImplementationSpecific
backend:
service:
name: {{ .ingress.backend.name }}
port:
number: {{ .ingress.backend.port }}
---
# 该end匹配 range 的结束
{{- end}}
# 该end匹配 if 的结束
{{- end}}
# 渲染该文件
#如下图可以看到我们在values.yaml中定义的3个ing都被渲染了
helm template example-nginx .
5.2. with toYaml直接使用我们声明的值
定义直接包含某段代码
# ~/helm_test/example-nginx/values.yaml
...
annotation_test:
nginx.ingress.kubernetes.io/rewrite-target: /$1
app: nginx-app-liyuan
...
使用我们声明的值
# ~/helm_test/example-nginx/template/test01.yaml
{{- if .Values.annotation_test}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingressName
{{- with .Values.annotation_test}}
annotations:
{{- toYaml . | nindent 4}}
{{- end}}
spec:
rules:
- host: liyuan.com
http:
paths:
- path: /liyuan
pathType: ImplementationSpecific
backend:
service:
name: liyuan-svc
port:
number: 80
{{- end}}
声明的annotation的值被直接渲染到了指定位置;
5.3. include使用我们在.tpl定义的值
在此处定义我们的值
# /root/helm_test/example-nginx/templates/_helpers.tpl
...
{{- define "app.owner" -}}
{{- printf "app.owner: liyuan"}}
{{- end}}
...
在此处使用我们的值
# /root/helm_test/example-nginx/templates/test02.yaml
{{- if .Values.annotation_test}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingressNameTest02
labels:
{{- include "app.owner" . | nindent 4}}
spec:
rules:
- host: liyuan.com
http:
paths:
- path: /liyuan
pathType: ImplementationSpecific
backend:
service:
name: liyuan-svc
port:
number: 80
---
{{- end}}
Reference
Helm Docs