概念

Charts 是Helm使用的Kubernetes 资源包打包格式,一个Charts就是一个描述一组Kubernetes资源的文件的集合。一个单独的Charts既能用于部署,也能部署复杂的应用。

charts文件组织结构

  1. mychart/
  2. ├── charts
  3. ├── Chart.yaml
  4. ├── templates
  5. ├── deployment.yaml
  6. ├── _helpers.tpl
  7. ├── ingress.yaml
  8. ├── NOTES.txt
  9. ├── service.yaml
  10. └── tests
  11. └── test-connection.yaml
  12. └── values.yaml

目录结构中出了charts和templates是目录以外,其他全都是文件,他们的基本公用如下:

  1. Chart.yaml 当前的Charts描述信息,yaml格式文件
  2. LICENSE 当前Charts的许可证信息,纯文本文件;可选文件
  3. README.md markdown格式readme文件
  4. requirementsyaml 当前Charts的依赖关系描述文件;可选
  5. values.yaml 当前Charts用到的默认配置值
  6. charts 目录,存放当前Charts以来到的所有Charts文件
  7. templates 目录,存放当前Charts用到的模板文件,可应用于charts生成有效Kubernetes清单配置
  8. templates/NOTES.txt 文本文件,用于描述Templates注解
Chart.yaml 文件组织格式

Chart.yaml 用于提供Charts相关的各种元素数据,如名称、版本、关键词、维护者信息、使用的模板引擎,它是一个Charts必备的核心文件,主要包含如下字段。

  1. name: 当前Charts的名称,必选字段。
  2. version: 遵循语义化版本规范第二版的版本号,必选字段。
  3. description: 当前项目的但语句描述信息,可选字段。
  4. keywords: 当前项目的关键词列表,可选字段
  5. home: 当前项目的主页URL,可选字段。
  6. sources: 当前项目用到的源码的来源URL列表,可选字段。
  7. maintainers: 项目维护者信息,组要嵌套 name、email、URL几个属性组成;可选字段
  8. engine:模板引擎的名称,默认为gotpl,即go模板。
  9. icon: URL,只想当前项目的图标,SVG或PNG格式的图片;可选字段
  10. appVersion: 本项目用到的应用程序的版本号,可选字段,且不必为语义化版本
  11. deprecated: 当前Charts是否已飞起,可选字段,布尔型
  12. tillerVersion: 当前Charts以来的Tiller版本号,可以使语义化版本号的范围,如”>2.4.0”;可选字段
Charts中的依赖关系
  1. requirements.yaml 文件
    Helm中的一个Charts可能会依赖不止一个其他的charts,这种以来关系可经requirements.yaml进行动态连接,也可直接存储在于charts/目录中进行手动管理。
    requirements.yaml 文件本质上只是一个简单的依赖关系列表,它具有类似如下定义中的可用字段:
  1. dependencies:
  2. - name:
  3. version:
  4. repository:
  5. alias:
  6. tags:
  7. condition:
  8. import-values:
  9. - child:
  10. parent:

上述示例中的字段基本可以见名知意

  1. name: 被依赖的Charts的名称
  2. version: 被依赖的Charts的版本
  3. repository: 被依赖的Charts所属的仓库以及URL;如果是非官方的仓库,则需要先用 helm repo add命令将其添加进本地可用仓库。
  4. alias: 被依赖的Charts创建一个别名,从而让当前Charts可以将所依赖的Charts对应到新名称;可选字段
  5. tags: 默认情况下所有的Charts都会被装载,若给定了tags,则仅装载那些匹配到的Charts。
  6. condition: 类似于tags字段,但需要通过自定义的条件来指明要装载的charts
  7. import-values: 导入子charts中的值;被导入的值需要在子charts中导出。,如下Wordpress Charts中定义的动态依赖关系:
  1. dependencies:
  2. - name: mariadb
  3. version: 2.1.1
  4. repository: https://kubernetes-charts.storage.googleapis.com/
  5. condition: mariadb.enabled
  6. tags:
  7. - wordpress-database

一旦依赖关系稳健配置完成,即可使用 helm dependency update 命令更新依赖关系,并自动下载被依赖的Charts 至 charts/目录中

Charts 目录

若所需要对依赖关系进行更多的控制,则所有呗依赖到的charts都能以手工方式直接复制到Charts目录中。一个被依赖到的Charts即可是归档格式,也可以是展开的目录个事,不过名称不能以”_”和”.”开头,此类文件会被Charts装载器自动忽略。

示例:

  1. charts/
  2. └── mariadb
  3. ├── Chart.yaml
  4. ├── README.md
  5. ├── templates
  6. ├── configmap.yaml
  7. ├── deployment.yaml
  8. ├── _helpers.tpl
  9. ├── NOTES.txt
  10. ├── pvc.yaml
  11. ├── secrets.yaml
  12. ├── svc.yaml
  13. ├── test-runner.yaml
  14. └── tests.yaml
  15. └── values.yaml
模板和值

Helm Charts模板遵循Go模板语言格式,并支持50种以上来自Spring库的模板函数附件,以及为数不少的其他专用函数。所有的模板文件都存储与Templates目录的模板函数附件,以及为数不少的其他专用函数。所有的模板文件都存储于Templates目录中,在当前Charts被Helm引用时,此目录中的所有模板文件都会传递给模板引擎进行处理。
模板文件中用到的值(value)有如下两种提供方式。

  1. 通过Charts的value.yaml文件提供,通常用于提供默认值
  2. 在运行”heml install”命令时传递包含所需自定义值的YAML文件;此处攒地的值会覆盖默认值。

templates示例:

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. name: {{ template "fullname" . }}
  4. label:
  5. app: {{ template "fullname" . }}
  6. chart: "{{ .Chart.Name}}-{{ .Chart.Version }}"
  7. release: "{{ .Release.Name }}"
  8. heritage: "{{ .Release.Service }}"
  9. spec:
  10. replicas: 1
  11. template:
  12. metadata:
  13. labels:
  14. app: {{ template "fullname" . }}
  15. spec:
  16. containers:
  17. - name: {{ template "fullname" . }}
  18. image: "{{ .Values.image }}"
  19. imagePullPolicy: {{ default "" .Values.imagesPullPolicy | quote }}

提供依赖的值可由values.yaml文件或由用户在运行 helm install命令时通过选项提供,除此以外,charts模板还办函一些固定的预定义值

固定的预定义值:

  1. Release.Name
  2. Release.Time
  3. Release.Service
  4. Release.IsUpgrade
  5. Release.IsInstall
  6. Release.Release.Revision
  7. Chart.name
  8. Chart.Version
  9. Files
  10. Capabilities

除以上,还有其他固定的预定义值,参见godoc站点内容

在values.yaml一类的文件中定一值(value)时,既可以将他们定义为全局作用域,也可以定义为仅供Charts目录下的某个Charts所使用。一般来说,上级Charts可访问下级Charts中的值,但下级Charts不能访问其上级charts的值。

示例:

  1. title: "My WordPress Site"
  2. mysql:
  3. max_connections: 100
  4. password: "secret"
  5. apache:
  6. port: 8080
  1. title属于全局作用域
  2. max_connectionspassword属于mysql Charts的作用域

生成空的Charts

  1. helm create xxx

Charts 仓库

  1. 自己创建的charts仅能本地使用,如果要共享给团队,可以打成包发给使用者
  2. 也可以使用charts仓库
  1. 打包命令:

    1. helm package ./mycahrt
    2. Succssfully packaged chart and saved it to: /root/charts/mychart-0.1.0.tgz
  2. 基于chart包进行安装

    1. helm install --name myapp2 mychart-0.1.0.tgz --set service.type=NodePort
  3. Helm内置了HTTP server支持,使用helm serve 即可运行本地仓库来输出本地创建的Charts:

    1. # 这种方式会阻塞,并且只监听了lo地址,需要添加其他参数
    2. [appuser@stateful Helm]$ helm serve
    3. Regenerating index. This may take a moment.
    4. Now serving you on 127.0.0.1:8879
    1. #另起一个终端查询
    2. helm search local
    1. #使用 helm repo add 添加仓库
    2. helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator
    1. #列出可用仓库
    2. helm repo list
    1. #更新 repo的元数据信息
    2. helm repo update
  4. 配置依赖关系
    在mychart目录中创建requirements.yaml文件给出依赖的Charts列表定义其依赖关系即可,文件内容类似如下所示:
    ```
    dependencies:
文档更新时间: 2022-02-09 09:41   作者:张尚