helm函数

ops/2024/12/26 12:28:19/

默认函数介绍

在 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/ops/145126.html

相关文章

金融数据可视化实现

一、设计题目 金融数据可视化 二、设计目的 使学生掌握用Pandas第三方库数据计算、数据分析的知识与能力。Pandas是专门用于数据分析的库&#xff0c;其提供的read_excel()方法可以方便的读取xlsx格式的文件中的数据到Pandas中的DataFrame中。 DataFrame.plot(kindline)&am…

Echarts的高级使用,动画,交互api

加载动画 <script>// axisData 就是一个二维数组, 数组中的每一个元素还是一个数组, 最内层数组中有两个元素, 一个代表身高, 一个代表体重;var mCharts echarts.init(document.querySelector("div"));mCharts.showLoading();$.get("data/test_data.json…

【Ubuntu学习】另一个程序已锁定文件的一部分,进程无法访问

前言 启动Ubuntu系统时&#xff0c;提示错误 另一个程序已锁定文件的一部分&#xff0c;进程无法访问 打不开磁盘”C:\Users\ho\DocumentslVirtualMachines\Ho\Ho.vmdk"或它所依赖的某个快照磁盘。 模块"Disk”启动失败。。 未能能启动虚拟机。 原因 在虚拟机中&a…

optuna和 lightgbm

文章目录 optuna使用1.导入相关包2.定义模型可选参数3.定义训练代码和评估代码4.定义目标函数5.运行程序6.可视化7.超参数的重要性8.查看相关信息9.可视化的一个完整示例10.lightgbm实验 optuna使用 1.导入相关包 import torch import torch.nn as nn import torch.nn.functi…

sentinel来源访问控制(黑白名单)

很多时候&#xff0c;我们需要根据调用方来限制资源是否通过&#xff0c;这时候可以使用 Sentinel 的黑白名单控制的功能。黑白名单根据资源的请求来源&#xff08;origin&#xff09;限制资源是否通过&#xff0c;若配置白名单则只有请求来源位于白名单内时才可通过&#xff1…

Proteus仿真——《基于51单片机的水塔水位控制系统》

原理 本课题设计基于单片机的水塔水位控制系统&#xff0c;以AT89C51单片机为核心处理器设计单片机最小系统&#xff0c;外加数码管显示模块、液位传感器、AD转换电路、继电器电路与水泵、独立按键模块。系统的结构图如下&#xff1a; 系统实现原理 AT89C51单片机具有32个可编程…

用例图和活动图的区别与联系

在软件开发过程中&#xff0c;需求分析是至关重要的一步。为了更好地理解和描述系统的功能需求&#xff0c;开发人员通常会使用各种图形化工具。其中&#xff0c;用例图和活动图是两种非常常用的工具。虽然它们都用于描述系统的行为&#xff0c;但各自具有不同的特点和适用场景…

设计模式の中介者发布订阅备忘录模式

文章目录 前言一、中介者模式二、发布订阅模式三、备忘录模式 前言 本篇是关于设计模式中介者模式、观察者&#xff08;发布-订阅&#xff09;模式、以及备忘录模式的学习笔记。 一、中介者模式 中介者模式是一种行为型设计模式&#xff0c;其核心目的是为了减少对象之间的复杂…