Kubernetes YAML模板是否支持for循环批量生成配置项?
原生Kubernetes本身不支持在YAML配置中直接使用for循环这类逻辑语法,K8s API只接收渲染完成的静态YAML资源。你要实现批量生成环境变量配置的需求不需要自己写脚本处理,有非常成熟的现成方案,甚至可以直接复用你当前用的XLDeploy能力:
直接使用XLDeploy自带的模板循环能力
你当前已经在用XLDeploy做配置注入,XLDeploy的部署模板默认支持Freemarker(部分版本支持Jinja2)语法,本身就内置循环遍历逻辑,不需要额外引入其他工具。你写的伪循环逻辑只需要替换成对应模板引擎的合法语法即可,比如Freemarker版本的实现和你预期的效果几乎一致,还能兼容你当前已有的第一个数据库不带数字后缀的配置命名规则:template: (...) containers: (...) env: <#list 1..prj.database.number?number as i> <#if i == 1> - name: DATABASE_NAME value: "{{prj.database.name}}" - name: DATABASE_USER valueFrom: secretKeyRef: name: "{{ k8s.deploy.app.secret.name }}" key: database_user <#else> - name: DATABASE_NAME_${i} value: "{{prj.database.name.second}}" - name: DATABASE_USER_${i} valueFrom: secretKeyRef: name: "{{ k8s.deploy.app.secret.name }}" key: database_user_${i} </#if> </#list>配置完成后你只需要在XLDeploy中给不同项目设置
prj.database.number的数值、填充对应数据库配置项即可,不需要手动修改模板重复复制代码段。使用Kubernetes生态通用模板工具Helm
如果你希望模板不绑定XLDeploy能力,可以用K8s生态最通用的Helm包管理工具,它自带的模板引擎原生支持range循环,完全匹配你的需求。你只需要在Helm的Values配置中把数据库定义为可变长度的数组,模板中循环遍历数组生成env配置即可:# Values配置(给不同项目部署时只需要修改这个配置,不需要改模板) databaseList: - name: primary_db userKey: database_user - name: second_db userKey: database_user_2 secretName: app-db-secret对应模板中的env部分写法:
env: {{- range $idx, $db := .Values.databaseList }} - name: DATABASE_NAME_{{ $idx }} value: {{ $db.name }} - name: DATABASE_USER_{{ $idx }} valueFrom: secretKeyRef: name: {{ $.Values.secretName }} key: {{ $db.userKey }} {{- end }}Helm会在部署前自动把模板渲染成静态YAML提交给K8s集群,不需要手动处理渲染逻辑。
其他可选方案
如果你不想用模板语法,也可以用Kustomize的配置生成能力、或者ytt这类轻量YAML渲染工具实现类似的批量生成效果,都不需要自己从零写脚本拼接YAML。只有当你有非常特殊的自定义逻辑、所有现成工具都无法满足需求时,才需要考虑用Python/Shell等脚本自行渲染最终YAML文件。
内容的提问来源于stack exchange,提问作者BeGreen

