You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Helm模板中检查ip_range注解并追加或新增值的实现方法

问题背景

现有Helm Chart模板定义如下:

  1. podAnnotations模板:
{{- define "deployAnnotations" -}}  
"key1" : "value1",  
"key2" : "value2"  
"ip_range": "20.20.20.20/32"  
{{- end -}}  
  1. 在deployment.yaml中引用该模板:
template:
    metadata:
      annotations: 
         {{ include "podAnnotations" . | nindent 8 }}
  1. 额外定义ipdeployAnnotations模板用于提供新的IP段:
{{- define "ipdeployAnnotations" -}}  
ip_range: 10.10.10.10/32  
{{- end -}}  

需求:检查podAnnotations中是否存在ip_range注解,若存在则将新IP段追加至原有值后;若不存在则新增该注解。用户尝试使用in运算符未成功,需可行实现方案。

推荐实现方案:基于字典的注解合并

直接操作字符串容易因格式变动出错,推荐将注解模板改为返回合法JSON结构,再通过Helm的字典处理函数实现合并逻辑,步骤如下:

1. 修正模板为JSON格式

首先将两个注解模板调整为返回合法JSON对象(注意语法修正,比如逗号、引号的正确使用):

修改podAnnotations模板

{{- define "podAnnotations" -}}
{
  "key1": "value1",
  "key2": "value2",
  "ip_range": "20.20.20.20/32"
}
{{- end -}}

修改ipdeployAnnotations模板

{{- define "ipdeployAnnotations" -}}
{
  "ip_range": "10.10.10.10/32"
}
{{- end -}}

2. 在Deployment中处理注解合并

在deployment.yaml中,通过fromJson将模板输出转为字典,再进行ip_range的检查与合并:

template:
  metadata:
    annotations:
      {{- # 将两个模板的JSON输出转为字典 -}}
      {{- $baseAnnotations := include "podAnnotations" . | fromJson -}}
      {{- $newIpAnnotation := include "ipdeployAnnotations" . | fromJson -}}
      
      {{- # 检查是否存在ip_range键 -}}
      {{- if hasKey $baseAnnotations "ip_range" -}}
        {{- # 追加新IP段到原有值 -}}
        {{- $_ := set $baseAnnotations "ip_range" (printf "%s,%s" $baseAnnotations.ip_range $newIpAnnotation.ip_range) -}}
      {{- else -}}
        {{- # 合并新注解到基础字典 -}}
        {{- $_ := merge $baseAnnotations $newIpAnnotation -}}
      {{- end -}}
      
      {{- # 将处理后的字典转回JSON并格式化输出 -}}
      {{- toJson $baseAnnotations | nindent 8 -}}

方案说明

  • fromJson:将模板输出的JSON字符串转为Helm可操作的字典对象
  • hasKey:检查字典中是否存在指定键(替代不可靠的字符串in检查)
  • set:修改字典中指定键的值,这里用printf拼接原有IP和新IP
  • merge:当不存在ip_range时,将新注解合并到基础字典中
  • toJson:将处理后的字典转回JSON字符串,配合nindent实现格式对齐
备选方案:字符串直接处理(不推荐)

若无法修改原有模板结构,可通过字符串匹配替换实现,但这种方式依赖原模板的固定格式,维护性差:

template:
  metadata:
    annotations:
      {{- $baseStr := include "podAnnotations" . | trim -}}
      {{- # 提取新IP段的值 -}}
      {{- $newIp := include "ipdeployAnnotations" . | trim | replace "ip_range:" "" | trim | trimAll "\"" -}}
      
      {{- if (contains "\"ip_range\":" $baseStr) -}}
        {{- # 替换原有ip_range值为拼接后的内容 -}}
        {{- $baseStr | replace "\"ip_range\": \"20.20.20.20/32\"" (printf "\"ip_range\": \"20.20.20.20/32,%s\"" $newIp) | nindent 8 -}}
      {{- else -}}
        {{- # 新增ip_range注解 -}}
        {{- printf "%s,\n        \"ip_range\": \"%s\"" ($baseStr | trimSuffix ",") $newIp | nindent 8 -}}
      {{- end -}}

内容的提问来源于stack exchange,提问作者SteveGr2015

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:36:23