Я хотел бы написать мутирующий вебхук, чтобы добавить класс входа по умолчанию ко всем объектам входа, которые явно не предоставляют его.
В соответствии с Примеры я обнаружил, что мне нужно предоставить правильный патч 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
, но, к сожалению, это не помогает с моим вебхуком.
Замените косую черту (/
) в 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
мне было проще annotate
, чем patch
:
kubectl annotate ingress mying kubernetes.io/ingress.class=value
добавьте флаги --dry-run -o yaml
, если вы хотите протестировать его перед применением изменения.
kubectl annotate
хорошая утилита. Но обратите внимание, что OP прямо упомянул, что они знают об этом, и это не работает для их варианта использования.
да, но это было актуально для нескольких других людей здесь
Используя только:
[{"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"}
]
О, круто. Большое спасибо! Я еще не знал о указателях JSON. Добавление класса таким образом, вероятно, будет работать только в том случае, если объект аннотации уже присутствует. - Похоже, мне придется заниматься обоими случаями отдельно.