Создайте патч для добавления аннотации kubernetes

Я хотел бы написать мутирующий вебхук, чтобы добавить класс входа по умолчанию ко всем объектам входа, которые явно не предоставляют его.

В соответствии с Примеры я обнаружил, что мне нужно предоставить правильный патч json для возврата веб-перехватчика.

Сначала я попробовал свои патчи с помощью kubectl:

$ kubectl patch ingress mying --type='json' -p='[{"op": "add", "path": "/metadata/annotations/key", "value":"value"}]'
The  "" is invalid

Похоже, это не работает, когда еще нет элемента аннотаций.

$ kubectl patch ingress mying --type='json' -p='[{"op": "add", "path": "/metadata/annotations", "value":{"key":"value"}}]'
ingress.extensions/kafka-monitoring-topics-ui patched

Создание полного элемента аннотаций работает нормально, однако в моем случае мне нужен ключ kubernetes.io/ingress.class, содержащий косую черту.

kubectl patch ingress mying --type='json' -p='[{"op": "add", "path": "/metadata/annotations", "value":{"kubernetes.io/ingress.class":"value"}}]'
ingress.extensions/kafka-monitoring-topics-ui patched

Это отлично работает при создании объекта аннотации. Однако, если уже есть какая-то аннотация, и я просто хочу сделать ее Добавить, кажется, невозможно добавить ее.

Простое использование [{"op": "add", "path": "/metadata/annotations", "value":{"kubernetes.io/ingress.class":"value"}}] удаляет все существующие аннотации, а что-то вроде '[{"op": "add", "path": "/metadata/annotations/kubernetes.io/ingress.class", "value": "value"}] не работает из-за косой черты.

Короче говоря: как правильно просто добавить класс входа с помощью соответствующего патча?

PS: Да, я знаю о kubectl annotate, но, к сожалению, это не помогает с моим вебхуком.

Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
6
0
9 790
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Замените косую черту (/) в kubernetes.io/ingress.class на ~1.

Ваша команда должна выглядеть так:

$ kubectl patch ingress mying --type='json' -p='[{"op": "add", "path": "/metadata/annotations/kubernetes.io~1ingress.class", "value":"nginx"}]'

Ссылка: RFC 6901 https://www.rfc-editor.org/rfc/rfc6901#section-3

О, круто. Большое спасибо! Я еще не знал о указателях JSON. Добавление класса таким образом, вероятно, будет работать только в том случае, если объект аннотации уже присутствует. - Похоже, мне придется заниматься обоими случаями отдельно.

michas 08.04.2019 18:13

мне было проще annotate, чем patch:

kubectl annotate ingress mying kubernetes.io/ingress.class=value

добавьте флаги --dry-run -o yaml, если вы хотите протестировать его перед применением изменения.

kubectl annotate хорошая утилита. Но обратите внимание, что OP прямо упомянул, что они знают об этом, и это не работает для их варианта использования.
nakamume 05.11.2020 03:20

да, но это было актуально для нескольких других людей здесь

Efrat Levitan 05.11.2020 08:47

Используя только:

[{"op": "add", "path": "/metadata/annotations/kubernetes.io~1ingress.class", "value":"nginx"}]

не работает, когда созданный модуль не имеет аннотаций, например, при переходе из kubectl run --generator=run-pod/v1 --attach test-deploy --image=busybox ls

Чтобы обнаружить это, вам нужен отдельный шаг синтаксического анализа метаданных с аннотацией указателя, чтобы его можно было определить как nil или всегда отправлять пустую аннотацию, когда она пуста:

type Metadata struct {
    Annotations  *map[string]string
}

type ObjectWithMeta struct {
    Metadata Metadata
}

затем отправьте:

[
  {"op":"add","path":"/metadata/annotations","value":{}},
  {"op":"add","path":"/metadata/annotations/foo","value": "bar"}
]

Другие вопросы по теме