这里记录的只是我们平常使用比较多的一些内置对象或者是函数,一般只需要掌握values,release、if…else,with,toYaml就足够使用了。
1.安装
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh
2.常用命令
helm
作用:查看helm基本操作命令
命令:helm
作用:查看helm的版本
命令:helm version
作用:查看环境变量
命令:helm env
作用:创建chart目录(含基本配置文件和目录)
命令:helm create chartName
举例:helm create abc
作用:将chart目录打包
命令:helm package chartDir
举例:helm package abc
说明:chartDir为chart目录
作用:渲染template目录下的模板文件(即将这些模板文件的字段内容用values.yaml填充,然后直接输出到终端)
命令:helm template chartName
举例:helm template abc
作用:根据关键字检索chart包
命令1:helm search repo keyword
举例1:helm search repo demo
命令2:helm search hub keyword
举例2:helm search hub demo
说明:上面2个命令仅仅在第3个字段有区别,repo表示在本地所添加的仓库中进行检索;hub表示在Helm Hub中进行检索。
作用:查看发布到k8s中的chart对应的release
命令:helm list
作用:上传chart到chart仓库
命令:helm push chart.tgz repoName
举例:helm push demo.tgz harbor-10.30.12.211 --username=admin --password=Harbor12345
说明:有些仓库是有账号密码验证的,所以需要加上账号、密码的参数(比如Harbor提供的chart仓库功能,可参考下面的私有仓库搭建先搭建一个私有仓库出来,再进行仓库相关命令的测试)
作用:从chart仓库中拉取chart到本地
命令:helm pull repoName/keyword
举例:helm pull harbor-10.30.12.211/demo
说明: harbor-10.30.12.211/demo的结构是本地起的仓库名/chart包的名字前缀,只要在harbor-10.30.12.211仓库中含有demo为前缀的chart包,就会被下载到本地
作用:检查chart包中的文件内容是否正确(即该chart包去k8s中是否能够成功安装部署)
命令:helm lint chartName
举例:helm lint demo-0.1.0.tgz
说明:包可以是chart目录、chart压缩包
作用:将chart包发布到k8s集群中安装部署
命令1:helm install releaseName chartName
举例1:helm install relDemo demo-0.1.0.tgz
说明1:releaseName为release的名字,chartName为chart包名,chart可以是未打包的chart,也可以是打包的chart,也可以是仓库中的chart。【chart和release的关系可以大致理解为程序和进程的关系,一个是静态的,一个是动态的】
命令2:helm install chartName --generate-name
举例2:helm install demo-0.1.0.tgz --generate-name
说明2:可以不指定release的名字,只需要指定–generate-name即可随机生成一个名字
验证:创建完后可以使用helm list查看是否有对应的release
作用:将部署到k8s中的release卸载掉
命令:helm uninstall releaseName
举例:helm uninstall relDemo
验证:卸载完后使用helm list查看relDemo是否被删除了,同时可以使用kubectl get pods查看相应的pod等与release相关的资源是否全部删除干净
作用:将部署到k8s中的release升级,即相当于应用升级
命令:helm upgrade releaseName chartName
举例:helm upgrade relDemo demo-1.0.0.tgz
说明:relName指定一个release,该release对应一个k8s中的应用,chartName指定一个chart包,整个过程为直接使用指定的chart包替换部署release。就helm而言release还是原来那个,不过对应的chart包被替换了。对k8s而言,仅仅是将原先资源删除,然后用新的chart包创建资源。
验证:使用helm list查看release的CHART字段是否更新,同时可以使用kubectl get pods查看相应的pod等与release相关的资源是否全部更新(看名字、运行时间)
作用:将release回退到前一个或若干个版本(k8s中会同步回退)
命令:helm rollback releaseName revision
举例:helm rollback relDemo 1
说明:revision为第几个版本,1表示第一个版本,2表示第二个版本,以此类推。通常回滚会搭配helm history releaseName使用,通过该命令查看所有的关于本release的发布历史,然后选择回退到哪个版本
验证:回滚成功后使用helm list查看该release的CHART和APP VERSION是否更新(具体得看chart中的chart.yaml中的version和appVersion有没有相应的修改),同时可以使用kubectl get pods查看相应的pod等与release相关的资源是否全部更新(看名字、运行时间)
作用:查看release的发布历史(包括安装、升级、回滚)
命令:helm history releaseName
举例:helm history relDemo
作用:查看release的基本信息
命令:helm status releaseName
举例:helm status relDemo
helm show
helm show查看chart的信息
作用:查看chart包中的chart.yaml文件内容
命令:helm show chart chartName
举例1:helm show chart demo
举例2:helm show chart demo.tgz
举例3:helm show chart harbor-10.30.12.211/demo
说明:chart包可以是本地的未打包的chart目录(即helm create 创建出来的chart目录),也可以是打包的chart压缩包(由helm package打包),也可以是保存在仓库中的chart包
作用:查看chart包中的values.yaml文件内容
命令:helm show values chartName
说明:包同上有3种选择
作用:查看chart包中README文件内容
命令:helm show readme chartName
说明:包同上有3种选择
作用:查看chart包中chart.yaml、values.yaml、README文件内容
命令:helm show all chartName
说明:包同上有3种选择
helm get
作用:查看release的说明信息(相当于chart中的NOTES.TXT)
命令:helm get notes releaseName
举例:helm get notes relDemo
作用:查看release在k8s中创建出来的资源
命令:helm get manifest releaseName
举例:helm get manifest relDemo
作用:查看release的回调创建资源
命令:helm get hooks releaseName
举例:helm get hooks relDemo
作用:查看release的values配置
命令:helm get values releaseName
举例:helm get values relDemo
作用:查看上述所有内容
命令:helm get all releaseName
举例:helm get all relDemo
helm plugin
作用:安装插件
命令:helm plugin install pluginURL
举例:helm plugin install https://github.com/chartmuseum/helm-push
说明:最后的url地址为插件的下载地址,可参考 https://github.com/chartmuseum/helm-push
作用:卸载插件
命令:helm plugin uninstall pluginName
举例:helm plugin uninstall push
作用:更新插件,将插件升级到最新版本
命令:helm plugin update pluginName
举例:helm plugin update push
说明:在下载插件的时候会保存插件及其下载地址,更新的时候使用原本的下载地址直接下载最新版本替换
helm repo
作用:查看添加的chart仓库,可在这些chart仓库中拉取chart(实际上就相当于一个应用的安装包)
命令:helm repo list
作用:本地添加chart仓库
命令:helm repo add repoName repoURL
举例:helm repo add stable http://mirror.azure.cn/kubernetes/charts/
说明:repoName是你自己起的一个名字,用来代表这个repoURL,后续操作仓库的命令中直接用repoName来代替repoURL,只要指定了repoName,就表示要去操作repoName指向的repoURL的仓库
作用:本地删除chart仓库
命令:helm repo remove repoName
举例:helm repo remove abc
作用:将本地所添加的chart仓库的最新信息缓存到本地
命令:helm repo update
说明:helm search命令是检索某仓库中的chart包,假设仓库中一开始是没有所指定的chart包,所以helm search是检索不到的。这时候如果将chart包上传至该仓库,本地需要执行一遍helm repo update以更新本地的缓存数据才能检索到该指定的chart,因为helm search就是读取本地缓存数据的
作用:根据指定仓库目录下的chart包生成index.yaml索引文件
命令:helm repo index repoDir --url=repoURL
举例:helm repo index repo --url=http://192.168.0.1:8080/
说明:repoDir指定一个仓库的目录,该目录用来存放chart包及索引文件index.yaml。url指定仓库的访问路径,生成的索引文件中会以该url为地址前缀拼接上chart包名作为chart包的访问路径
3.helm内置对象
Release
Release 对象描述了版本发布自身的一些信息。它包含了以下对象:
对象名称 | 描述 |
---|---|
.Release.Name | release 的名称 |
.Release.Namespace | release 的命名空间 |
.Release.IsUpgrade | 如果当前操作是升级或回滚的话,该值为 true |
.Release.IsInstall | 如果当前操作是安装的话,该值为 true |
.Release.Revision | 获取此次修订的版本号。初次安装时为 1,每次升级或回滚都会递增 |
.Release.Service | 获取渲染当前模板的服务名称。一般都是 Helm |
例子:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cm
data:
value1: {{ .Release.Name }}
value2: {{ .Release.Namespace }}
value3: {{ .Release.IsUpgrade }}
value4: {{ .Release.IsInstall }}
value5: {{ .Release.Revision }}
value6: {{ .Release.Service }}
Values
Values 对象描述的是 value.yaml 文件中的内容,默认为空。使用 Value 对象可以获取到 value.yaml 文件中已定义的任何数值
Value 键值对 | 获取方式 |
---|---|
name: aaron | .Values.name |
info: name: aaron | .Values.info.name |
例子:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cm
data:
username: {{ .Values.info.name }}
age: {{ .Values.info.age }}
Chart
Chart 对象用于获取 chart.yaml 文件中的内容:
对象名称 | 描述 |
---|---|
.Chart.Name | 获取 Chart 的名称 |
.Chart.Version | 获取 Chart 的版本 |
例子:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cm
data:
chartname: {{ .Chart.Name }}
chartversion: {{ .Chart.Version }}
Capabilities
Capabilities 对象提供了关于 Kubernetes 集群相关的信息。该对象有如下方法:
对象名称 | 描述 |
---|---|
.Capabilities.APIVersions | 返回 Kubernetes 集群 API 版本信息集合 |
.Capabilities.APIVersions.Has $version | 用于检测指定的版本或资源在 Kubernetes 集群中是否可用,例如 batch/v1 或 apps/v1/Deployment |
.Capabilities.KubeVersion 和 Capabilities.KubeVersion.Version | 都用于获取 Kubernetes 的版本号 |
.Capabilities.KubeVersion.Major | Kubernetes 的主版本号 |
.Capabilities.KubeVersion.Minor | Kubernetes 的小版本号 |
例子:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cm
data:
Apiversion: {{ .Capabilities.APIVersions }}
Healthcheck: {{ .Capabilities.APIVersions.Has $version }}
Kubernetes_release: {{ .Capabilities.KubeVersion }}
Kubernetes_Major: {{ .Capabilities.KubeVersion.Major }}
Kubernetes_Minor: {{ .Capabilities.KubeVersion.Minor }}
Template
Template 对象用于获取当前模板的信息,它包含如下两个对象:
对象名称 | 描述 |
---|---|
.Template.Name | 用于获取当前模板的名称和路径(例如:mychart/templates/mytemplate.yaml) |
.Template.BasePath | 用于获取当前模板的路径(例如:mychart/templates) |
例子:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cm
data:
path: {{ .Template.Name }}
basePath: {{ .Template.BasePath }}
4.helm3部署应用实战案例
使用helm安装nginx
目录结构
nginx/
├── charts
├── Chart.yaml
├── templates
│ ├── deploy.yaml
│ └── service.yaml
└── values.yaml
deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.AppName }}
spec:
selector:
matchLabels:
app: {{ .Values.AppName }}
replicas: {{ .Values.replicas }}
template:
metadata:
labels:
app: {{ .Values.AppName }}
spec:
containers:
- name: {{ .Values.AppName }}
image: {{ .Values.Image }}:{{ .Values.ImageTag }}
ports:
- containerPort: {{ .Values.containerPort }}
service
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.AppName }}
spec:
selector:
app: {{ .Values.AppName }}
ports:
- protocol: TCP
port: {{ .Values.containerPort }}
targetPort: {{ .Values.containerPort }}
nodePort: {{ .Values.nodePort }}
type: NodePort
values
AppName: 'nginx'
replicas: 2
Image: 'docker.io/library/nginx'
ImageTag: 'alpine'
containerPort: 80
nodePort: 32001
5.helm3内置函数
1.内置函数简单介绍
Quote | Squote
Quote:给获取到的value添加“”
Squote:给获取到的value添加''
模版函数
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cm
data:
username: {{ quote .Values.info.name }}
age: {{ squote .Values.info.age }}
管道
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cm
data:
username: {{ .Values.info.name | quote }}
age: {{ .Values.info.age | squote }}
Upper | Lower
Uppser:将获取的字符串全部转换为大写
Lower:将获取到的字符串全部转换为小写
模版函数
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cm
data:
username: {{ upper .Values.info.name }}
age: {{ lower .Values.info.age }}
管道
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cm
data:
username: {{ .Values.info.name | upper }}
age: {{ .Values.info.age | lower }}
repeat
将读取的字符串复制指定的的次数
模版函数
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cm
data:
username: {{ repeat 5 .Values.info.name }}
管道
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cm
data:
username: {{ .Values.info.name | repeat 5 }}
default
经常使用的一个函数是 default
:default DEFAULT_VALUE GIVEN_VALUE
。该功能允许在模板内部指定默认值,以防该值被省略。
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cm
data:
username: {{ .Values.info.name | default "lisi" }}
2.常用逻辑和流控制函数使用
比较:eq、ne、gt、ge、le、lt
逻辑判断:and、or、not
判断字符串是否为空:empty
coalesce:用于扫描一个给定的列表,并返回第一个非空的值
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cm
data:
username: {{ eq 2 2 }}
username: {{ ne 2 2 }}
username: {{ and .Values.info.name .Values.info.age }}
username: {{ or .Values.info.name .Values.info.age }}
num: {{ gt 1 2 }}
num: {{ lt 1 2 }}
sex: {{ empty "" }}
sex: {{ not "" }}
3.流程语句if…else、with
if…else
If…else用来设置开关,比如我们想实现对nodePort网络设置开关,当nodePort.enabled=true时才开启;
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.AppName }}
spec:
selector:
app: {{ .Values.AppName }}
ports:
- protocol: TCP
port: {{ .Values.containerPort }}
targetPort: {{ .Values.containerPort }}
{{- if .Values.nodePort.enable }}
nodePort: {{ .Values.nodePort.nodePort }}
type: NodePort
{{- end }}
with
将重复多次的值通过指定前缀简单获取
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cm
data:
{{- with .Values.people.info }}
name: {{ .name }}
sex: {{ .sex }}
{{- end }}
toYaml转yaml
indent num:缩进几行
nident num:换行之后缩进几行
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.AppName }}
spec:
selector:
matchLabels:
app: {{ .Values.AppName }}
replicas: {{ .Values.replicas }}
template:
metadata:
labels:
app: {{ .Values.AppName }}
spec:
containers:
- name: {{ .Values.AppName }}
image: {{ .Values.Image }}:{{ .Values.ImageTag }}
ports:
- containerPort: {{ .Values.containerPort }}
resources:
{{- toYaml .Values.resources | nindent 10 }}