Я пытаюсь развернуть приложение K8s с помощью Kustomize. До сих пор я делал простые реализации, в которых у нас есть несколько файлов K8s, таких как 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, который дает значения в карте конфигурации:
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
Это работает хорошо, но теперь мне нужно сделать что-то более сложное. Скажем, например, у меня есть несколько входов. Как создать один базовый файл yaml вместо создания нескольких базовых входных файлов yaml, который создает каждый вход на основе значений в моем файле наложения? Это возможно?

Kustomize не является системой шаблонов и не выполняет подстановку переменных. Он может выполнять различные трюки с исправлением YAML, поэтому у вас есть один вариант — начать с базового манифеста, подобного этому:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingressname
spec:
tls:
- hosts: []
secretName:
А затем исправьте его в своих kustomization.yaml файлах:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
patches:
- target:
kind: Ingress
name: ingressname
patch: |
- op: replace
path: /spec/tls
value:
- hosts:
- host1.example.com
secretName: host1-tls
То, что я показал здесь, хорошо работает, если у вас есть приложение, состоящее из одного Ingress, и вы хотите создать несколько вариантов (может быть, по одному на кластер, или на пространство имен, или что-то еще). То есть у вас есть:
Тогда у вас будет один каталог для каждого варианта приложения, что даст вам что-то вроде макета:
.
├── base
│ ├── deployment.yaml
│ ├── ingress.yaml
│ ├── kustomization.yaml
│ └── service.yaml
└── overlays
├── variant1
│ └── kustomization.yaml
└── variant2
└── kustomization.yaml
Если в вашем приложении есть несколько ресурсов Ingress, и вы хотите применить один и тот же патч ко всем из них, Kustomize может это сделать. Если бы вы изменили патч в своем kustomization.yaml, чтобы он выглядел так:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
patches:
- target:
kind: Ingress
name: ".*"
patch: |
- op: replace
path: /spec/tls
value:
- hosts:
- host1.example.com
secretName: host1-tls
Это применит один и тот же патч ко всем соответствующим ресурсам Ingress (в данном случае это «все они», потому что мы использовали .* в качестве нашего выражения соответствия).
Я думаю, вам понадобится отдельный патч для каждого kind (моя интуиция подсказывает, что было бы необычно, чтобы патч правильно применялся к более чем одному типу ресурсов, а для общих атрибутов, таких как метки и аннотации, в kustomize есть другие средства для установка этих вещей).
Спасибо, я смог сделать то, что мне нужно, добавив раздел для каждого типа (вход, развертывание и т. д.). kustomize build . в каталоге оверлея показывает файлы yaml в том виде, в котором они мне нужны.
У меня был один уточняющий вопрос. Что, если мне нужно создать несколько yaml-файлов с разными именами? Например, у меня есть одна служба с именем product и одна служба с именем price. Есть ли способ сделать это с помощью патча в оверлее на одном базовом service.yaml файле?
Спасибо, это именно то, что я искал. Знаете ли вы, можете ли вы перечислить несколько
kindв файле оверлеяkustomization.yaml?