Helm基础

Posted by YaPi on April 25, 2022

基础命令

helm repo add bitnami https://charts.bitnami.com/bitnami

# 查找chart
helm search repo nginx

# 更新repo
helm repo update

# 安装chart
helm install bitnami/nginx --generate-name

# 查看chart信息
helm show chart bitnami/mysql 

# 查看完整chart信息
helm show all bitnami/mysql 

# 列出所有可能被部署的版本
helm list 或 helm ls  

# 卸载一个版本 加上 --keep-history选项 保留版本历史
helm uninstall 

# 下载一个chart,不安装
helm pull chartrepo/chartname	

# 下载依赖的chart,文件会下载到charts目录下
helm dependency update

# 创建一个chart
helm create mychart

# 打包chart
helm package mychart

# 查找chart的格式或信息问题
helm lint mychart

# 若只是想测试渲染而不安装任何实际应用
helm install --debug --dry-run yapi-serval ./mychart

chart

# v2/v1
apiVersion: chart API 版本 (必需)

appVersion: 包含的应用版本(可选)。不需要是语义化,建议使用引号,自定项目版本

name: chart名称 (必需)

version: 语义化2 版本(必需)

kubeVersion: 兼容Kubernetes版本的语义化版本(可选)(在安装时验证版本,k8s版本不匹配会失败)

description: 一句话对这个项目的描述(可选)

# application(默认) / library
type: chart类型 (可选)

icon: 用做icon的SVG或PNG图片URL (可选)

deprecated: 不被推荐的chart (可选,布尔值)

annotations:
  example: 按名称输入的批注列表 (可选).
  
keywords:
  - 关于项目的一组关键字(可选)
  
home: 项目home页面的URL (可选)

sources:
  - 项目源码的URL列表(可选)
  
dependencies: # chart 必要条件列表 (可选)
  - name: chart名称 (nginx)
    version: chart版本 ("1.2.3")
    # 注意你必须使用helm repo add在本地添加仓库
    repository: (可选)仓库URL ("https://example.com/charts") 或别名 ("@repo-name")
    condition: (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled )
    tags: # (可选)
      - 用于一次启用/禁用 一组chart的tag
    import-values: # (可选)
      - ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项
    alias: (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用
maintainers: # (可选)
  - name: 维护者名字 (每个维护者都需要)
    email: 维护者邮箱 (每个维护者可选)
    url: 维护者URL (每个维护者可选)
  • kubeVersion
>= 1.13.0 < 1.15.0  (或者使用 || 符号连接)   >= 1.13.0 < 1.14.0 || >= 1.14.1 < 1.15.0

除了版本约束外,使用运算符 = != > < >= <= 支持以下速记符号:

闭合间隔的连字符范围, 1.1 - 2.3.4 等价于 >= 1.1 <= 2.3.4
通配符 x, X 和 *, 1.2.x 等价于 >= 1.2.0 < 1.3.0
波浪符号~范围 (允许改变补丁版本), ~1.2.3 等价于 >= 1.2.3 < 1.3.0
插入符号^范围 (允许改变次版本), ^1.2.3 等价于 >= 1.2.3 < 2.0.0

chart hook

Helm 提供了一个 hook 机制允许chart开发者在发布生命周期的某些点进行干预。

  • 安装时在加载其他chart之前加载配置映射或密钥
  • 安装新chart之前执行备份数据库的任务,然后在升级之后执行第二个任务用于存储数据
  • 在删除发布之前执行一个任务以便在删除服务之前退出滚动
注释 描述
pre-install 在模板渲染之后,Kubernetes资源创建之前执行
post-install 在所有资源加载到Kubernetes之后执行
pre-delete 在Kubernetes删除之前,执行删除请求
post-delete 在所有的版本资源删除之后执行删除请求
pre-upgrade 在模板渲染之后,资源更新之前执行一个升级请求
post-upgrade 所有资源升级之后执行一个升级请求
pre-rollback 在模板渲染之后,资源回滚之前,执行一个回滚请求
post-rollback 在所有资源被修改之后执行一个回滚请求
test 调用Helm test子命令时执行
执行步骤
1. 用户返回 helm install foo
2. Helm库调用安装API
3. 在 crds/目录中的CRD会被安装
4. 在一些验证之后,库会渲染foo模板
5. 库准备执行pre-install钩子(将hook资源加载到Kubernetes中)
6. 库按照权重对钩子排序(默认将权重指定为0),然后在资源种类排序,最后按名称正序排列。
7. 库先加载最小权重的钩子(从负到正)
8. 库会等到钩子是 “Ready”状态(CRD除外)
9. 库将生成的资源加载到Kubernetes中。注意如果设置了--wait参数,库会等所有资源是ready状态, 且所有资源准备就绪后才会执行post-install钩子。
10. 库执行post-install钩子(加载钩子资源)。
11. 库会等到钩子是”Ready”状态
12. 库会返回发布对象(和其他数据)给客户端
13 客户端退出
示例
apiVersion: batch/v1
kind: Job
metadata:
  name: ""
  labels:
    app.kubernetes.io/managed-by: 
    app.kubernetes.io/instance: 
    app.kubernetes.io/version: 
    helm.sh/chart: "-"
  annotations:
    # This is what defines this resource as a hook. Without this line, the
    # job is considered part of the release.
    "helm.sh/hook": post-install
    "helm.sh/hook-weight": "-5"
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    metadata:
      name: ""
      labels:
        app.kubernetes.io/managed-by: 
        app.kubernetes.io/instance: 
        helm.sh/chart: "-"
    spec:
      restartPolicy: Never
      containers:
      - name: post-install-job
        image: "alpine:3.3"
        command: ["/bin/sleep",""]

一个资源可以实现多个钩子

annotations:
  "helm.sh/hook": post-install,post-upgrade

删除策略

注释 描述
before-hook-creation 新钩子启动前删除之前的资源 (默认)
hook-succeeded 钩子成功执行之后删除资源
hook-failed 如果钩子执行失败,删除资源

template

默认资源

对象可以通过模板引擎传递到模板中。 当然你的代码也可以传递对象。 对象可以是非常简单的:仅有一个值。或者可以包含其他对象或方法。比如,Release对象可以包含其他对象(比如:Release.Name)和Files对象有一组方法。 在上一部分中,我们用在模板中插入版本名称。Release是你可以在模板中访问的顶层对象之一。

Release: Release对象描述了版本发布本身。包含了以下对象:
    Release.Name: release名称
    Release.Namespace: 版本中包含的命名空间(如果manifest没有覆盖的话)
    Release.IsUpgrade: 如果当前操作是升级或回滚的话,该值将被设置为true
    Release.IsInstall: 如果当前操作是安装的话,该值将被设置为true
    Release.Revision: 此次修订的版本号。安装时是1,每次升级或回滚都会自增
    Release.Service: 该service用来渲染当前模板。Helm里始终Helm

Values: Values对象是从values.yaml文件和用户提供的文件传进模板的。默认为空

Chart: Chart.yaml文件内容。 Chart.yaml里的所有数据在这里都可以可访问的。比如 - 会打印出 mychart-0.1.0

Files: 在chart中提供访问所有的非特殊文件的对象。你不能使用它访问Template对象,只能访问其他文件。 请查看这个 文件访问部分了解更多信息
    Files.Get 通过文件名获取文件的方法。 (.Files.Getconfig.ini)
    Files.GetBytes 用字节数组代替字符串获取文件内容的方法。 对图片之类的文件很有用
    Files.Glob 用给定的shell glob模式匹配文件名返回文件列表的方法
    Files.Lines 逐行读取文件内容的方法。迭代文件中每一行时很有用
    Files.AsSecrets 使用Base 64编码字符串返回文件体的方法
    Files.AsConfig 使用YAML格式返回文件体的方法

Capabilities: 提供关于Kubernetes集群支持功能的信息
    Capabilities.APIVersions 是一个版本列表
    Capabilities.APIVersions.Has $version 说明集群中的版本 (比如,batch/v1) 或是资源 (比如, apps/v1/Deployment) 是否可用
    Capabilities.KubeVersion 和Capabilities.KubeVersion.Version 是Kubernetes的版本号
    Capabilities.KubeVersion.Major Kubernetes的主版本
    Capabilities.KubeVersion.Minor Kubernetes的次版本
    Capabilities.HelmVersion 包含Helm版本详细信息的对象,和 helm version 的输出一致
    Capabilities.HelmVersion.Version 是当前Helm语义格式的版本
    Capabilities.HelmVersion.GitCommit Helm的git sha1值
    Capabilities.HelmVersion.GitTreeState 是Helm git树的状态
    Capabilities.HelmVersion.GoVersion 是使用的Go编译器版本

Template: 包含当前被执行的当前模板信息
    Template.Name: 当前模板的命名空间文件路径 (e.g. mychart/templates/mytemplate.yaml)
    Template.BasePath: 当前chart模板目录的路径 (e.g. mychart/templates)

传值可以被覆盖

  • hart中的values.yaml文件
  • 如果是子chart,就是父chart中的values.yaml文件
  • 使用-f参数(helm install -f myvals.yaml ./mychart)传递到 helm install 或 helm upgrade的values文件
  • 使用–set (比如helm install –set foo=bar ./mychart)传递的单个参数

默认使用values.yaml,可以被父chart的values.yaml覆盖,继而被用户提供values文件覆盖, 最后会被–set参数覆盖,优先级为values.yaml最低,–set参数最高