helm 内置对象

前面的文章介绍了 Helm Chart 的一些基本概念和使用,接下来我们重点介绍下 Chart 模板的编写。模板会渲染成 Kubernetes 的资源清单文件,接下来我们将来学习下模板的结构和如何使用它们,以及如何调试。

对象从模板引擎传递到模板中,在代码中可以传递对象,也有一种方法可以在模板宏创建新的对象,比如 tuple 函数。对象可以很简单,也可以包含其他对象或函数,例如,Release 对象就包含几个对象(比如 Release.Name),Files 对象就包含几个函数。

以下就介绍下变量的几种使用方法:

一、内置对象

通过前面的文章已经说过,当helm install一个资源类型时,就叫做一个release。Release 是我们可以在模板中访问的几个顶级对象之一,以下为release常用的几个内置变量

  • Release:该对象描述了 release 本身的相关信息,它内部有几个对象:
    • Release.Name:release 名称
    • Release.Namespace:release 安装到的命名空间
    • Release.IsUpgrade:如果当前操作是升级或回滚,则该值为 true
    • Release.IsInstall:如果当前操作是安装,则将其设置为 true
    • Release.Revision:release 的 revision 版本号,在安装的时候,值为1,每次升级或回滚都会增加
    • Release.Service:渲染当前模板的服务,在 Helm 上,实际上该值始终为 Helm
      举例说明如下:
1:编辑模板文件,如下:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}     ###名字使用release的name
  namespace: {{ .Release.namespace }}
  labels:
    app: helm-nginx
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: helm-nginx
  template:
    metadata:                                                                                                                                                              
      labels:
        app: helm-nginx
    spec:
      containers:
        - name: nginx
          image: {{ .Values.nginx.image.repository}}:{{ .Values.nginx.image.tag}}
          imagePullPolicy: {{ .Values.nginx.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
2: helm instal 部署nginx app,如下:
[root@node1 mychart]# helm install nginx -n nginx . 
NAME: nginx
LAST DEPLOYED: Mon Jul 31 16:21:16 2023
NAMESPACE: nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing mychart.

Your release is named nginx.

To learn more about the release, try:
  $ helm status nginx
  $ helm get nginx
[root@node1 mychart]# 

3:查看已经部署好的应用
[root@node1 mychart]# helm list -nnginx 
NAME 	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART        	APP VERSION
nginx	nginx    	1       	2023-07-31 16:21:16.289675827 +0800 CST	deployed	mychart-0.1.0	1.16.0    
[root@node1 mychart]# kubectl get deploy  -nnginx 
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           83s   ###可以看到deploy的名字为nginx,ns也是nginx
[root@node1 mychart]# 
  • chart

    • Chart.Version:Chart版本号
    • Chart.Name:Chart名称
      获取 Chart.yaml 文件的内容,该文件中的任何数据都可以访问,如下:
1:模板文件如下:
apiVersion: apps/v1         
kind: Deployment            
metadata:                   
  name: {{ .Chart.Name }}     ###调用的chart的name
  labels:                   
    app: {{ .Chart.type }}-{{ .Chart.Version}}   ###使用chart的版本打标签        
spec:                       
  replicas: {{ .Values.replicaCount }}
  selector:                 
    matchLabels:            
      app: helm-nginx       
  template:                 
    metadata:               
      labels:               
        app: helm-nginx     
    spec:                   
      containers:           
        - name: nginx       
          image: {{ .Values.nginx.image.repository}}:{{ .Values.nginx.image.tag}}
          imagePullPolicy: {{ .Values.nginx.image.pullPolicy }}
          ports:            
            - name: http    
              containerPort: 80
              protocol: TCP 

2:helm install 安装release
[root@node1 mychart]# helm install nginx -n nginx . 
NAME: nginx
LAST DEPLOYED: Mon Jul 31 16:59:26 2023
NAMESPACE: nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing mychart.

Your release is named nginx.

To learn more about the release, try:
  $ helm status nginx
  $ helm get nginx


3:查看安装好的应用
[root@node1 mychart]# helm list -n nginx 
NAME 	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART        	APP VERSION
nginx	nginx    	1       	2023-07-31 16:59:26.812573513 +0800 CST	deployed	mychart-0.1.0	1.16.0     

查看部署好的资源
[root@node1 mychart]# kubectl get all -n nginx
NAME                           READY   STATUS    RESTARTS   AGE
pod/mychart-75ff7797cc-v8hns   1/1     Running   0          21s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/nginx-helm   ClusterIP   10.233.47.51   <none>        80/TCP    21s

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mychart   1/1     1            1           21s   ###可以看到deploy的name为chart的name

NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/mychart-75ff7797cc   1         1         1       21s

查看deployment的label 
[root@node1 mychart]# kubectl describe deploy mychart -n nginx
Name:                   mychart
Namespace:              nginx
CreationTimestamp:      Mon, 31 Jul 2023 16:59:27 +0800
Labels:                 app=application-0.1.0   ####label标签为chart的type和version
                        app.kubernetes.io/managed-by=Helm
Annotations:            deployment.kubernetes.io/revision: 1
                        meta.helm.sh/release-name: nginx
                        meta.helm.sh/release-namespace: nginx

  • template
    包含当前正在执行的模板的相关信息
Name:当前模板的命名空间文件路径(比如 mychart/templates/mytemplate.yaml)
BaePath:当前 chart 的模板目录的命名空间路径(比如 mychart/templates)
  • files
    可以访问 chart 中的所有非特殊文件,虽然无法使用它来访问模板文件,但是可以来访问 chart 中的其他文件。
Files.Get:用于根据名称获取文件(比如 .Files.Get config.ini)
Files.GetBytes:用于以 bytes 数组而不是字符串的形式来获取文件内容的函数,这对于类似于图片之类的东西很有用
Files.Glob:用于返回名称于给定的 shell glob 模式匹配的文件列表
Files.Lines:可以逐行读取文件的函数,对于遍历文件中的每行内容很有用
Files.AsSecrets:将文件内容以 Base64 编码的字符串返回的函数
Files.AsConfig:将文件正文作为 YAML 字典返回的函数
  • Capabilities
    提供了获取有关 Kubernetes 集群支持功能的信息的对象
Capabilities.APIVersions:支持的版本集合
Capabilities.APIVersions.Has $version:判断一个版本(比如 batch/v1)或资源(比如 apps/v1/Deployment)是否可用
Capabilities.Kube.Version:Kubernetes 的版本
Capabilities.Kube:是 Kubernetes 版本的缩写
Capabilities.Kube.Major:Kubernetes 主版本
Capabilities.Kube.Minor:Kubernetes 的次版本

二、values

前面讲了内置对象的使用,接下来主要来讲解另外一个内置对象values的使用,该对象一般从 values.yaml 文件和用户提供的 values 文件传递到模板的 Values 值。

values的值来源主要有以下几种:

  • chart 文件中的 values.yaml 文件
  • -f 参数传递给 helm installhelm upgrade 的 values 值文件,一般是用户自定义的文件
  • --set 传递的各个参数,这个优先级最高(例如 helm install --set name=nginx .
  • 父 chart 的 values.yaml 文件

values.yaml 文件是默认值,可以被父 chart 的 values.yaml 文件覆盖,而后者又可以由用户提供的 values 值文件覆盖,而该文件又可以被 --set 参数覆盖。

如下我们使用默认的values.yaml文件进行测试

编辑values.yaml文件
favorite:
  drink: water
  food: apple

##############################
模板configmap文件
apiVersion: v1                                                                           kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | default "rice" }}
  food: {{ .Values.favorite.food | upper }}

######################################
运行helm install,查看渲染结果
[root@node1 mychart]# helm install --generate-name --dry-run --debug . -n nginx
install.go:178: [debug] Original chart version: ""
install.go:195: [debug] CHART PATH: /root/mychart

NAME: chart-1691649967
LAST DEPLOYED: Thu Aug 10 14:46:08 2023
NAMESPACE: nginx
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}

COMPUTED VALUES:
favorite:
  drink: water    
  food: apple      

HOOKS:
MANIFEST:
---
# Source: mychart/templates/nginx/config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: chart-1691649967-configmap
data:
  myvalue: "Hello World"
  drink: water      ###可以看到渲染的结果是根据values.yaml中定义的值一样
  food: APPLE

########################################
以下我们使用--set 参数进行覆盖
[root@node1 mychart]# helm install --generate-name --dry-run --debug --set favorite.drink=bread . -n nginx
install.go:178: [debug] Original chart version: ""
install.go:195: [debug] CHART PATH: /root/mychart

NAME: chart-1691650355
LAST DEPLOYED: Thu Aug 10 14:52:35 2023
NAMESPACE: nginx
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
favorite:
  drink: bread

COMPUTED VALUES:
favorite:
  drink: bread
  food: apple
HOOKS:
MANIFEST:
---
# Source: mychart/templates/nginx/config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: chart-1691650355-configmap
data:
  myvalue: "Hello World"
  drink: bread      ####可以看到此处的值被定义为bread,覆盖掉了默认的water
  food: APPLE
---

如果我们在模板中不想使用定义的参数了,可以删除默认的key,设置为NULL

在configmap的template模板中,定义如下的key
apiVersion: v1                                                                                                                                               
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink }}   ###取消drink这个key
  food: {{ .Values.favorite.food }}
####################################
运行helm install命令设置key为NULL,如下:
[root@node1 mychart]# helm install --generate-name --dry-run --debug --set favorite.drink=NULL . -n nginx
install.go:178: [debug] Original chart version: ""
install.go:195: [debug] CHART PATH: /root/mychart

NAME: chart-1691650883
LAST DEPLOYED: Thu Aug 10 15:01:24 2023
NAMESPACE: nginx
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
favorite:
  drink: null

COMPUTED VALUES:
favorite:
  food: apple
# Source: mychart/templates/nginx/config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: chart-1691650883-configmap
data:
  myvalue: "Hello World"
  drink:            ####此处可以看到drink的值为空
  food: APPLE
---

以上内容为helm内置对象的使用,后面将继续演示其他方法的使用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值