Есть ли способ сделать пользовательские заголовки слияния в файле yaml вместо полной замены этого заголовка наложенным yaml? - PullRequest
0 голосов
/ 27 марта 2019

У меня есть базовый yaml и оверлейный yaml, и с помощью «kustomize» я хочу объединить эти два yaml.что происходит со мной, что при запуске сборки Kustomize приходит вывод, но не ожидается, почему?потому что пользовательская настройка вместо заполнения пользовательской информации из оверлея yaml заменяет весь тег заголовка базы на «контейнеры» в моём случае.Предполагаемое поведение, которое мне нужно, это то, что он должен каким-то образом заполнить недостающую информацию, используя оверлей yaml вместо замены.

base yaml:

apiVersion: v1
kind: Pod
metadata:
  name: temp
  labels:
    tier: temp
spec:
  containers:
  - name: temp
    image:  temp
    imagePullPolicy: Always
    command: temp
    args:
      temp
    envFrom:
    - configMapRef:
        name: temp
    volumeMounts:
  volumes:

оверлей yaml:

apiVersion: v1
kind: Pod
metadata:
  name: temp
  labels:
    tier: temp
spec:
  containers:
    volumeMounts:
    - name: temppathname
      mountPath: /temppath
  volumes:
  - name: temppathname
    hostPath:
      type: temp
      path: temppath

Ожидаемый результат после кастомизации сборки:

apiVersion: v1
kind: Pod
metadata:
  name: temp
  labels:
    tier: temp
spec:
  containers:
  - name: temp
    image:  temp
    imagePullPolicy: Always
    command: temp
    args:
      ["sleep 9000"]
    envFrom:
    - configMapRef:
        name: temp
    volumeMounts:
    - name: temppathname
      mountPath: /temppath
  volumes:
  - name: temppathname
    hostPath:
      type: temp
      path: temppath

что я получаю:

apiVersion: v1
kind: Pod
metadata:
  labels:
    tier: temp
  name: temp
spec:
  containers:
    volumeMounts:
    - name: temppathname
      mountPath: /temppath
  volumes:
  - name: temppathname
    hostPath:
      type: temp
      path: temppath

Ответы [ 2 ]

1 голос
/ 27 марта 2019

В вашем base.yaml значение для ключа containers является последовательностью (узлом). В вашем overlay.yaml значение для ключа containers является отображением. Конечно, эти два не могут быть объединены.

Совершенно не зная kustomize, кажется логичным, что, поскольку они не могут быть объединены, наложение заменяет весь этот узел последовательности на узел отображения. Ваше ожидание того, что отображение наложения объединяется с отображением, которое оказывается элементом (в данном случае единственным элементом) в последовательности базы, кажется совершенно произвольным. Какой предмет нужно было бы взять, если бы было несколько предметов? Первый? Последний? Последний пункт перед пятым, который является отображением?

Если ваш overlay.yaml выглядел так:

apiVersion: v1
kind: Pod
metadata:
  name: temp
  labels:
    tier: temp
spec:
  containers:
  - volumeMounts:     # < created a sequence item here by inserting an item indicator
    - name: temppathname
      mountPath: /temppath
  volumes:
  - name: temppathname
    hostPath:
      type: temp
      path: temppath

тогда я мог бы понять ваше ожидание (и, возможно, вышеописанное изменение можно применить, чтобы оно заработало, у меня нет способа проверить).

0 голосов
/ 05 июня 2019

Я считаю, что самый простой способ справиться с этим - использовать JSONPatch. Я бы удалил пустые поля базы как в:

apiVersion: v1
kind: Pod
metadata:
  name: temp
  labels:
    tier: temp
spec:
  containers:
  - name: temp
    image:  temp
    imagePullPolicy: Always
    command: temp
    args:
      temp
    envFrom:
    - configMapRef:
        name: temp

Затем в оверлее создайте новый патч, например с именем create_volume.yml:

- op: add
  path: /spec/volumes/-
  value:
    name: temppathname
    hostPath:
     type: temp
     path: temppath

- op: add
  path: /spec/containers/0/volumeMounts/-
  value:
    name: temppathname
    mountPath: /temppath

И, наконец, в оверлее kustomization.yml добавить:

patchesJson6902:
- target:
    version: v1
    kind: Pod
    name: temp
  path: create_volume.yml

Если это не сработает, возможно, вам придется поиграть с группой API в цели патча. Я только исправлял развертывания до сих пор, и моя цель будет:

- target:
    group: apps
    version: v1
    kind: Deployment
    name: temp
  path: create_volume.yml
...