Helm — Chart介绍

Charts

Charts描述的是一组k8s资源相关的文件集合,用户可以通过简单地修改一些参数使得helm部署的应用符合我们的要求。

Charts 结构

wordpress/
  Chart.yaml          # 包含了chart信息的YAML文件
  LICENSE             # 可选: 包含chart许可证的纯文本文件
  README.md           # 可选: 可读的README文件
  values.yaml         # chart 默认的配置值
  values.schema.json  # 可选: 一个使用JSON结构的values.yaml文件
  charts/             # 包含chart依赖的其他chart
  crds/               # 自定义资源的定义
  templates/          # 模板目录, 当和values 结合时,可生成有效的Kubernetes manifest文件
  templates/NOTES.txt # 可选: 包含简要使用说明的纯文本文件
  • templates/ 目录包括了模板文件。安装应用时,helm会将用户设置的参数值通过模板引擎渲染到模板文件里,然后再将渲染后的结果发送给kubernetes。
  • values.yaml 这个文件包含了chart的 默认值 。这些值会在用户执行 helm installhelm upgrade 时被相应的命令行参数覆盖。
  • Chart.yaml 文件包含了该chart的描述。你可以从模板中访问它。charts/目录可以包含其他的chart。

Chart.yaml

apiVersion: The chart API version (required)
name: The name of the chart (required)
version: A SemVer 2 version (required)
kubeVersion: A SemVer range of compatible Kubernetes versions (optional)
description: A single-sentence description of this project (optional)
type: The type of the chart (optional)
keywords:
  - A list of keywords about this project (optional)
home: The URL of this projects home page (optional)
sources:
  - A list of URLs to source code for this project (optional)
dependencies: # A list of the chart requirements (optional)
  - name: The name of the chart (nginx)
    version: The version of the chart ("1.2.3")
    repository: (optional) The repository URL ("https://example.com/charts") or alias ("@repo-name")
    condition: (optional) A yaml path that resolves to a boolean, used for enabling/disabling charts (e.g. subchart1.enabled )
    tags: # (optional)
      - Tags can be used to group charts for enabling/disabling together
    import-values: # (optional)
      - ImportValues holds the mapping of source values to parent key to be imported. Each item can be a string or pair of child/parent sublist items.
    alias: (optional) Alias to be used for the chart. Useful when you have to add the same chart multiple times
maintainers: # (optional)
  - name: The maintainers name (required for each maintainer)
    email: The maintainers email (optional for each maintainer)
    url: A URL for the maintainer (optional for each maintainer)
icon: A URL to an SVG or PNG image to be used as an icon (optional).
appVersion: The version of the app that this contains (optional). Needn't be SemVer. Quotes recommended.
deprecated: Whether this chart is deprecated (optional, boolean)
annotations:
  example: A list of annotations keyed by name (optional).

Chart 类型

type字段定义了chart的类型。有两种类型: applicationlibraryapplication 是默认类型,是可以完全操作的标准chart。 库类型 chart 提供针对chart构建的实用程序和功能。 库类型chart与应用类型chart不同,因为它不能安装,通常不包含任何资源对象。
应用类型chart 可以作为库类型chart使用。可以通过将类型设置为 library来实现。 然后这个库就被渲染成了一个库类型chart,所有的实用程序和功能都可以使用。所有的资源对象不会被渲染。

Chart 依赖

Helm 中,chart可能会依赖其他任意个chart。 这些依赖可以使用Chart.yaml文件中的dependencies 字段动态链接,或者被带入到charts/ 目录并手动配置。

dependencies:
  - name: apache
    version: 1.2.3
    repository: https://example.com/charts
  - name: mysql
    version: 3.2.1
    repository: https://another.example.com/charts
  • name字段是你需要的chart的名称
  • version字段是你需要的chart的版本
  • repository字段是chart仓库的完整URL。必须使用helm repo add在本地添加仓库
  • 你可以使用仓库的名称代替URL
$ helm repo add fantastic-charts https://fantastic-charts.storage.googleapis.com
dependencies:
  - name: awesomeness
    version: 1.0.0
    repository: "@fantastic-charts"

一旦你定义好了依赖,运行 helm dependency update 就会使用你的依赖文件下载所有你指定的chart到你的charts/目录。

当 helm dependency update 拉取chart时,会在charts/目录中形成一个chart包。因此对于上面的示例,会在chart目录中期望看到以下文件

charts/
  apache-1.2.3.tgz
  mysql-3.2.1.tgz

Templates and Values

Helm Chart 模板是按照 Go 模板语言书写, 增加了50个左右的附加模板函数, 这些函数来自 Sprig 库和一些其他 指定的函数。

所有模板文件存储在chart的 templates/ 文件夹。 当Helm渲染chart时,它会通过模板引擎遍历目录中的每个文件。

模板的Value通过两种方式提供:

  • Chart开发者可以在chart中提供一个命名为 values.yaml 的文件。这个文件包含了默认值。
  • Chart用户可以提供一个包含了value的YAML文件。可以在命令行使用 helm install命令时提供。

当用户提供自定义value时,这些value会覆盖chart的values.yaml文件中value。

模板文件

模板文件遵守书写Go模板的标准惯例.

示例:

apiVersion: v1
kind: ReplicationController
metadata:
  name: deis-database
  namespace: deis
  labels:
    app.kubernetes.io/managed-by: deis
spec:
  replicas: 1
  selector:
    app.kubernetes.io/name: deis-database
  template:
    metadata:
      labels:
        app.kubernetes.io/name: deis-database
    spec:
      serviceAccount: deis-database
      containers:
        - name: deis-database
          image: {
    
    {
    
     .Values.imageRegistry }}/postgres:{
    
    {
    
     .Values.dockerTag }}
          imagePullPolicy: {
    
    {
    
     .Values.pullPolicy }}
          ports:
            - containerPort: 5432
          env:
            - name: DATABASE_STORAGE
              value: {
    
    {
    
     default "minio" .Values.storage }}

Values文件

针对前面部分的模板,values.yaml文件提供的必要值如下:

imageRegistry: "quay.io/deis"
dockerTag: "latest"
pullPolicy: "Always"
storage: "s3"

然后在模板文件中使用.Values对象就可以任意访问这些值了

注意:chart包含的默认values文件必须被命名为values.yaml。不过在命令行可以通过-f指定其他文件。

Hook 机制

Helm 提供了一个 hook 机制允许chart开发者在发布生命周期的某些点进行干预。比如你可以使用hook用于:

  • 安装时在加载其他chart之前加载配置映射或密钥
  • 安装新chart之前执行备份数据库的任务,然后在升级之后执行第二个任务用于存储数据。
  • 在删除发布之前执行一个任务以便在删除服务之前退出滚动。

helm定义了以下hook:

  • pre-install 在模板渲染之后,Kubernetes资源创建之前执行
  • post-install 在所有资源加载到Kubernetes之后执行
  • pre-delete 在Kubernetes删除之前,执行删除请求
  • post-delete 在所有的版本资源删除之后执行删除请求
  • pre-upgrade 在模板渲染之后,资源更新之前执行一个升级请求
  • post-upgrade 所有资源升级之后执行一个升级请求
  • pre-rollback 在模板渲染之后,资源回滚之前,执行一个回滚请求
  • post-rollback 在所有资源被修改之后执行一个回滚请求
  • test 调用Helm test子命令时执行 ( test文档)

示例:

apiVersion: batch/v1
kind: Job
metadata:
  name: "some-job"
  labels:
    app.kubernetes.io/managed-by: {
    
    {
    
     .Release.Service | quote }}
    app.kubernetes.io/instance: {
    
    {
    
     .Release.Name | quote }}
    app.kubernetes.io/version: {
    
    {
    
     .Chart.AppVersion }}
    helm.sh/chart: "{
    
    { .Chart.Name }}-{
    
    { .Chart.Version }}"
  annotations:
    # This is what defines this resource as a hook. Without this line, the
    # job is considered part of the release.
    
    # 在所有资源加载到Kubernetes之后执行
    "helm.sh/hook": post-install
    # 可以为钩子定义权重,这有助于建立一个确定性的执行顺序
    "helm.sh/hook-weight": "-5"
    # 定义策略来决定何时删除对应的钩子资源
    "helm.sh/hook-delete-policy": hook-succeeded
 ...
 此处省略
 ...

内置对象

Release

Release对象描述了版本发布本身

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

Values

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

Chart

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

Files

在chart中提供访问所有的非特殊文件的对象。你不能使用它访问Template对象,只能访问其他文件。

  • Files.Get 通过文件名获取文件的方法。 (.Files.Get config.ini)
  • Files.GetBytes 用字节数组代替字符串获取文件内容的方法。 对图片之类的文件很有用
  • Files.Glob 用给定的shell glob模式匹配文件名返回文件列表的方法
  • Files.Lines 逐行读取文件内容的方法。迭代文件中每一行时很有用
  • Files.AsSecrets 使用Base 64编码字符串返回文件体的方法
  • Files.AsConfig 使用YAML格式返回文件体的方法

Capabilities

  • 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)

猜你喜欢

转载自blog.csdn.net/weixin_45804031/article/details/125647373