helm函数

embedded/2024/12/26 13:13:16/

默认函数介绍

在 Helm 中,default 函数用于为变量提供默认值,以确保模板渲染不会因为变量未定义或为空值而失败。基本语法如下:

{{ default "默认值" .变量 }}
或者:
{{ .Valumes.XX | default "latest" }}

default函数示例

1.使用helm创建 03-zhiyong18-use-default Chart,删除一些模版和values

helm create 03-zhiyong18-use-default> 03-zhiyong18-use-default/values.yamlrm -rf 03-zhiyong18-use-default/templates/*

2.自定义values

创建values变量模版,自定义了一个字段叫 WZYdefault。如果template 要引用的变量找不到时,就会使用此变量。

所以我特意把{.deploy.xiuxian.tag} 给设置为了空

[root@master23105-helm]# cat 03-zhiyong18-use-default/values.yaml 
# 自定义默认字段 WZYdefault
WZYdefault:ImageTag: 100# 定义的是通用的字段
common:xiuxian:name: xiuxianlabels:apps: xiuxian# 定义deployment资源的相关字段
deploy:xiuxian:image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/appstag: ""replicas: 3# 定义service资源相关字段
service:xiuxian:type: NodePortports:port: 80targetPort: 80nodePort: 3080

3.创建工作负载模版,增加 {{.Values.deploy.xiuxian.tag | default .Values.WZYdefault.ImageTag}}

表示此变量为空时,该去哪里引用默认变量

[root@master23105-helm]# cat 03-zhiyong18-use-default/templates/deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: {{.Values.common.xiuxian.name}}
spec:replicas: {{.Values.deploy.xiuxian.replicas}}selector:matchLabels:apps: xiuxiantemplate:metadata:labels:apps: xiuxianversion: v1spec:containers:- name: c1image: "{{.Values.deploy.xiuxian.image}}:{{.Values.deploy.xiuxian.tag | default .Values.WZYdefault.ImageTag}}"

4.自定义帮助信息(可选操作)

[root@master23105-helm]# cat 03-zhiyong18-use-default/templates/NOTES.txt 
欢迎使用wzy自定义Chart程序,当前的Chart版本号是: {{.Chart.Name}}:{{.Chart.Version}}
正在使用的 应用 版本号为: {{.Chart.Name}}:{{.Chart.AppVersion}}
当前的release名称: {{.Release.Name}}
名称空间: {{.Release.Namespace}}
修订版本: {{.Release.Revision}}
当前操作是否升级: {{.Release.IsUpgrade}}
当前部署的镜像为: {{.Values.deploy.xiuxian.image}}:{{.Values.deploy.xiuxian.tag | default .Values.WZYdefault.ImageTag}}
访问测试: http://10.0.0.231:{{.Values.service.xiuxian.ports.nodePort}}我的博客地址:https://blog.csdn.net/qq_73797346

5.部署验证可以发现,镜像tag使用了默认值。当然没有这个镜像啊,我凭空捏造的

[root@master23105-helm]# helm install default 03-zhiyong18-use-default/
NAME: default
LAST DEPLOYED: Sun Nov 24 03:41:07 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
欢迎使用wzy自定义Chart程序,当前的Chart版本号是: 01-zhiyong18-no-value:0.1.0
正在使用的 应用 版本号为: 01-zhiyong18-no-value:1.16.0
当前的release名称: default
名称空间: default
修订版本: 1
当前操作是否升级: false
当前部署的镜像为: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v100
访问测试: http://10.0.0.231:3080[root@master23105-helm]# kubectl get all
NAME                           READY   STATUS             RESTARTS   AGE
pod/xiuxian-5589856b9b-h6knp   0/1     ImagePullBackOff   0          2m14s
pod/xiuxian-5589856b9b-pfzx4   0/1     ImagePullBackOff   0          2m14s
pod/xiuxian-5589856b9b-xqfx4   0/1     ImagePullBackOff   0          2m14sNAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)       AGE
service/kubernetes   ClusterIP   10.200.0.1      <none>        443/TCP       20d
service/xiuxian      NodePort    10.200.54.197   <none>        80:3080/TCP   2m14sNAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/xiuxian   0/3     3            0           2m14sNAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/xiuxian-5589856b9b   3         3         0       2m14s

toYaml函数

在 Helm 模板中,toYaml 函数用于将变量转换为 YAML 格式的字符串。结合 nindent 函数,可以自动添加缩进,保持模板的可读性和结构的正确性,特别是在嵌套字段较多时大大简化书写

假设有个values.yaml,定义了2个探针

deploy:xiuxian:image: nginxtag: ""replicas: 3livenessProbe:httpGet:port: 80path: /index.htmlfailureThreshold: 3initialDelaySeconds: 3periodSeconds: 1successThreshold: 1timeoutSeconds: 1readinessProbe:httpGet:port: 80path: /index.htmlfailureThreshold: 3initialDelaySeconds: 0periodSeconds: 1successThreshold: 1timeoutSeconds: 1

在模板文件中的容器字段引用时,就要这样,非常难以书写,大大增加了书写量

containers:
- name: c1image: "{{ .Values.deploy.xiuxian.image }}:{{ .Values.deploy.xiuxian.tag | default "latest" }}"livenessProbe:httpGet:port: {{ .Values.deploy.xiuxian.livenessProbe.httpGet.port }}path: {{ .Values.deploy.xiuxian.livenessProbe.httpGet.path }}failureThreshold: {{ .Values.deploy.xiuxian.livenessProbe.failureThreshold }}initialDelaySeconds: {{ .Values.deploy.xiuxian.livenessProbe.initialDelaySeconds }}periodSeconds: {{ .Values.deploy.xiuxian.livenessProbe.periodSeconds }}successThreshold: {{ .Values.deploy.xiuxian.livenessProbe.successThreshold }}timeoutSeconds: {{ .Values.deploy.xiuxian.livenessProbe.timeoutSeconds }}readinessProbe:httpGet:port: {{ .Values.deploy.xiuxian.readinessProbe.httpGet.port }}path: {{ .Values.deploy.xiuxian.readinessProbe.httpGet.path }}failureThreshold: {{ .Values.deploy.xiuxian.readinessProbe.failureThreshold }}initialDelaySeconds: {{ .Values.deploy.xiuxian.readinessProbe.initialDelaySeconds }}periodSeconds: {{ .Values.deploy.xiuxian.readinessProbe.periodSeconds }}successThreshold: {{ .Values.deploy.xiuxian.readinessProbe.successThreshold }}timeoutSeconds: {{ .Values.deploy.xiuxian.readinessProbe.timeoutSeconds }}

我们可以这样直接引用整个yaml,然偶再缩进。

这个探针缩进取决于当前deploy的缩进。

注意这里有个默认的换行符,如果使用 indent是没有换行的

在这里插入图片描述

     spec:containers:- name: c1image: "{{.Values.deploy.xiuxian.image}}:{{.Values.deploy.xiuxian.tag | default .Values.WZYdefault.ImageTag}}"livenessProbe: {{ toYaml .Values.deploy.xiuxian.livenessProbe | nindent 10 }}

提示可以使用:helm install toyaml 04-to-yaml --dry-run预执行一遍

或则增加 --debug进一步判断和调式

with函数

with 语句使模板进入一个指定的上下文,从而简化对嵌套结构的访问。

之前在使用toYaml时,确实简化了不少。有没有一种方法可以再简化一点呢?每次书写 {{ .Values.deploy.xiuxian}},可以使用with简化。

1.deployment文件引用 -with

[root@master231templates]# yy deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: {{.Values.common.xiuxian.name}}
spec:replicas: {{.Values.deploy.xiuxian.replicas}}selector:matchLabels:apps: xiuxiantemplate:metadata:labels:apps: xiuxianversion: v1spec:containers:- name: c1image: "{{.Values.deploy.xiuxian.image}}:{{.Values.deploy.xiuxian.tag | default .Values.WZYdefault.ImageTag}}"{{- with .Values.deploy.xiuxian }}livenessProbe: {{ toYaml .livenessProbe | nindent 10 }}readinessProbe: {{ toYaml .readinessProbe | nindent 10 }}{{- end }}

2.渲染结果如下:

    spec:containers:- name: c1image: "registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v100"livenessProbe: failureThreshold: 3httpGet:path: /index.htmlport: 80initialDelaySeconds: 3periodSeconds: 1successThreshold: 1timeoutSeconds: 1readinessProbe: failureThreshold: 3httpGet:path: /index.htmlport: 80initialDelaySeconds: 0periodSeconds: 1successThreshold: 1timeoutSeconds: 1

变量的定义

{{ $default_image_tag := .Values.WZYdefault.ImageTag }}

1.在前面的with案例中,可以发现有这样的一个报错。因为使用了 - with,导致根路径发送改变,所以 image 字段用上了

[root@master23111-with-and-variable]# yy values.yaml 
WZYdefault:ImageTag: v100
common:xiuxian:name: xiuxianlabels:apps: xiuxian
deploy:xiuxian:image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/appstag: ""replicas: 3livenessProbe:httpGet:port: 80path: /index.htmlfailureThreshold: 3initialDelaySeconds: 3periodSeconds: 1successThreshold: 1timeoutSeconds: 1readinessProbe:httpGet:port: 80path: /index.htmlfailureThreshold: 3initialDelaySeconds: 0periodSeconds: 1successThreshold: 1timeoutSeconds: 1
service:xiuxian:type: NodePortports:port: 80targetPort: 80nodePort: 3080

2.deployment.yaml 没有引用变量报错

[root@master231templates]# yy deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: {{.Values.common.xiuxian.name}}
spec:replicas: {{.Values.deploy.xiuxian.replicas}}selector:matchLabels:apps: xiuxiantemplate:metadata:labels:apps: xiuxianversion: v1spec:containers:- name: c1{{- with .Values.deploy.xiuxian }}image: "{{.image}}:{{.tag | default .Values.WZYdefault.ImageTag}}"livenessProbe: {{ toYaml .livenessProbe | nindent 10 }}readinessProbe: {{ toYaml .readinessProbe | nindent 10 }}{{- end }}

[root@master23105-helm]# helm install bad 11-with-and-variable/
Error: INSTALLATION FAILED: template: 01-zhiyong18-no-value/templates/deployment.yaml:19:51: executing “01-zhiyong18-no-value/templates/deployment.yaml” at <.Values.WZYdefault.ImageTag>: nil pointer evaluating interface {}.WZYdefault

3.解决方法:使用一个变量来

[root@master231templates]# yy deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: {{.Values.common.xiuxian.name}}
spec:replicas: {{.Values.deploy.xiuxian.replicas}}selector:matchLabels:apps: xiuxiantemplate:metadata:labels:apps: xiuxianversion: v1spec:containers:- name: c1{{ $default_image_tag :=  .Values.WZYdefault.ImageTag }}{{- with .Values.deploy.xiuxian }}image: "{{.image}}:{{.tag | default $default_image_tag }}"livenessProbe: {{ toYaml .livenessProbe | nindent 10 }}readinessProbe: {{ toYaml .readinessProbe | nindent 10 }}{{- end }}

字符处理相关函数

大小写转变函数

函数示例:

 # 全部字母大写| upper# 首字母大写| title# 全部小写| lower

1.values的内容如下,接下来我要做的是传递到容器的环境变量值大小发送改变

deploy:xiuxian:image: nginxtag: "latest"replicas: 3env:name: wenZhiYongsex: manhobby: BLOG

2.模版文件引用values:

apiVersion: apps/v1
kind: Deployment
metadata:name: {{.Values.common.xiuxian.name}}
spec:replicas: {{.Values.deploy.xiuxian.replicas}}selector:matchLabels:apps: xiuxiantemplate:metadata:labels:apps: xiuxianversion: v1spec:containers:- name: c1image: "{{.Values.deploy.xiuxian.image}}:{{.Values.deploy.xiuxian.tag | default .Values.WZYdefault.ImageTag}}"env:- name: wzy_namevalue: {{ .Values.deploy.xiuxian.env.name | upper }}- name: wzy_sexvalue: {{ .Values.deploy.xiuxian.env.sex | title }}- name: wzy_hobbyvalue: {{ .Values.deploy.xiuxian.env.hobby | lower }}

3.执行一下 helm install change 05-change/ --dry-run --debug ,看看效果。全部转变成功

apiVersion: apps/v1
kind: Deployment
metadata:name: xiuxian
spec:replicas: 3selector:matchLabels:apps: xiuxiantemplate:metadata:labels:apps: xiuxianversion: v1spec:containers:- name: c1image: "registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v100"env:- name: wzy_namevalue: WENZHIYONG- name: wzy_sexvalue: Man- name: wzy_hobbyvalue: blog

quote函数

作用:把values引用的的特殊值,如布尔值(true,false)、数字(1,2 )…当做普通字符串处理。

values模板定义了env boolean为true。接下来要做的是true当做普通字符传入到容器的环境变量中

1.这是values模版文件部分配置示例:

deploy:xiuxian:image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/appstag: ""replicas: 3env:boolean: true

2.模版引用该values,不出意外的话就报错了

[root@master231templates]# cat deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: {{.Values.common.xiuxian.name}}
spec:replicas: {{.Values.deploy.xiuxian.replicas}}selector:matchLabels:apps: xiuxiantemplate:metadata:labels:apps: xiuxianversion: v1spec:containers:- name: c1image: "{{.Values.deploy.xiuxian.image}}:{{.Values.deploy.xiuxian.tag | default .Values.WZYdefault.ImageTag}}"env:- name: wzy_ruokvalue: {{ .Values.deploy.xiuxian.env.boolean }}

3.使用 --dry-run 运行是没有问题的,不过是假象,真正运行就报错了

[root@master23105-helm]# helm install quote 06-quote/ 
Error: INSTALLATION FAILED: 1 error occurred:* Deployment in version "v1" cannot be handled as a Deployment: json: cannot unmarshal bool into Go 
struct field EnvVar.spec.template.spec.containers.env.value of type string

4.解决方法,增加 quote函数把后面的值转变为普通字符。就像这样:

         env:- name: wzy_numbervalue: {{ quote .Values.deploy.xiuxian.repicas }}- name: wzy_ruokvalue: {{ quote .Values.deploy.xiuxian.env.boolean }}

5.使用 helm install quote 06-quote/ 安装部署成功。进入容器打印该变量

[root@master23105-helm]# kubectl exec xiuxian-777cf95649-d94r6 -- sh -c 'echo $wzy_ruok'
true

字符替换+截断

1.阅读Chart信息

apiVersion: v2
name: 07-printf
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"

2.阅读部分values信息

[root@master23107-printf]# yy values.yaml 
WZYdefault:ImageTag: v1
common:xiuxian:name: xiuxianlabels:apps: xiuxian
deploy:xiuxian:image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/appstag: ""replicas: 3

3.NOTES信息。这里记录了相关字符处理的函数

[root@master231templates]# cat NOTES.txt 
--------------------------------------------------------------------------------------------------------
# 会输出 chart的名字-chart的版本-pod副本数量
{{ printf "%s-%s-%.f" .Chart.Name .Chart.Version .Values.deploy.xiuxian.replicas }}
---------------------------------------------------------------------------------------------------------
# 会输出 chart的名字-chart的版本-pod副本数量,把符号 - 替换为 【
{{ printf "%s-%s-%.f" .Chart.Name .Chart.Version .Values.deploy.xiuxian.replicas | replace "-" "【" }}
---------------------------------------------------------------------------------------------------------
# trunc 截断输出保留前3个字符
{{ printf "%s-%s-%.f" .Chart.Name .Chart.Version .Values.deploy.xiuxian.replicas | trunc 3 }}
---------------------------------------------------------------------------------------------------------
# 删除指定字符后缀,这里把 3 删除
{{ printf "%s-%s-%.f" .Chart.Name .Chart.Version .Values.deploy.xiuxian.replicas | trimSuffix "3" }}
---------------------------------------------------------------------------------------------------------
# 删除指定字符前缀,这里把 07 删除
{{ printf "%s-%s-%.f" .Chart.Name .Chart.Version .Values.deploy.xiuxian.replicas | trimPrefix "07" }}
---------------------------------------------------------------------------------------------------------我的博客地址:https://blog.csdn.net/qq_73797346

4.运行结果的NOTE输出如下:

NOTES:
--------------------------------------------------------------------------------------------------------
# 会输出 chart的名字-chart的版本-pod副本数量
07-printf-0.1.0-3
---------------------------------------------------------------------------------------------------------
# 会输出 chart的名字-chart的版本-pod副本数量,把符号 - 替换为 【
07【printf【0.1.0【3
---------------------------------------------------------------------------------------------------------
# trunc 截断输出保留前3个字符
07-
---------------------------------------------------------------------------------------------------------
# 删除指定字符后缀,这里把 3 删除
07-printf-0.1.0-
---------------------------------------------------------------------------------------------------------
# 删除指定字符前缀,这里把 07 删除
-printf-0.1.0-3
---------------------------------------------------------------------------------------------------------我的博客地址:https://blog.csdn.net/qq_73797346

if-else流程控制

单分支

官方流程控制参考链接

1.values文件部分示例,没有定义nodePort的端口是多少

service:xiuxian:type: NodePortports:port: 80targetPort: 80

2.service模版,如果判断类型为NodePort,就指定端口为 3080。==这里有个 -==取消换行

apiVersion: v1
kind: Service
metadata:name: {{ .Values.common.xiuxian.name }}
spec:type: {{ .Values.service.xiuxian.type | default "ClusterIP" }}selector:apps: xiuxianports:- port: 80targetPort: 80{{- if eq .Values.service.xiuxian.type "NodePort" }}nodePort: 3080{{ end }}

3.渲染结果为:

apiVersion: v1
kind: Service
metadata:name: xiuxian
spec:type: NodePortselector:apps: xiuxianports:- port: 80targetPort: 80nodePort: 3080

多分支

使用条件判断来设置 targetPort 的值:

if 语句根据 service.xiuxian.type 的值来设置 targetPort

  • 如果类型是 ClusterIPtargetPort80
  • 如果类型是 NodePorttargetPort81
  • 如果类型是 LoadBalancertargetPort82
  • 如果没有匹配的类型,默认将 ClusterIPtargetPort 设置为 83

1.查看values.yaml文件,这会最终影响if判断结果

[root@master23109-more-if]# cat values.yaml 
# 自定义默认字段 WZYdefault
WZYdefault:ImageTag: v1# 定义的是通用的字段
common:xiuxian:name: xiuxianlabels:apps: xiuxian# 定义deployment资源的相关字段
deploy:xiuxian:image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/appstag: ""replicas: 3# 定义service资源相关字段
service:xiuxian:#type: ClusterIPtype: NodePort#type: LoadBalancerports:port: 80targetPort: 80nodePort: 30080

2.service模版

[root@master231templates]# cat service.yaml 
apiVersion: v1
kind: Service
metadata:name: {{ .Values.common.xiuxian.name }}
spec:selector:apps: xiuxiantype: {{ .Values.service.xiuxian.type | default "ClusterIP" }}ports:- port: {{ .Values.service.xiuxian.ports.port | default 80 }}{{- if eq .Values.service.xiuxian.type "ClusterIP" }}targetPort: 80{{- else if eq .Values.service.xiuxian.type "NodePort" }}targetPort: 81nodePort: {{ .Values.service.xiuxian.ports.nodePort }}{{- else if eq .Values.service.xiuxian.type "LoadBalancer" }}targetPort: 82{{- else }}targetPort: 83{{- end }}

80
targetPort: 80
nodePort: 30080


2.service模版```yaml
[root@master231templates]# cat service.yaml 
apiVersion: v1
kind: Service
metadata:name: {{ .Values.common.xiuxian.name }}
spec:selector:apps: xiuxiantype: {{ .Values.service.xiuxian.type | default "ClusterIP" }}ports:- port: {{ .Values.service.xiuxian.ports.port | default 80 }}{{- if eq .Values.service.xiuxian.type "ClusterIP" }}targetPort: 80{{- else if eq .Values.service.xiuxian.type "NodePort" }}targetPort: 81nodePort: {{ .Values.service.xiuxian.ports.nodePort }}{{- else if eq .Values.service.xiuxian.type "LoadBalancer" }}targetPort: 82{{- else }}targetPort: 83{{- end }}

with指定作用域


http://www.ppmy.cn/embedded/148900.html

相关文章

aws(学习笔记第十九课) 使用ECS和Fargate进行容器开发

aws(学习笔记第十九课) 使用ECS和Fargate进行容器开发 学习内容&#xff1a; 使用本地EC2中部署docker应用使用ECS的EC2模式进行容器开发使用ECS的Fargate模式进行容器开发 1. 使用本地EC2中部署docker应用 docker整体 这里展示了docker的整体流程。 开发阶段 编写dockerfile…

比 SaaS 更具性价比,火山引擎云数仓 ByteHouse 上新“云托管”模式

本地部署、SaaS 部署、私有化部署.....都是常见的软件部署方式。企业往往从安全、成本、易用性等多角度综合选择部署方式。SaaS 往往被认为初始成本更低、具备更强扩展性&#xff0c;但由于数据存储在软件供应商的服务器上&#xff0c;一些对数据安全和隐私要求高的企业会对此存…

HarmonyOS NEXT 实战之元服务:静态案例效果--- 手机一键加速、手机垃圾清理

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; import { authentication } …

java高频面试之SE-05

面试官&#xff1a;java中为什么有多态&#xff1f; 面试官你好&#xff01;Java 中有多态主要是为了实现灵活性和可扩展性。通过多态&#xff0c;可以用统一的接口处理不同的对象&#xff0c;从而提高代码的可维护性和可复用性。以下是多态的几个关键原因&#xff1a; 1. 代…

不在广东想把自己的IP变成广东怎么办

点击这篇文章的读者中&#xff0c;很多可能需要将自己的本机IP地址修改为广东省的IP地址。那么如何操作才能切换到广东省呢&#xff1f;如果您人不在广东省内&#xff0c;但是在国内的其他地区&#xff0c;这时可使用支持切换IP地址的软件进行辅助。 随着代理IP技术在网络中得到…

如何根据一系列提交文件,匹配对应的git提交记录?用ai

显示提取提交文件记录的git历史&#xff08;用的豆包写一下&#xff09; 显示每次提交涉及的文件名及提交注释等基本信息 可以使用以下命令格式&#xff1a; git log --name-only --prettyformat:“%an - %s” myFolder/ –name-only选项的作用是在显示提交信息时&#xff0…

【Leetcode】855. 考场就座

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 在考场里&#xff0c;有 n n n 个座位排成一行&#xff0c;编号为 0 0 0 到 n − 1 n - 1 n−1。 当学生进入考场后&#xff0c;他必须坐在离最近的人最远的座位上。如果有多个…

C语言-基因序列转换独热码(one-hot code)

1.题目要求 (语言: C)在生物信息学家处理基因序列时&#xff0c;经常需要将基因序列转化为独热码&#xff0c;在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特&#xff0c;而且只有一个比特为1&#xff0c;其他全为0的一种码制。 如基因序列有四种状态&…