如何让Helm Chart兼容Mi与Gi内存单位并完成单位转换
实现Helm中内存单位的自动转换与后缀去除
直接用Helm模板的条件判断和内置函数就能搞定,给你两种可行的写法:
写法一:简单条件判断(适合只处理Mi/Gi的场景)
- name: RAM value: "{{- $memory := .Values.resources.requests.memory -}} {{- if contains \"Gi\" $memory -}} {{- mul (int (trimSuffix \"Gi\" $memory)) 1000 -}} {{- else if contains \"Mi\" $memory -}} {{- trimSuffix \"Mi\" $memory -}} {{- else -}} {{- $memory -}} # 可选:处理不带单位或其他单位的情况 {{- end -}}"
逻辑说明:
- 先把配置的内存值存到
$memory变量里,方便复用 - 判断如果是
Gi单位:先去掉Gi后缀转成整数,再乘以1000得到等价Mi数值 - 如果是
Mi单位:直接去掉后缀保留数字 - 最后一个
else分支可选,用来处理用户输入不带单位、或者其他单位(比如Ki)的情况,直接返回原数值
写法二:正则匹配(更严谨,过滤非法格式)
如果想确保只处理数字+Mi/Gi的合法格式,可以用正则提取数值和单位:
- name: RAM value: "{{- $memory := .Values.resources.requests.memory -}} {{- $matches := regexMatch \"^(\\d+)(Mi|Gi)$\" $memory -}} {{- if $matches -}} {{- $num := index $matches 1 | int -}} {{- $unit := index $matches 2 -}} {{- if eq $unit \"Gi\" -}} {{- mul $num 1000 -}} {{- else -}} {{- $num -}} {{- end -}} {{- else -}} {{- $memory -}} # 非法格式返回原内容 {{- end -}}"
逻辑说明:
- 用正则
^(\\d+)(Mi|Gi)$匹配纯数字+Mi/Gi的格式,提取出数字部分和单位部分 - 拿到数字和单位后,判断单位是Gi就乘以1000,否则直接返回数字
- 不匹配正则的内容会直接返回原数值,避免非法格式导致模板报错
注意:Helm模板里的双引号需要用\"转义,确保YAML语法合法;用{{- ... -}}是为了去除模板渲染时的多余空格,保证输出的数值干净。
内容的提问来源于stack exchange,提问作者rawwar
相关产品推荐
相关产品推荐

