如何为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组件+变量批量配置
- 将单个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
- 在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
- 编写Patch Generator文件(如
ingress-patch-gen.yaml),读取ConfigMap参数生成对应Ingress实例,每个实例单独配置变量映射即可。这种方法适合Ingress数量不多的场景。
方法2:自定义Generator脚本批量生成
如果需要批量生成大量Ingress,可编写Shell/Go脚本作为Kustomize的Generator:
- 创建
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
- 在Overlay目录下创建
ingress-configs.txt,每行一组Ingress参数:
foo.example.com foo foo bar.example.com bar bar baz.example.com baz baz
- 在Overlay的
kustomize.yaml中引入该Generator:
generators: - command: ./ingress-generator.sh name: ingress-generator
运行kustomize build时,脚本会自动生成所有Ingress实例。
方法3:Helm模板+Kustomize结合
若熟悉Helm模板,可借助其循环能力生成多份Ingress后交给Kustomize处理:
- 创建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 }}
- 在Overlay目录下创建
values.yaml定义多组Ingress:
ingresses: - name: foo host: foo.example.com secret: foo - name: bar host: bar.example.com secret: bar
- 用Helm渲染模板生成YAML文件,再在
kustomize.yaml中引用:
helm template . --values values.yaml > generated-ingresses.yaml
resources: - generated-ingresses.yaml
总结
三种方法各有适用场景:方法1适合少量Ingress实例,方法2适合批量生成需求,方法3适合熟悉Helm的用户。根据实际需求选择即可。
内容的提问来源于stack exchange,提问作者nray
相关产品推荐
相关产品推荐

