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仓库

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可以从多个来源安装

创建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来进行控制空格数量
posted @ 2020-05-25 14:12  ruixing  阅读(662)  评论(0编辑  收藏  举报