Helm是Kubernetes的包管理工具,类似于Linux系统中常用的apt、yum等包管理工具。使用Helm可以简化Kubernetes应用的部署。
Chart Install过程:
Chart Update过程:
Helm包括helm客户端和Tiller服务端两部分,Tiller部署在Kubernetes集群中。
可以根据自己的环境从GitHub地址下载对应的安装包:
例如:
下载后解压到自己喜欢的目录,然后配置对应的PATH环境变量。
默认情况下,Helm操作Kubernetes集群需要借助kubectl命令的集群配置。也可以直接给Helm命令指定--kubeconfig
参数指定Kubernetes集群证书路径。
# 通过--kubeconfig参数指定Kubernetes证书的方式操作Kubernetes集群
# 下面命令是部署一个名字叫app-demo的应用,Helm包在./chart目录中
/alidata/server/helm-v2.13.1/helm --kubeconfig ./config/k8s.conf install app-demo ./chart
使用helm init
命令,可以一键安装Tiller。
以制作一个简单的网站应用Chart包为例介绍Helm的基本用法。
通过helm create
命令创建一个新的chart包。
例子:
# 在当前目录创建一个myapp chart包
helm create myapp
创建完成后,得到的目录结构如下:
myapp - chart包目录名
├── charts - 依赖的子包目录,里面可以包含多个依赖的chart包
├── Chart.yaml - chart定义,可以定义chart的名字,版本号信息。
├── templates - k8s配置模版目录,我们编写的k8s配置都在这个目录,除了NOTES.txt和下划线开头命名的文件,其他文件可以随意命名。
│ ├── deployment.yaml
│ ├── _helpers.tpl - 下划线开头的文件,helm视为公共库定义文件,主要用于定义通用的子模版、函数等,helm不会将这些公共库文件的渲染结果提交给k8s处理。
│ ├── ingress.yaml
│ ├── NOTES.txt - chart包的帮助信息文件,执行helm install命令安装成功后会输出这个文件的内容。
│ └── service.yaml
└── values.yaml - chart包的参数配置文件,模版可以引用这里的参数。
为了演示chart包模版的用法,我们先把deployment.yaml
、service.yaml
、ingress.yaml
三个配置文件的内容清空,重新编写Kubernetes部署文件。
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: myapp # deployment应用名
labels:
app: myapp # deployment应用标签定义
spec:
replicas: 1 # pod副本数
selector:
matchLabels:
app: myapp # pod选择器标签
template:
metadata:
labels:
app: myapp # pod标签定义
spec:
containers:
- name: myapp # 容器名
image: xxxxxx:1.7.9 # 镜像地址
ports:
- name: http
containerPort: 80
protocol: TCP
apiVersion: v1
kind: Service
metadata:
name: myapp-svc # 服务名
spec:
selector: # pod选择器定义
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 80
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: myapp-ingress # ingress应用名
spec:
rules:
- host: www.xxxxx.com # 域名
http:
paths:
- path: /
backend:
serviceName: myapp-svc # 服务名
servicePort: 80
# 域名
host: www.XXX.com
# 镜像参数
image: XXXXXXXXXXXXXXXXXX
imageTag: 1.7.9
# pod 副本数
replicas: 1
# 命令格式: helm install chart包目录
helm install --set replicas=2 --set host=www.xxxx.com ./myapp
# 命令格式: helm upgrade release名字 chart包目录
helm upgrade myapp ./myapp
也可以指定--set
参数:
helm upgrade --set replicas=2 --set host=www.xxxx.com myapp ./myapp
默认情况下,如果release名字不存在,upgrade会失败,可以加上-i
参数当release不存在的时候则安装,存在则更新,将install和upgrade命令合并。
helm upgrade -i --set replicas=2 --set host=www.xxxx.com myapp ./myapp
模版表达式:{{ 模版表达式 }}
模版表达式:{{- 模版表达式 -}}
,表示去掉表达式输出结果前面和后面的空格。
默认情况点(.
), 代表全局作用域,用于引用全局对象。
例子:
{{ .Values.key }}
helm全局作用域中有两个重要的全局对象:Values和Release
Values代表的就是values.yaml定义的参数,通过.Values
可以引用任意参数。
Release代表一次应用发布,下面是Release对象包含的属性字段:
例子:
{{ .Release.Name }}
除了系统自带的变量,我们自己也可以自定义模版变量。
调用函数的语法:{{ functionName arg1 arg2... }}
例子:
{{ quote .Values.favorite.food }}
管道(pipelines)运算符 |
{{ .Values.favorite.food | quote }}
常用的关系运算符>、 >=、 <、!=、与或非在helm模版中都以函数的形式实现。
关系运算函数定义:
eq
相当于 =ne
相当于 !=lt
相当于 <gt
相当于 >and
相当于 &&or
相当于 ||not
相当于 !例子:
{{ if and .Values.fooString (eq .Values.fooString "foo") }}
{{ ... }}
{{ end }}
语法:
{{ if 条件表达式 }}
# Do something
{{ else if 条件表达式 }}
# Do something else
{{ else }}
# Default case
{{ end }}
例子:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | default "tea" | quote }}
food: {{ .Values.favorite.food | upper | quote }}
{{if eq .Values.favorite.drink "coffee"}}
mug: true
{{end}}
with
with
主要就是用来修改.
作用域的,默认.
代表全局作用域,with
语句可以修改.
的含义.
语法:
{{ with 引用的对象 }}
这里可以使用 . (点),直接引用with指定的对象
{{ end }}
例子:
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
{{- end }}
range
range
主要用于循环遍历数组类型。
语法1:
{{- range $key, $val := 键值对象 }}
{{ $key }}: {{ $val | quote }}
{{- end}}
语法2:
{{- range 数组 }}
{{ . | title | quote }}
{{- end }}
例子:
# values.yaml定义
# map类型
favorite:
drink: coffee
food: pizza
# 数组类型
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
map类型遍历例子:
{{- range $key, $val := .Values.favorite }}
{{ $key }}: {{ $val | quote }}
{{- end}}
数组类型遍历例子:
{{- range .Values.pizzaToppings}}
{{ . | quote }}
{{- end}}
我们可以在_
(下划线)开头的文件中定义子模版,方便后续复用。
子模版语法:
定义模版
{{ define "模版名字" }} 模版内容 {{ end }}
引用模版:
{{ include "模版名字" 作用域}}
例子:
# 模版定义
{{- define "mychart.app" }}
app_name: {{ .Chart.Name }}
app_version: "{{ .Chart.Version }}+{{ .Release.Time.Seconds }}"
{{- end }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
labels:
{{ include "mychart.app" . | nindent 4 }}
data:
myvalue: "Hello World"
编写好chart包的模版之后,我们可以给helm命令加上--debug
、--dry-run
两个参数,让helm输出模版结果,但是不把模版输出结果交给k8s处理。
例子:
helm upgrade --debug --dry-run -i --set replicas=2 --set host=www.xxxx.com myapp ./myapp
如果您喜欢我的文章,请点击下面按钮随意打赏,您的支持是我最大的动力。
最新评论