当前位置: 首页 > news >正文

helm的go模板语法学习

 1、helm chart

1.0、什么是helm?

介绍:就是个包管理器。理解为java的maven、linux的yum就好。
安装方法也可参见官网: https://helm.sh/docs/intro/install

通过前面的演示我们知道,有了helm之后应用的安装、升级、查看、停止都变得非常简单。
 

1.1、helm chart 及 相关介绍

1、什么是chart?

        一个chart就可以管理一个服务,一个chart就应该包括一个服务所需要的所有配置文件,例如 deployment、service、ingress、role、serviceaccount等。

        例如对于如下截图所示的服务有很多资源。没有chart的时候我们需要 kubectl apply -f a.yaml b.yaml …… 等进行启动,有了helm之后启动、升级、查看、停止等管理都变的很简单了。

2、关于chart的几个概念

①chart:就代表helm包,包含在k8s集群内部运行的程序、服务所需要的所有定义。

②repository(仓库):用来存放和共享charts的地方。

③release:运行在k8s集群中的chart的实例。一个chart可以在同一个集群中安装多次,每次都会创建一个新的release。

3、chart包中文件的组成形式及作用

各文件作用及解释如下:

(1)templates: 这个就是k8s资源声明的模板文件。

其中包括了一个服务所需要的deployment、service、ingress、configmap等所有需要用到的资源的模板。

注:“模板文件”的意思是文件的规范就是k8s资源描述规范,但是里面部分值信息是被模板化了的意思。

注:在执行helm install 安装时helm会把这里的模板文件和values.yaml中配置项的值结合起来,得到k8s的实际资源定义并应用到k8s上。

(2)values.yaml:主要用来保存一些可变参数(配置项),例如 版本、副本数等。

注:所以通过查看values.yaml我们就知道这个chart暴露了哪些参数给我们可以调。

(3)chart.yaml:描述chart信息的元数据,名称、描述、类型、版本号等基础信息。

(4)charts:里面包含的是子charts,一般用不到。

(5)NOTE.txt:安装成功的提示信息。注:里面也可以引用可变参数。

(6)_helpers.tpl:定义了一些函数供模板通过include的方式使用。

4、helmfile又是什么东西?

类比docker: helm 与 helmfile的关系 就是 docker 与 docker composer 的关系。

一个chart就可以对应成一个服务,helm就是负责部署单个chart的;—— 单兵。

helmfile则是用一份配置文件批量部署多个helm chart; —— 指挥多个单兵的长官。

什么情况需要用 helmfile?

  • ✅ 需要同时管理多个 Helm Chart

  • ✅ 环境配置复杂(开发/测试/生产/多集群)

  • ✅ 要求部署过程可重复、可版本化

如果只是部署单个应用,直接用 Helm 就够了!

一句话总结

Helmfile = Helm + 批量处理 + 环境管理 + 依赖控制


它让 Helm Chart 的复杂部署变得像点外卖一样简单——你只需要下一份订单(helmfile.yaml),剩下的交给它搞定!

helmfile 常用命令:

# 查看将要执行的操作(干跑测试)
helmfile diff# 部署所有 Chart
helmfile apply# 仅部署某个 Chart(如 frontend)
helmfile sync -l name=frontend# 卸载所有 Chart
helmfile destroy

1.2、helm 常用命令

1.2.1、安装与部署
#helm install 将chart安装到k8s集群,创建release
helm install my-nginx bitnami/nginx -n default
注:my-nginx 是 Release 名称,bitnami/nginx 是 Chart 名称,-n 指定命名空间#helm upgrade 升级已安装的 Release,应用新配置或新版本 Chart。
helm upgrade my-nginx bitnami/nginx --set replicaCount=2
注:修改副本数为 2,并更新 Release
1.2.2、仓库管理
#helm repo add 添加第三方 Chart 仓库。
helm repo add bitnami https://charts.bitnami.com/bitnami
注:添加 Bitnami 官方仓库#​​helm repo update​​ 更新本地缓存的仓库索引,获取最新 Chart 列表。
helm repo update
注:同步所有已添加仓库的最新信息
1.2.3、版本管理
#helm history 查看release的版本历史记录
helm history my-nginx
注:显示所有修订版本的部署时间和状态#helm rollback  回滚 Release 到指定历史版本。
helm rollback my-nginx 1
注:回滚到版本 1(通过 helm history my-nginx 查看版本号)

1.2.4、调试与开发

(1)helm template 

作用:本地渲染 Chart 的模板生成yaml文件,不实际部署。

helm template [RELEASE_NAME] [CHART] [flags]
helm template my-nginx ./mychart

注:预览 Chart 生成的 Kubernetes 资源清单

(2)helm lint

作用​​:检查 Chart 的语法和格式是否符合规范。

helm lint ./my-chart

(3)​​helm install --dry-run

作用​​:模拟安装过程,验证配置是否合法。

helm install my-nginx bitnami/nginx --dry-run --debug

注:输出渲染后的 YAML 文件但不实际部署

1.2.5、其他常用命令

(1)helm list 

作用​​:列出当前命名空间下的所有 Release。

helm list -n default

注:显示 default 命名空间已部署的 Release。

(2)helm show values

​作用​​:查看 Chart 的默认配置值。

helm show values bitnami/nginx

输出 values.yaml 的默认配置,供自定义覆盖

(3)helm uinstall

​作用​​:卸载并删除指定 Release。

helm uninstall my-nginx -n default

注:理 Release 相关资源

1.2.6、chart开发相关

(1)helm create

​作用​​:生成 Chart 模板目录结构。

helm create mychart

(2)helm package

​作用​​:将 Chart 目录打包为 .tgz 文件。

helm package ./my-chart

注:生成可分发或上传到仓库的 Chart 包。

2、go模板语法学习 —— 解读文件

 文件组织形式如下。

2.1、ingress.yaml及对应解释

先看一个ingress.yaml的case。 

#检查 values.yaml 中的 ingress.enabled 是否为true。只有为true才会渲染后续内容。
# "-"表示取出模板渲染是多余的空白符,避免生成多余的空白行。
{{- if .Values.ingress.enabled -}}
#使用的 api 版本
apiVersion: networking.k8s.io/v1
#资源类型是 ingress.
kind: Ingress
#接下来是元数据
metadata:# 使用helm助手函数 mychart.fullname 生成名称,通常在 _helpers.tpl 中定义,生成资源的名称。# include 表示引入标签模板???# . 表示传递当前作用域的上下文。name: {{ include "mychart.fullname" . }}labels:# 引入Chart中定义的通用标签,nindent 4 表示缩进4个空格(就是缩进4个空格的意思){{- include "mychart.labels" . | nindent 4 }}# 注解配置    晚点研究下什么叫注解配置??#如果 values.yaml 中定义了 ingress.annotations,则进入 with 块;此时,. 指向 annotations 对象。{{- with .Values.ingress.annotations }}annotations:# "toYaml .":将注解转换为YAML格式; "nindent 4":表示缩进4个空格。{{- toYaml . | nindent 4 }}{{- end }}
# 接下来才是 ingress 的规范
spec:# 如果配置了 ingress.className ,则设置 Ingress 类。{{- with .Values.ingress.className }}ingressClassName: {{ . }}{{- end }}# 然后是 tls 配置。如果配置了 TLS {{- if .Values.ingress.tls }}tls:#遍历 tls 配置列表{{- range .Values.ingress.tls }}- hosts:# 遍历每个 tls 中的 hosts 列表。 # quote 函数自动为域名添加引号(避免yaml解析问题){{- range .hosts }}- {{ . | quote }}{{- end }}#指定对应的 secretNamesecretName: {{ .secretName }}{{- end }}{{- end }}#接下来是路由规则rules:# 首先遍历所有的hosts配置{{- range .Values.ingress.hosts }}- host: {{ .host | quote }}http:paths:# 这里在遍历所有的paths{{- range .paths }}- path: {{ .path }}     #这个就是路径匹配规则了# "with .pathType":如果定义了 pathType(如 Prefix 或 Exact),则渲染该字段。{{- with .pathType }} #可选的路径类型pathType: {{ . }}{{- end }}#后端的指向。肯定是指向chart的主 Servicebackend:service:# $ 表示顶层作用域的上下文,避免别range或with覆盖name: {{ include "mychart.fullname" $ }}port:# "$.Values.service.port" 显示地指定从顶层作用域获取 service.port 值number: {{ $.Values.service.port }}{{- end }}{{- end }}
{{- end }}

2.2、deployment.yaml

#固定内容
apiVersion: apps/v1
#表示资源类型是deployment
kind: Deployment
#元数据
metadata:# 调用模板函数 mychart.fullname (通常在 _helpers.tpl中定义),生成deployment名称# . 表示传递当前上下文 ????????????????????????????????没懂什么意思??name: {{ include "mychart.fullname" . }}labels:# "mychart.labels" 也是在 _helpers.tpl 中定义的模板函数。注:定义了通用标签。{{- include "mychart.labels" . | nindent 4 }}
spec:# 如果 values.yaml 中的 autoscaling.enabled 为false就进入 if 块。# 这句话的意思是如果为启用自动扩缩容,则设置固定副本数为 values.yaml 中的 .replicaCount 值。{{- if not .Values.autoscaling.enabled }}replicas: {{ .Values.replicaCount }}{{- end }} #if块结束#pod选择器selector:matchLabels:# 同样这里也是使用 _helpers.tpl中定义 的模板函数 mychart.selectorLabels 获取选择器标签。{{- include "mychart.selectorLabels" . | nindent 6 }}#接下来是pod模板template:metadata:# with 表示如果对应字段存在就进入该字段的作用域{{- with .Values.podAnnotations }}annotations:# "toYaml ."表示将注解转换为yaml,并缩进8空格{{- toYaml . | nindent 8 }}{{- end }}#labels:# 使用 _helpers.tpl中定义的 "mychart.labels"函数;其定义的是通用标签。{{- include "mychart.labels" . | nindent 8 }}#然后是一个 with 块,引的是 values.yaml 中 .podLabels 字段定义的标签{{- with .Values.podLabels }}{{- toYaml . | nindent 8 }}{{- end }}# pod规则spec:# 如果配置了 values.yaml 中配置了 imagePullSecrets,则将其值转换成yaml放置过来,并缩进8空格。{{- with .Values.imagePullSecrets }}imagePullSecrets:{{- toYaml . | nindent 8 }}{{- end }} #最近的那个with块结束#使用 _helpers.tpl中定义 的模板函数 mychart.serviceAccountName 生成服务账号名称。serviceAccountName: {{ include "mychart.serviceAccountName" . }}# 如果values.yaml 中定义了 podSecurityContext(pod级安全上下文)则渲染{{- with .Values.podSecurityContext }}securityContext:{{- toYaml . | nindent 8 }}{{- end }}#接下来就是容器配置了containers:# .Chart.Name: 使用 Chart 名称作为容器名。Chart.yaml 中的name字段。- name: {{ .Chart.Name }}{{- with .Values.securityContext }}securityContext:{{- toYaml . | nindent 12 }}{{- end }}# 镜像名: values.yaml 中定义的 "image.repository"# 镜像标签: 优先使用 values.yaml 中定义的 image.tag; 如果没有就使用 Chart.yaml 中的 .AppVersion 兜底。image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"#镜像拉取策略: 采用 values.yaml 中定义的 .image.pullPolicyimagePullPolicy: {{ .Values.image.pullPolicy }}ports:- name: http#容器端口采用 values.yaml 中定义的 .service.port containerPort: {{ .Values.service.port }}protocol: TCP#下面就是配置健康检查#如果values.yaml中配置了 livenessProbe 就转换为yaml。{{- with .Values.livenessProbe }}livenessProbe:{{- toYaml . | nindent 12 }}{{- end }}#转换为yaml{{- with .Values.readinessProbe }}readinessProbe:{{- toYaml . | nindent 12 }}{{- end }}#转换为yaml 换成了资源{{- with .Values.resources }}resources:{{- toYaml . | nindent 12 }}{{- end }}#转换为yaml 换成了挂载{{- with .Values.volumeMounts }}volumeMounts:{{- toYaml . | nindent 12 }}{{- end }}# 转换为yaml 数据卷{{- with .Values.volumes }}volumes:{{- toYaml . | nindent 8 }}{{- end }}# 转换为yaml 节点选择器 指定pod调度到特定的节点{{- with .Values.nodeSelector }}nodeSelector:{{- toYaml . | nindent 8 }}{{- end }}#转换为yaml 亲和性{{- with .Values.affinity }}affinity:{{- toYaml . | nindent 8 }}{{- end }}#转换为yaml 容忍度{{- with .Values.tolerations }}tolerations:{{- toYaml . | nindent 8 }}{{- end }}

2.3、service.yaml及对应解释

#固定内容
apiVersion: v1
#类型是 service 表示声名一个 service 类型的资源
kind: Service
metadata:# 调用模板函数 mychart.fullname(通常在 _helpers.tpl 中定义),生成 Service 名称。name: {{ include "mychart.fullname" . }}labels:# 调用模板函数 mychart.labels _helpers.tpl 中定义),获取定义的通用标签。{{- include "mychart.labels" . | nindent 4 }}
spec:# 从values.yaml中读取 service.type 字段(如 ClusterIP、NodePort 等)。type: {{ .Values.service.type }}ports:# Service 暴露的端口,值来自 values.yaml 的 service.port。- port: {{ .Values.service.port }}# 固定值 http,表示将流量转发到 Pod 中名为 http 的容器端口(需与 Pod 定义一致)。targetPort: httpprotocol: TCPname: httpselector:# 调用模板生成选择器标签(需匹配 Pod 的标签)。{{- include "mychart.selectorLabels" . | nindent 4 }}

2.4、hpa.yaml

# 这是一个条件判断语句,检查 values.yaml 中 autoscaling.enabled 是否为 true。
# - 表示去除渲染时左侧的空白符(避免生成多余空行)。  只有当条件为真时,才会渲染后续内容。
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2
# 固定内容,声明这是一个 Kubernetes HPA 资源,使用 autoscaling/v2 API 版本。
kind: HorizontalPodAutoscaler
metadata:name: {{ include "mychart.fullname" . }}labels:{{- include "mychart.labels" . | nindent 4 }}
spec:# 指定 HPA 管理的目标资源(这里是一个 Deployment)。scaleTargetRef:apiVersion: apps/v1kind: Deployment# nclude "mychart.fullname" . 再次调用模板函数,确保名称与 Deployment 一致。name: {{ include "mychart.fullname" . }}# 从 values.yaml 中读取最小和最大副本数配置。minReplicas: {{ .Values.autoscaling.minReplicas }}maxReplicas: {{ .Values.autoscaling.maxReplicas }}# 扩缩容指标metrics:# 检查是否配置了 CPU 目标使用率(targetCPUUtilizationPercentage)。如果配置了,则渲染 CPU 指标部分。{{- if .Values.autoscaling.targetCPUUtilizationPercentage }}- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}{{- end }}# 同理,检查并渲染内存指标配置(如果存在)。{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}- type: Resourceresource:name: memorytarget:type: UtilizationaverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}{{- end }}
{{- end }}

2.6、_helper.tpl (定义模板函数的地方)

作用:其实就是定义了一些函数,可以再模板中通过 include 的方式调用。

{{/*
Expand the name of the chart.
*/}}
/*
作用: 生成 Chart 的基础名称。
如果 values.yaml 中定义了 nameOverride,则优先使用它,否则用 Chart.Name。
trunc 63:限制名称不超过 63 个字符(Kubernetes 命名规范)。
trimSuffix "-":删除末尾的短横线(避免无效命名)。
*/
{{- define "mychart.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
/*
作用:生成唯一的资源名称(通常用于 Deployment/Service 等)。
如果定义了 fullnameOverride,直接使用它。
否则,检查 Release 名是否已包含 Chart 名:如果包含(如 Release 名为 myapp-prod),直接使用 Release 名。否则拼接两者(如 prod-myapp)。
*/
{{- define "mychart.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}{{/*
Create chart name and version as used by the chart label.
*/}}
/*
作用:生成 Chart 的版本标签(用于元数据)。
拼接 Chart 名称和版本(如 myapp-1.0.0)。
replace "+" "_":替换版本中的 + 为 _(避免非法字符)。
*/
{{- define "mychart.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}{{/*
Common labels
*/}}
/*
作用:定义资源的通用标签(Labels)。
Chart 版本信息(helm.sh/chart)。
选择器标签(selectorLabels,见下文)。
应用版本(app.kubernetes.io/version,如果 Chart.AppVersion 存在)。
管理工具标识(通常是 Helm)。
*/
{{- define "mychart.labels" -}}
helm.sh/chart: {{ include "mychart.chart" . }}
{{ include "mychart.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}{{/*
Selector labels
*/}}
{{- define "mychart.selectorLabels" -}}
app.kubernetes.io/name: {{ include "mychart.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}{{/*
Create the name of the service account to use
*/}}
{{- define "mychart.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "mychart.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
{{- end }}

语法总结:

{{- define "name" -}}定义一个可复用的命名模板。
{{ include "func" . }}调用其他模板函数。
{{ default A B }}如果 B 为空,则返回 A。
{{ trunc 63 }}截断字符串到 63 字符。
{{ trimSuffix "-" }}删除末尾的短横线。
{{ $var := ... }}定义局部变量。
{{ if contains A B }}检查字符串 B 是否包含 A。
{{ printf "%s-%s" A B }}格式化字符串(类似 Python 的 f"{A}-{B}")。

2.7、values.yaml

作用:配置template中引用的属性对应的属性值的地方。

(1)基本格式语法

values.yaml 只需遵循一些约定和规则,并没有严格固定的格式:

1)遵循yaml语法:键值、缩进、列表都必须遵循标准yaml格式;

2)结构自由:你可以自定义字段名称和层级;注:要和template中的引用对应上。

(2)格式如何确定?

        由模板需求决定:values.yaml 的字段必须与 Chart 模板(templates/*.yaml)中通过 {{ .Values.xxx }} 引用的变量对应。例如:
        模板中引用 {{ .Values.replicaCount }},则 values.yaml 需要定义 replicaCount。

(3)常见的约定

虽然格式自由,但是一般会遵循如下模式。

# 基础配置
replicaCount: 1# 镜像配置
image:repository: nginxtag: "latest"pullPolicy: IfNotPresent# 服务配置
service:type: ClusterIPport: 80# 资源限制
resources:limits:cpu: 100mmemory: 128Mi# 自定义配置(根据应用需求)
config:env: "production"debug: false

2.9、go模板语法小结

语法作用
{{- ... -}}去除渲染后的空白符(左侧 - 删左空白,右侧 - 删右空白)。
.Values.xxx引用 values.yaml 中的字段。
include "func" .调用其他模板(如 _helpers.tpl 中的函数)。
with临时进入某个字段的作用域(如果字段存在)。
range遍历列表或字典。
quote为字符串添加引号(避免 YAML 解析问题)。
toYaml将对象转换为 YAML 格式。
nindent在缩进基础上添加换行符(保持格式对齐)。
$显式引用顶层作用域,避免被 range/with 覆盖。
’default‘设置默认值

2.8、部分语法解释

2.8.1、语法中 . 的含义

在 Helm Chart 的模板文件(如 deployment.yaml 或 ingress.yaml)中,. 是一个非常重要的概念,它代表 当前作用域的上下文对象。对于下面这行:

name: {{ include "mychart.fullname" . }}

1、"."的本质

(1)在helm模板中, . 是一个指向当前作用域数据的对象引用,类似于其他变成语言中的 thisself

(2)它最初指向 顶层对象, 包含:

  • Values:来自 values.yaml 的所有配置
  • Chart:来自 Chart.yaml 的元数据(如 Chart.Name、Chart.Version)
  • Release:部署相关的信息(如 Release.Name、Release.Namespace)
  • Files:访问 Chart 中的文件
  • Capabilities:Kubernetes 集群能力信息

注:.Values 、 .Chart 等就是这么来的!!!!!

2、在 include 函数中的作用

  • include 用于调用其他模板(如 _helpers.tpl 中定义的函数)。
  • 传递 . 的目的是让被调用的模板也能访问完整的上下文。例如:
# _helpers.tpl 中定义的函数
{{- define "mychart.fullname" -}}
{{- .Chart.Name }}-{{ .Release.Name }}
{{- end -}}

这里的 .Chart.Name 和 .Release.Name 就依赖于传入的 . 上下文。 

3. 为什么必须传递 .

如果不传递 .,被调用的模板将无法访问 Helm 的变量系统。例如:

# 错误!没有上下文,无法访问 .Chart.Name
name: {{ include "mychart.fullname" }}
4. 作用域变化时的注意事项

当进入 range 或 with 块时,. 会被临时覆盖,此时可能需要用 $ 访问顶层作用域:

{{- range .Values.pods }}
name: {{ include "mychart.fullname" $ }}  # 用 $ 指向顶层作用域
{{- end }}

2.8.2、helm chart使用的go模板提供的控制语句块梳理
2.8.2.1、if/else 条件块

作用:根据条件判断是否渲染内容。

{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
{{- else if .Values.service.enabled }}
apiVersion: v1
kind: Service
{{- else }}
# 默认内容
{{- end }}
2.8.2.2、with作用域块

作用:如果字段存在的话临时进入某字段的作用域,及那话嵌套字段访问。

{{- with .Values.resources }}
resources:limits:cpu: {{ .limits.cpu }}memory: {{ .limits.memory }}
{{- end }}

上述示例中的  {{ .Values.resources.limits.cpu }} 就等价于 with块内的 {{ .limits.cpu }}。

2.8.2.3、range迭代块

作用:遍历列表或字典。

示例:

--------------列表示例--------------
env:
{{- range .Values.envVars }}- name: {{ .name }}value: {{ .value | quote }}
{{- end }}#对应如下输入:
envVars:- name: DB_HOSTvalue: db.example.com- name: LOG_LEVELvalue: debug---------------字典示例-------------
{{- range $key, $value := .Values.labels }}{{ $key }}: {{ $value | quote }}
{{- end }}
2.8.2.4、define模板定义块

作用:定义可复用的命名模板(通常在 _helpers.tpl 中)。

{{- define "mychart.fullname" -}}
{{- .Chart.Name }}-{{ .Release.Name }}
{{- end -}}# 调用方式
metadata:name: {{ include "mychart.fullname" . }}
2.8.2.5、template模板调用块

作用:调用已定义的模板(旧语法,推荐用 include 代替)。

2.8.2.6、include函数调用块

作用:调用模板并支持管道操作(比 template 更灵活)。

labels:{{- include "mychart.selectorLabels" . | nindent 4 }}
2.8.2.7、indent/nindent 缩进块

作用:控制内容的缩进(非逻辑块,常用于格式化输出)

2.8.2.8、toYaml转换块

作用:将对象转换为yaml格式(常与 indent 配合)

{{- with .Values.affinity }}
affinity:{{- toYaml . | nindent 2 }}
{{- end }}
2.8.2.9、required必填验证块

作用:强制要求字段必须填写,否则报错。

image: {{ required "image.repository is required!" .Values.image.repository }}
2.8.2.10、default默认值块

作用:为变量提供默认值

imageTag: {{ .Values.image.tag | default .Chart.AppVersion }}
2.8.2.11、printf格式化块

作用:格式化字符串输出

{{- printf "%s-%s" .Chart.Name .Release.Name | lower }}
2.8.2.12、 $ 和 .
  • .:当前作用域对象(随块变化)。

  • $:始终指向根作用域(用于突破嵌套块)。

附录: values.yaml 

/*这个就是具体属性值的文件了。
*/
# Default values for mychart.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.# This will set the replicaset count more information can be found here: https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/
replicaCount: 1# This sets the container image more information can be found here: https://kubernetes.io/docs/concepts/containers/images/
image:repository: nginx# This sets the pull policy for images.pullPolicy: IfNotPresent# Overrides the image tag whose default is the chart appVersion.tag: ""# This is for the secrets for pulling an image from a private repository more information can be found here: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
imagePullSecrets: []
# This is to override the chart name.
nameOverride: ""
fullnameOverride: ""# This section builds out the service account more information can be found here: https://kubernetes.io/docs/concepts/security/service-accounts/
serviceAccount:# Specifies whether a service account should be createdcreate: true# Automatically mount a ServiceAccount's API credentials?automount: true# Annotations to add to the service accountannotations: {}# The name of the service account to use.# If not set and create is true, a name is generated using the fullname templatename: ""# This is for setting Kubernetes Annotations to a Pod.
# For more information checkout: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
podAnnotations: {}
# This is for setting Kubernetes Labels to a Pod.
# For more information checkout: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
podLabels: {}podSecurityContext: {}# fsGroup: 2000securityContext: {}# capabilities:#   drop:#   - ALL# readOnlyRootFilesystem: true# runAsNonRoot: true# runAsUser: 1000# This is for setting up a service more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/
service:# This sets the service type more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-typestype: ClusterIP# This sets the ports more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/#field-spec-portsport: 80# This block is for setting up the ingress for more information can be found here: https://kubernetes.io/docs/concepts/services-networking/ingress/
ingress:enabled: falseclassName: ""annotations: {}# kubernetes.io/ingress.class: nginx# kubernetes.io/tls-acme: "true"hosts:- host: chart-example.localpaths:- path: /pathType: ImplementationSpecifictls: []#  - secretName: chart-example-tls#    hosts:#      - chart-example.localresources: {}# We usually recommend not to specify default resources and to leave this as a conscious# choice for the user. This also increases chances charts run on environments with little# resources, such as Minikube. If you do want to specify resources, uncomment the following# lines, adjust them as necessary, and remove the curly braces after 'resources:'.# limits:#   cpu: 100m#   memory: 128Mi# requests:#   cpu: 100m#   memory: 128Mi# This is to setup the liveness and readiness probes more information can be found here: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
livenessProbe:httpGet:path: /port: http
readinessProbe:httpGet:path: /port: http# This section is for setting up autoscaling more information can be found here: https://kubernetes.io/docs/concepts/workloads/autoscaling/
autoscaling:enabled: falseminReplicas: 1maxReplicas: 100targetCPUUtilizationPercentage: 80# targetMemoryUtilizationPercentage: 80# Additional volumes on the output Deployment definition.
volumes: []
# - name: foo
#   secret:
#     secretName: mysecret
#     optional: false# Additional volumeMounts on the output Deployment definition.
volumeMounts: []
# - name: foo
#   mountPath: "/etc/foo"
#   readOnly: truenodeSelector: {}tolerations: []affinity: {}

相关文章:

helm的go模板语法学习

1、helm chart 1.0、什么是helm? 介绍:就是个包管理器。理解为java的maven、linux的yum就好。 安装方法也可参见官网: https://helm.sh/docs/intro/install 通过前面的演示我们知道,有了helm之后应用的安装、升级、查看、停止都…...

Windows 图形显示驱动开发-WDDM 1.2功能—Windows 8 中的 DirectX 功能改进(一)

Windows 8包括 Microsoft DirectX 功能改进,使开发人员、最终用户和系统制造商受益。 功能改进在以下几个方面: 像素格式 (5551、565、4444) :在低功耗硬件配置下,DirectX 应用程序的性能更高。双精度着色器功能:高级…...

软件测试|App测试面试相关问题(2)

一、App 稳定怎么做的?Monkey 怎么用(App 稳定测试)? 稳定性这块,我们当时用的是SDK 自动的一个Monkey 工具进行测试的,其实Monkey工具主要通过模拟用户发送伪随机时间去操作软件,通过执行Monkey 命令,它会自动出报告&#xff…...

模拟电路需要了解的一些基础知识(部分)

基本的单路元件 1. 电阻;特性:阻碍电流流动,消耗电能并转化为热能(遵循欧姆定律)。是无源元件,应用:限流、分压、发热等; 2. 电容;特性:存储电荷和电场能&am…...

[特殊字符] MySQL MCP 开发实战:打造智能数据库操作助手

💡 简介:本文详细介绍如何利用MCP(Model-Control-Panel)框架开发MySQL数据库操作工具,使AI助手能够直接执行数据库操作。 📚 目录 引言MCP框架简介项目架构设计开发环境搭建核心代码实现错误处理策略运行和…...

软考备考(一)学习笔记

一、软考介绍 计算机软考,计算机技术与软件专业技术资格(水平)考试 一年考试两次: 一次上旬(5月底),下旬一次(11月初) 初级资格:程序员 中级资格: 软件设计师 高级资格: 系统架构设计师 初级: 科目一:计算机硬软件基础知识 150min 笔试、选择 科目二:程序设…...

Linux环境变量

目录 环境变量 基本概念 常见环境变量 查看环境变量方法 测试PATH 测试HOME 和环境变量相关的命令 环境变量的组织方式 通过代码如何获取环境变量 通过系统调用获取或设置环境变量 ​编辑 环境变量通常是具有全局属性的 实验 环境变量 基本概念 环境变量(environment variables…...

跨浏览器书签同步方案:WebDAV + Floccus插件实操指南

FloccusWebDAV能够帮助把多个不同浏览器书签统一私有化管理,以下是介绍: Floccus 是一个允许用户在不同浏览器和设备之间私密同步书签的扩展,开源地址:https://github.com/floccusaddon/floccusWebDAV是一种基于HTTP的协议&#…...

银河麒麟系统 达梦8 安装 dlask 框架后端环境

适配的一套环境为 dmPython2.5.8 dmSQLAlchemy1.4.39 Flask2.0.3 Flask-Cors3.0.10 Flask-SQLAlchemy2.5.1 SQLAlchemy1.4.54 Werkzeug2.2.2其中 # sqlalchemy-dm1.4.39 通过dmdbms目录内文件进行源码安装 (MindSpore) [ma-user python]$pwd /home/syl/dmdbms/drivers/python…...

代码随想录算法训练营Day31

力扣738.单调递增的数字【medium】 力扣968.监控二叉树【hard】 一、力扣738.单调递增的数字【medium】 题目链接:力扣738.单调递增的数字 视频链接:代码随想录 1、思路 先将整数转为字符串变成可迭代对象,再转为列表从后向前遍历&#xff…...

LeetCode Hot100 刷题笔记(10)—— ACM格式输入输出练习

目录 Trick: 1. 只有输出 2. 单组_AB 3. 多组_AB_EOF形式 4. 多组_AB_T组形式 5. 多组_AB_零尾形式 6. 单组_一维数组 7. 多组_二维数组_T组形式 8. 单组_二维数组 9. 多组_二维数组_T组形式 10. 单组_字符串 11. 多组_字符串_T组形式 12. 单组_二维字符数组 13. 多组_带空格的…...

iPaaS集成平台在制造业有哪些应用场景

在制造业迈向智能化的进程中,“数据不通”“系统割裂”“响应迟缓”等问题如同隐形的锁链,束缚着企业转型升级的步伐。面对设备、系统、供应链之间错综复杂的连接需求,传统定制化开发周期长、成本高,难以满足快速变化的业务需求。…...

【Docker项目实战】使用Docker部署Gitblit服务器

【Docker项目实战】使用Docker部署Gitblit服务器 一、Gitblit介绍1.1 Gitblit 介绍1.2 主要特点 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Gitblit镜像五、部署Gitbli…...

基于瑞芯微RK3562 四核 ARM Cortex-A53 + 单核 ARM Cortex-M0——Linux应用开发手册

前 言 本文主要介绍TL3562-MiniEVM评估板的AMP(Asymmetric Multi-processing)开发案例,适用开发环境如下: Windows开发环境:Windows 7 64bit、Windows 10 64bit Linux开发环境:VMware16.2.5、Ubuntu20.04.6 64bit U-Boot:U-Boot-2017.09 Kernel:Linux-5.10.209 Lin…...

并查集(力扣1971)

并查集的功能&#xff1a;判断两个节点是否在同一个集合中/将两个节点加入同一集合中。模板如下&#xff1a; #include<iostream> #include<vector> using namespace std; const int n 1e6 5;//视题目具体节点数量而定&#xff0c;比节点数量稍大即可 vector<…...

Pinpoint - 大型分布式系统的 APM(应用性能管理)工具

文章目录 一、关于 Pinpoint最新版本&#xff08;2024/10/23&#xff09;-- v3.0.1PHP, PYTHON 二、概述支持的模块 一、关于 Pinpoint Pinpoint 是一个用于大型分布式系统的 APM&#xff08;应用性能管理&#xff09;工具&#xff0c;由 Java / PHP/PYTHON 编写。 受 Dapper …...

高级java每日一道面试题-2025年4月10日-微服务篇[Nacos篇]-Nacos的服务健康检查机制是如何工作的?

如果有遗漏,评论区告诉我进行补充 面试官: Nacos的服务健康检查机制是如何工作的&#xff1f; 我回答: Nacos 服务健康检查机制详解 Nacos 的服务健康检查机制是确保服务高可用性和可靠性的核心功能之一。它通过定期检测服务实例的状态来判断它们是否健康&#xff0c;并据此…...

JavaScript:表单及正则表达式验证

今天我要介绍的是在JavaScript中关于表单验证内容的知识点介绍&#xff1a; 关于表单验证&#xff0c;我接下来则直接将内容以及效果显示出来并作注解&#xff0c;这样可以清晰看见这个表达验证的妙用&#xff1a; <form id"ff" action"https://www.baidu.…...

Android 应用数据分布目录结构解析

在Android系统中&#xff0c;/data目录下的几个关键路径有不同的用途&#xff0c;主要涉及应用数据存储和用户媒体文件管理,具体如下&#xff1a; 1. /data/user/0/ 路径别名&#xff1a;等同于 /data/data/&#xff08;旧路径&#xff0c;仍兼容&#xff09;。 用途&#xff…...

Spring Boot 中的自动配置原理

2025/4/6 向全栈工程师迈进&#xff01; 一、自动配置 所谓的自动配置原理就是遵循约定大约配置的原则&#xff0c;在boot工程程序启动后&#xff0c;起步依赖中的一些bean对象会自动的注入到IOC容器中。 在讲解Spring Boot 中bean对象的管理的时候&#xff0c;我们注入bean对…...

Java内部类详解

在Java中&#xff0c;内部类是一种强大的特性&#xff0c;允许将一个类定义在另一个类的内部。内部类提供了更好的封装性&#xff0c;能够访问外部类的成员&#xff0c;并常用于实现事件监听、适配器模式等场景。本文将深入探讨四种内部类&#xff1a;成员内部类、静态内部类、…...

台账自动统计——餐饮物资管理台账——仙盟共创平台——未来之窗

分类表 自动统计 创作不易&#xff0c;使用地址&#xff1a;https://mp.weixin.qq.com/s/Ok3wuSYAPhd-6N8DrK7jwg 餐饮物资管理台账自动统计能够实时、精准地呈现库存数量。通过对采购入库、领用出库、盘点盈亏等数据的自动记录与计算&#xff0c;管理者随时可获取准确库存信息…...

Function Calling是什么?

Function Calling&#xff08;函数调用&#xff09;是大型语言模型&#xff08;如GPT、Claude等&#xff09;中的一项关键功能&#xff0c;允许模型根据用户输入的需求&#xff0c;智能识别并返回结构化函数调用请求&#xff0c;从而与外部工具、API或代码进行交互。以下是详细…...

[学习] C语言数据结构深度解析:八种树结构与应用场景详解(代码示例)

C语言数据结构深度解析&#xff1a;八种树结构与应用场景详解 好吧&#xff0c;今天我们来研究树&#xff01;C语言中的树。 树是计算机科学中最重要的非线性数据结构之一&#xff0c;广泛应用于操作系统、数据库、编译器、图形学等领域。本文将通过C语言代码示例&#xff0c…...

【从零实现高并发内存池】Page Cache 从理解设计到全面实现

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

6 CMD 与 PowerShell 指令大全、C 程序终端运行、字符编码切换指南

1 CMD 与 PowerShell 常用指令 在命令行环境中高效运行程序&#xff0c;掌握终端的基本操作命令至关重要。无论是 Windows 系统下的 CMD&#xff08;命令提示符&#xff09;还是 PowerShell&#xff0c;它们都配备了一系列实用的命令&#xff0c;助力我们管理文件、执行程序以及…...

为啥mac日历打不开浏览器

问题 换了新电脑后&#xff0c;mac上的日历总是没法同步google日历信息&#xff0c;导致经常错过会议 尝试mac日历上添加账户&#xff0c;结果到了打开浏览器缓解总是卡住&#xff0c;打不开浏览器&#xff08;safari&#xff09; 解决 检查默认浏览器设置确保已将所需的浏览…...

spring:注解@PostConstruct、@PreDestroy

这两个注解的功能类似标签中的init-method和destroy-method。分别在构造方法调用之后和实例释放资源之前被调用。 注解类&#xff1a; package com.annotation.dao.impl;import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation…...

Androidjetpack之viewmodel的原理分析

前言 viewmodel是jetpack中比较重要的一个组件。如果还没有学习viewmodel不知道怎么写代码什么的&#xff0c;可以看一下我之前写得文章。 jetpack之ViewModel的简单使用https://blog.csdn.net/i_xiang_la_shi/article/details/147218033?fromshareblogdetail&sharetype…...

springboot启动动态定时任务

1.自定义定时任务线程池 package com.x.devicetcpserver.global.tcp.tcpscheduler;import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotatio…...

Dify智能体平台源码二次开发笔记(7) - 优化知识库pdf识别(2)

目录 前言 设计方案 代码具体优化 前言 补充前篇的一些优化。 场景是识别pdf文档&#xff0c;但还需要把pdf文档中的图片也保存下来&#xff0c;在知识库增强检索的时候&#xff0c;直接可以显示图片。 设计方案 1、保存知识库中的图片 2、存入我们的文件服务器中&#xff0…...

Linux——进程通信

我们知道&#xff0c;进程具有独立性&#xff0c;各进程之间互不干扰&#xff0c;但我们为什么还要让其联系&#xff0c;建立通信呢&#xff1f;比如&#xff1a;数据传输&#xff0c;资源共享&#xff0c;通知某个事件&#xff0c;或控制某个进程。因此&#xff0c;让进程间建…...

AF3 create_alignment_db_sharded脚本create_shard函数解读

AlphaFold3 create_alignment_db_sharded 脚本在源代码的scripts/alignment_db_scripts文件夹下。 该脚本中的 create_shard 函数的功能是将一部分链&#xff08;shard_files&#xff09;中的所有对齐文件写入一个 .db 文件&#xff0c;并返回这些链的索引信息&#xff08;字节…...

Jetpack Compose 实现主页面与局部页面独立刷新的最佳实践

在 Jetpack Compose 开发中&#xff0c;我们经常遇到这样的需求&#xff1a;主页面包含局部页面&#xff0c;主页面刷新时需要更新局部页面&#xff0c;同时局部页面也需要能独立刷新。本文将介绍几种优雅的实现方案。 核心需求 主页面刷新时能触发局部页面更新局部页面能独立…...

KingbaseES之数据库审计

项目提出要配置数据库审计,来满足分保测评得要求.正好最近做过审计测试,还原下审计配置. 一.开启审计 [kingbaserack1 ~]$ vi /data/data_mysql/kingbase.conf [kingbaserack1 ~]$ sys_ctl -D /data/data_mysql restart grep -r shared_preload_libraries /data/data_mysql/k…...

类的加载过程

1、加载 双亲委派模型&#xff08;启动类》扩展类》应用类&#xff09; 2、验证 文件格式验证&#xff08;Class 文件格式检查&#xff09;元数据验证&#xff08;字节码语义检查&#xff09;字节码验证&#xff08;程序语义检查&#xff09;符号引用验证&#xff08;类的正确…...

小白工具视频转 3GP,多格式转换与数据安全的完美结合,在线使用

在众多在线视频转换工具中&#xff0c;小白工具的视频转 3GP 功能&#xff08;https://www.xiaobaitool.net/videos/convert-to-3gp/ &#xff09;凭借其出色的性能和丰富的功能脱颖而出&#xff0c;是进行视频格式转换的优质选择。 一、强大的多格式支持 这款工具支持 MP4、…...

六根觉性:穿透表象的清净觉知之光

在喧嚣的禅堂里&#xff0c;老禅师轻叩茶盏&#xff0c;清脆的声响划破沉寂。这声"叮"不仅震动耳膜&#xff0c;更叩击着修行者的心性——这正是佛教揭示的六根觉性在世间万相中的妙用。当我们凝视《楞严经》中二十五圆通法门&#xff0c;六根觉性犹如六道澄明之光&a…...

Redis的IO多路复用

1 传统的socket编码模型 传统 Socket 模型通常采用 多线程/多进程 或 阻塞 I/O 的方式处理网络请求。以下是典型实现步骤&#xff1a; 创建套接字&#xff08;Socket&#xff09; 步骤&#xff1a;调用 socket() 创建一个 TCP/UDP 套接字。通常把这个套接字称为【主动套接字】…...

数据结构和算法(六)--栈队列堆

一、栈 栈(stack)是限制插入和删除只能在一个位置上进行的表&#xff0c;该位置是表的末端&#xff0c;叫做栈顶&#xff08;top&#xff09;。它是后进先出&#xff08;LIFO&#xff09;的。对栈的基本操作只有 push&#xff08;进栈&#xff09;和 pop&#xff08;出栈&#…...

js中显示为[object Object]

现象描述&#xff1a; 读取文件并解析数据&#xff0c;遇到变量在使用时异常&#xff0c;通过log输出进行调试&#xff0c;显示为[object,Object]。 分析&#xff1a; [object,Object]表示这是一个对象&#xff0c;其构造函数返回一个对象。 解决方法&#xff1a; 用JSON进行…...

安装matlab R2021b

安装步骤 说明&#xff1a; 以下步骤都是根据R2021b_Windows\Crack_ReadmeWin.txt文件里的内容翻译的。 1&#xff09;打开安装包根目录&#xff0c;如下&#xff1a; 2&#xff09;双击R2021b_Windows.iso文件&#xff0c;自动装载进虚拟光驱里&#xff0c;目录入下&…...

Redisson分布式锁深度解析:原理、源码与最佳实践

什么是Redisson分布式锁&#xff1f; 分布式锁是分布式系统中确保资源互斥访问的核心机制&#xff0c;而Redisson作为基于Redis的Java客户端&#xff0c;提供了高效且功能丰富的分布式锁实现。本文将深入剖析Redisson分布式锁的实现原理、核心机制及源码细节&#xff0c;并结合…...

isNaN、Number.isNaN、lodash.isNaN 的区别

isNaN、Number.isNaN、lodash.isNaN 的区别 一、isNaN() 的作用二、什么是 NaN&#xff1f;三、isNaN() 的必要性四、isNaN() 比较1. 全局的isNaN()2. Number.isNaN()3. lodash.isNaN() 五、总结六、附加 一、isNaN() 的作用 检查是否为 NaN 的值&#xff0c;是返回 true&…...

全面解析Flutter中的Stream用法及实际应用

Flutter中的Stream详解 目录 什么是StreamStream的分类Stream的基础用法Stream的常用方法实际应用场景完整示例:计数器应用总结参考文章 1. 什么是Stream 在Flutter开发中&#xff0c;Stream是一种强大的异步数据流处理工具。它类似于广播频道&#xff0c;能够持续推送数据…...

网络请求——微信小程序学习笔记

1. 前言 发起网络请求&#xff0c;即发起HTTPS网络请求 &#xff0c;注意必须是HTTPS。 2. 使用前注意事项 使用前注意事项可参考官网文档&#xff1a; 基础能力 / 网络 / 使用说明 简单的来说&#xff0c;为了安全&#xff0c;服务器域名必须要备案&#xff0c;如果只是想…...

Oracle19C低版本一天遭遇两BUG(ORA-04031/ORA-600)

昨天帮朋友看一个系统异常卡顿的案例&#xff0c;在这里分享给大家 环境&#xff1a;Exadata X8M 数据库版本19.11 1.系统报错信息 表象为系统卡顿&#xff0c;页面无法刷出&#xff0c;登陆到主机上看到节点1 系统等待存在大量的 cursor: pin S wait on X等待 查看两个节…...

车机系统夏令时设置功能的说明

车机系统夏令时设置功能的说明 基本原理&#xff0c;夏令时&#xff0c;也就daylight saving time。据说古时候&#xff0c;电费比较贵&#xff0c;为了多采用白天自然光照明&#xff0c;通过行政的方式&#xff0c;调节上班时间。使大家能充分使用白天的时间干活&#xff0c;…...

DeepSeek+大数据分析快速应用落地

一、环境准备 1、准备一个 hive 的环境&#xff0c;并可以进行远程连接 2、环境中安装有 sqoop 和 mysql 3、DeepSeek 我使用的是 《问小白》 注册地址&#xff1a;打开问小白&#xff0c;填入我的分享码【1VYXOI】使用满血DeepSeek R1&#xff0c;零延迟、不卡、不限次、不…...

web前端开发:CSS的常用选择器

CSS常用选择器 CSS选择器是用于精准定位HTML元素并对其应用样式的核心工具。它的作用类似于“筛选器”&#xff0c;通过特定规则匹配文档中的元素&#xff0c;从而实现样式控制。 核心作用 定位元素 通过元素名称、类名、ID、属性等条件&#xff0c;快速找到需要样式化的目标元…...