Как исправить внедренный ресурс Ingress на Kubernetes? - PullRequest
0 голосов
/ 08 июня 2018

У меня есть следующий ресурс Ingress:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: main-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "86400"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "86400"

spec:
  tls:
  - secretName: the-secret
    hosts:
      - sample.domain.com
      - sample2.domain.com
      - rabbit.domain.com
      - hub.domain.com
      - grafana.domain.com

  rules:

  - host: sample.domain.com
    http:
      paths:
      - path: /
        backend:
          serviceName: fe-srvc
          servicePort: 80
      - path: /api
        backend:
          serviceName: be-srvc
          servicePort: 80

  - host: sample2.domain.com
    http:
      paths:
      - path: /
        backend:
          serviceName: fe2-srvc
          servicePort: 80
      - path: /api
        backend:
          serviceName: be-srvc
          servicePort: 80

## The Extra Services ###
  - host: rabbit.domain.com
    http:
      paths:
      - path: /
        backend:
          serviceName: rabbitmq-srvc
          servicePort: 80

, и я хочу исправить его после развертывания.

Поэтому я использую его, чтобы попытаться заменить значение be-srvcс some-srvc:

kubectl patch ing/main-ingress --patch '{ "spec" : { "rules": [{"http":{"paths":[ {"- path":"/"},{"backend":{"serviceName":"other-srvc"}},{"servicePort":"80"} ] }}]}}'

и я получаю эту ошибку:

The Ingress "main-ingress" is invalid:
* spec.rules[0].http.backend.serviceName: Required value
* spec.rules[0].http.backend.servicePort: Invalid value: 0: must be between 1 and 65535, inclusive

Любое понимание будет оценено!

1 Ответ

0 голосов
/ 08 июня 2018

Ваш патч имеет ряд проблем;например "- 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"}]'

Это имеет тот же эффект и в качестве дополнительного бонуса тамздесь нет расы;патч гарантированно будет атомарным.

...