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

如何为Kustomize文件添加逻辑:单Base文件生成多Ingress

问题描述

我正尝试使用Kustomize部署Kubernetes应用,目前已完成简单实现,现有如下ingress.yaml文件:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingressname
  namespace: namespace
  labels:
    app: appname  
spec:
  tls:
    - hosts:
        - $(variable1) 
      secretName: $(variable2)-tls

在各环境的overlays目录下,我通过kustomize.yaml在ConfigMap中配置变量值:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- path

configMapGenerator:
- behavior: merge
  literals:
  - variable1=foo
  - variable2=bar
  name: configmapname
images:
- name: imagename
  newName: registryurl

当前方案运行良好,但现在需要实现更复杂的需求:创建多个Ingress。我不想创建多个Base Ingress YAML文件,能否通过单个Base YAML文件,根据Overlay中的配置值生成所有所需Ingress?是否可行?

可行方案

当然可以实现,以下是几种无需创建多个Base Ingress文件的实用方法:

方法1:Kustomize组件+变量批量配置

  1. 将单个Ingress定义封装为Component,放在components/ingress-base/ingress.yaml中,把动态字段换成占位符:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-{{.NameSuffix}}
  namespace: namespace
  labels:
    app: appname  
spec:
  tls:
    - hosts:
        - {{.Host}}
      secretName: {{.SecretName}}-tls
  1. 在Overlay的kustomize.yaml中,先通过ConfigMap定义多组Ingress参数:
configMapGenerator:
- name: ingress-configs
  literals:
  - ingress1-host=foo.example.com
  - ingress1-secret=foo
  - ingress2-host=bar.example.com
  - ingress2-secret=bar
  1. 编写Patch Generator文件(如ingress-patch-gen.yaml),读取ConfigMap参数生成对应Ingress实例,每个实例单独配置变量映射即可。这种方法适合Ingress数量不多的场景。

方法2:自定义Generator脚本批量生成

如果需要批量生成大量Ingress,可编写Shell/Go脚本作为Kustomize的Generator:

  1. 创建ingress-generator.sh脚本,读取参数文件生成多份Ingress:
#!/bin/bash
cat <<EOF
apiVersion: v1
kind: List
items:
EOF
while read -r host secret name; do
  cat <<EOF
- apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    name: ingress-$name
    namespace: namespace
    labels:
      app: appname  
  spec:
    tls:
      - hosts:
          - $host
        secretName: $secret-tls
EOF
done < ingress-configs.txt
  1. 在Overlay目录下创建ingress-configs.txt,每行一组Ingress参数:
foo.example.com foo foo
bar.example.com bar bar
baz.example.com baz baz
  1. 在Overlay的kustomize.yaml中引入该Generator:
generators:
- command: ./ingress-generator.sh
  name: ingress-generator

运行kustomize build时,脚本会自动生成所有Ingress实例。

方法3:Helm模板+Kustomize结合

若熟悉Helm模板,可借助其循环能力生成多份Ingress后交给Kustomize处理:

  1. 创建Helm模板ingress-template.tpl:
{{- range .Values.ingresses }}
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-{{ .name }}
  namespace: namespace
  labels:
    app: appname  
spec:
  tls:
    - hosts:
        - {{ .host }}
      secretName: {{ .secret }}-tls
---
{{- end }}
  1. 在Overlay目录下创建values.yaml定义多组Ingress:
ingresses:
- name: foo
  host: foo.example.com
  secret: foo
- name: bar
  host: bar.example.com
  secret: bar
  1. 用Helm渲染模板生成YAML文件,再在kustomize.yaml中引用:
helm template . --values values.yaml > generated-ingresses.yaml
resources:
- generated-ingresses.yaml
总结

三种方法各有适用场景:方法1适合少量Ingress实例,方法2适合批量生成需求,方法3适合熟悉Helm的用户。根据实际需求选择即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:01:00