Ваш патч имеет ряд проблем;например "- path"
вместо "path"
, но также неверная ссылка на уровни объекта.Однако, даже если вы исправили ошибки, это не сработает, как задумано.Давайте посмотрим, почему.
kubectl patch
- это запрос на стратегическое исправление слияния .При исправлении массивов, например .spec.rules
и .spec.rules.http.paths
, в этом случае стратегическое исправление слияния может использовать определенный тип исправления и ключ слияния исправления слияния для объекта, чтобы сделать правильную вещь.Однако в случае объекта Ingress никто не удосужился определить их.Это означает, что любой патч будет перезаписывать весь объект;это не будет хорошим слиянием, на которое надеются.
Чтобы выполнить конкретное изменение, упомянутое в вопросе, который вы можете сделать:
kubectl get ing/main-ingress -o json \
| jq '(.spec.rules[].http.paths[].backend.serviceName | select(. == "be-srvc")) |= "some-srvc"' \
| kubectl apply -f -
Вышеприведенное изменит все вхожденияbe-srvc
Сервис до some-srvc
.Имейте в виду, что здесь есть условие короткой гонки: если вход изменяется после kubectl get
, изменение завершится ошибкой Operation cannot be fulfilled on ingresses.extensions "xx": the object has been modified
;для обработки этого случая вам необходимо реализовать логику повторных попыток.
Если индексы известны в упомянутых выше массивах, вы можете выполнить исправление напрямую:
kubectl patch ing/main-ingress --type=json \
-p='[{"op": "replace", "path": "/spec/rules/0/http/paths/1/backend/serviceName", "value":"some-srvc"}]'
kubectl patch ing/main-ingress --type=json \
-p='[{"op": "replace", "path": "/spec/rules/1/http/paths/1/backend/serviceName", "value":"some-srvc"}]'
Две вышеприведенные команды изменятbackends для sample.domain.com/api
и sample2.domain.com/api
до some-srvc
.
Две команды также можно комбинировать следующим образом:
kubectl patch ing/main-ingress --type=json \
-p='[{"op": "replace", "path": "/spec/rules/0/http/paths/1/backend/serviceName", "value":"some-srvc"}, {"op": "replace", "path": "/spec/rules/1/http/paths/1/backend/serviceName", "value":"some-srvc"}]'
Это имеет тот же эффект и в качестве дополнительного бонуса тамздесь нет расы;патч гарантированно будет атомарным.