一、Helm目录层级

1.创建一个Chart

$ helm create helm-test

2.查看Helm目录层级

[root@k8s-master01 ~]# tree helm-test/
helm-test/
├── charts
├── Chart.yaml
├── templates
   ├── deployment.yaml
   ├── _helpers.tpl
   ├── hpa.yaml
   ├── ingress.yaml
   ├── NOTES.txt
   ├── serviceaccount.yaml
   ├── service.yaml
   └── tests
       └── test-connection.yaml
└── values.yaml

上面文件说明:

  • charts/目录: 可以包含其他的chart(称之为子chart)
  • Chart.yaml 文件包含了该chart的描述。你可以从模板中访问它
  • apiVersion:Chart的apiVersion,目前默认都是v2
  • name:Chart的名称
  • description:Chart描述信息
  • type:图表的类型
  • version:Chart自己的版本号
  • appVersion:Chart内应用的版本号

  • templates/ 目录:包括了模板文件。当Helm评估chart时,会通过模板渲染引擎将所有文件发送到templates/目录中。 然后收集模板的结果并发送给Kubernetes

  • deployment.yaml:创建Kubernetes 工作负载的基本清单
  • _helpers.tpl: 放置可以通过chart复用的模板辅助对象,可以理解成自定义的模板或者函数
  • NOTES.txt: chart的"帮助文本"。这会在你的用户执行helm install时展示给他们
  • service.yaml: 为你的工作负载创建一个 service终端基本清单
  • tests:测试文件

  • values.yaml 文件也导入到了模板。这个文件包含了chart的默认值。这些值会在用户执行helm installhelm upgrade时被覆盖,一般配置全局变量或者一些参数,其中优先级为values.yaml最低,--set参数最高

如果没有tree命令,可执行以下命令进行下载

$ yum install -y tree

二、Helm内置变量

对象可以通过模板引擎传递到模板中。 当然你的代码也可以传递对象。(我们在使用withrange语句时,会看到示例)。有几种方式可以在模板中创建新对象,比如说我们后面会看到的tuple功能。

对象可以是非常简单的:仅有一个值。或者可以包含其他对象或方法。比如,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
  • ValuesValues对象是从values.yaml文件和用户提供的文件传进模板的。默认为空
  • ChartChart.yaml文件内容。 Chart.yaml里的所有数据在这里都可以可访问的。比如 {{ .Chart.Name }}-{{ .Chart.Version }} 会打印出 mychart-0.1.0
  • Files: 在chart中提供访问所有的非特殊文件的对象。你不能使用它访问Template对象,只能访问其他文件。
  • Files.Get 通过文件名获取文件的方法
  • 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.KubeVersionCapabilities.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)

下面以变量Release.Name进行举例说明:

1.创建一个Chart

$ helm create helm-test

2.删掉系统自带的模板文件

[root@k8s-master01 ~]# rm -rf helm-test/templates/*

3.新增模板文件,并填写Release.Name内置变量

[root@k8s-master01 ~]# cd /root/helm-test/templates
[root@k8s-master01 templates]# vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"

4.测试模板渲染的内容,观察到以自己自定义的名字进行命名

[root@k8s-master01 ~]# helm install aaa helm-test/ --debug --dry-run
install.go:178: [debug] Original chart version: ""
install.go:195: [debug] CHART PATH: /root/helm-test

NAME: aaa
LAST DEPLOYED: Sun Jul  9 10:10:44 2023
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}

COMPUTED VALUES:
affinity: {}
autoscaling:
  enabled: false
  maxReplicas: 100
  minReplicas: 1
  targetCPUUtilizationPercentage: 80
fullnameOverride: ""
image:
  pullPolicy: IfNotPresent
  repository: nginx
  tag: ""
imagePullSecrets: []
ingress:
  annotations: {}
  className: ""
  enabled: false
  hosts:
  - host: chart-example.local
    paths:
    - path: /
      pathType: ImplementationSpecific
  tls: []
nameOverride: ""
nodeSelector: {}
podAnnotations: {}
podSecurityContext: {}
replicaCount: 1
resources: {}
securityContext: {}
service:
  port: 80
  type: ClusterIP
serviceAccount:
  annotations: {}
  create: true
  name: ""
tolerations: []

HOOKS:
MANIFEST:
---
# Source: helm-test/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: aaa-configmap
data:
  myvalue: "Hello World"

上面参数说明:

  • --dry-run :可以避免真正地创建和部署资源
  • --debug: 查看 Helm 在执行过程中的每个步骤和输出