Helm
Kubernetes包管理器 - Helm
概述
- 功能就像YUM/APT(主要解决依赖问题)
- 如何将Deployment、ConfigMap、Service、Ingress等服务器作为一个整体管理
- 这些资源文件如何高效复用
- 不支持应用级别的版本管理
重要概念
- Helm:一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理
- Chart:应用描述,一些列用于描述k8s资源相关文件的集合
- Release:基于Chart的部署实体,一个Chart被Helm运行后将会生成对应的一个Release,将在K8s中创建出真实运行的资源对象
Helm v3变化(2019.11发布第一个Helm稳定版本)
架构变化
Tiller的删除(之前是作为Pod去部署的)
Release名称可以在不同命名空间重用
支持讲Chart推送至Docker镜像仓库中
使用JSONSchema验证chart values
Others
- 更名
helm delete -> helm uninstall
helm inspect -> helm show
helm fetch -> helm pull
- 移除了用于本地临时搭建char Respository的helm serve命令
- 自动创建命名空间(helm2会自动创建命名空间,helm3遵循其他Kubernetes对象的行为,不存在则返回错误)
- 不在需要requirements.yaml,依赖关系是直接在char.yaml中定义
配置Chart仓库
- 微软仓库(http://mirror.azure.cn/kubernetes/charts/)很完善,推荐
- 阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts)
- 官方仓库(https://hub.kubeapps.com/charts/incubator)官方chart仓库
- 添加存储库
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update
- 查看配置的存储库
helm repo list
helm search repo mysql
helm search repo aliyun mysql
- 一直在stable存储库中安装charts,你可以配置其他存储库
- 删除存储库
helm repo remove aliyun
Helm基本使用
- chart install
- chart upgrade
- chart rollback
使用chart部署一个应用
- 查找chart
helm search repo
helm search repo mysql
- 查看chart信息
helm show chart stable/mysql
helm show values stable/mysql
- 安装包
helm install db stable/mysql
- 查看发布状态
helm status db
安装前自定义chart配置选项
--values(或-f):指定带有覆盖的YAML文件,可以多次指定。最右边的文件优先
helm show values stable/mysql > config.yaml
修改config.yaml配置文件即可
--set:在命令行上指定替代,如果两者都用,--set优先级高
helm install db --set persistence.storageClass="managed-nfs-storage" stable/mysql
直接修改模板文件
helm pull stable/mysql
helm pull stable/mysql --untar
helm install可以从多个来源安装
- chart存储库
- 本地chart存档(helm install foo-0.1.1.tgz)
- 本地chart目录(helm install foo)
- 完整URL(helm install https://xxx.yyy.com/charts/foo-0.1.1.tgz)
创建helm
- helm create examplechart
- 目录结构
.
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
# 获取渲染后的内容
helm get manifest hello
# helm版本回滚
# 上个版本
helm rollback hello
# 指定版本
helm rollback hello 1
# 打包
helm package examplechart
# 卸载
helm uninstall hello
简单样例helm
# cat examplechart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.name }}
spec:
replicas: {{ .Values.replicas }}
selector:
matchLabels:
app: mychart
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: mychart
spec:
containers:
- image: {{ .Values.image }}:{{ .Values.imageTag }}
name: nginx
resources: {}
# cat examplechart/values.yaml
name: hello
replicas: 3
image: nginx
imageTag: 1.16
模拟运行
# 跟Kubernetes一样的参数--dry-run
helm install web --dry-run /some/path
内置对象
- Release.Name release名称
- Release.Namespace release命名空间
- Release.Service release服务的名称
- Release.Revision release修订版本号, 从1开始累加
模板与函数
# 示例:
app: {{ quote .Values.label.app }}
# 结果:(quote会添加双引号)
app: "xxx"
# 模板函数调用语法:funcName arg1 arg2 ...
# 默认值 env: {{ .Value.env | default test }}
# 缩进 env: {{ .Value.env | indent 12 }}
# 大写 env: {{ upper .Value.env}}
# 首字母大写 env: {{ title .Value.env}}
流程控制
· if/else 条件块
- with 指定范围
- range 循环块
if/else示例
# cat values.yaml
devops: k8
# cat templates/deployment.yaml
template:
metadata:
labels:
app: nginx
{{ if eq .Value.devops "k8s" }}
devops: 123
{{ else }}
devops: 456
{{ end }}
# -的作用是为了去掉输出文件中的空行,默认条件判断语句在输出结果中会占用一行,以空行的形式表现。
{{- if eq .Value.devops "k8s" }}
devops: 123
{{- else }}
devops: 456
{{- end }}
eq、ne、lt、gt、and、or等运算符均支持
# 条件判断为false的情况
- false
- 0
- 空字符串
- nil 或者 null
- 空集合(map、slice、tuple、dict、array)
with
bideSelector:
team: a
gpu: ok
# 方法一:
{{- with .Values.nodeSelector }}
nodeSelector:
team: {{ .team }}
gpu: {{ .gpu }}
{{- end }}
# 方法二:
{{- with .Values.nodeSelector }}
nodeSelector:
{{ toYaml . | nindent 8 }}
{{- end }}
# indent和nindent区别:
- indent不换行
- nindent换行
range
# cat values.yaml
env:
NAME: "gateway"
JAVA_OPTS: "-Xmx1G"
# cat deployment.yaml
...
env:
{{- range $k, $v := .Values.env }}
- name: {{ $k }}
- value: {{ $v | quote }}
{{- end }}
# 结果
...
env:
- name: JAVA_OPTS
value: "Xmx1G"
- name: Name
value: "gateway"
变量
{{- $releaseName := .Release.Name -}}
{{- with .Value.nodeSelector }}
nodeSelector:
app: {{ $releaseName }}
{{ - toYaml . | nindent 8 }}
{{ end }}
命名模板
模板定义
# cat _helpers.tpl
{{- define "demo.fullname" -}}
{{ .Chart.Name }}-{{ .Release.Name }}
{{- end -}}
{{- define "labels" -}}
app: {{ template "demo.fullname" . }}
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
{{- end -}}
模板引用
# 方法一:
{{ template "name" . }}
# 方法二:
{{- include "name" . | nindent 4 }}
# 说明
# 模板中尽量顶着最前面写,不需要写空格。然后通过模板引用的nindent来进行控制空格数量