Обходной путь этой ошибки kubernetes: Ingress "сгенерированный-входящий" недействителен: метаданные. Аннотации: слишком длинные: должно содержать не более 262144 символов.

Я пытаюсь воспроизвести то, что мы создали, в нашей инфраструктуре без оборудования с помощью AWS. По общему признанию, я плохо разбираюсь в K8S, но мой коллега начал использовать его в AWS, так что я совмещал часть работы, которую он проделал. Он смог ответить на большинство моих вопросов, но этот, кажется, поставил нас в тупик.

В нашей системе с нуля около 20 тысяч уникальных сайтов с индивидуальными сертификатами SSL. При проведении небольшого теста с несколькими сайтами и сертификатами он работает. Однако в полном объеме это не так.

Мне удалось выполнить сценарий импорта сертификатов в K8S и создать из него yaml-файл конфигурации входа voyager, но когда я пытаюсь применить его, я получаю следующее сообщение об ошибке:

bash-5.0# kubectl apply -f generated-ingress.yaml
The Ingress "generated-ingress" is invalid: metadata.annotations: Too long: must have at most 262144 characters

Кажется, что входящая конфигурация слишком велика.

Сгенерированный вход выглядит примерно так:

---
apiVersion: voyager.appscode.com/v1beta1
kind: Ingress
metadata:
  name: generated-ingress
  namespace: default
spec:
  tls:
    - secretName: ssl-cert-eample-domain.com
      hosts:
        - example-domain.com
    # Repeated for each domain using SSL
  rules:
    - host: '*'
      http:
        paths:
        - backend:
            serviceName: the-backend
            servicePort: '80'
    - host: example-domain.com
      http:
        paths:
        - backend:
            serviceName: the-backend
            servicePort: '80'
            headerRules:
            - X-HTTPS YES 
    # Repeated for each domain using SSL

К вашему сведению X-HTTPS заголовок необходим для нашего бэкэнда, чтобы правильно генерировать абсолютные URL-адреса, используя https вместо того http. Было бы хорошо, если бы это можно было указать для всех SSL-соединений вместо того, чтобы указывать его для каждого отдельного домена, что сделало бы конфигурацию более простой.

В любом случае есть ли способ увеличить лимит на конфигурацию? Или есть лучший способ настроить вход для многочисленных сертификатов SSL?

1 ответ

Я верю, что тебя укусил kubectl пытаясь зафиксировать предыдущее положение дел в {"metadata":{"annotation":{"kubectl.kubernetes.io/last-applied-configuration": "GINORMOUS string"}}} как описано здесь. Это неIngress сам доставляет вам проблемы.

В вашем случае, поскольку входной объект такой большой, я считаю, что вам придется использовать kubectl replace вместо того apply, поскольку (а) у вас все равно в руках есть все объявление (б) я не думаю kubectl replace пытается захватить эту аннотацию, если один явно не предоставляет --save-config=true к replace


Отдельно от вашего вопроса, если вы еще не в курсе, не нужно объявлять всеIngress в одном ресурсе - им намного, намного, намного, намного, намного легче управлять и рассуждать о Ingress ресурсы, когда они различны

Итак, ваша конфигурация:

apiVersion: voyager.appscode.com/v1beta1
kind: Ingress
metadata:
  name: generated-ingress
  namespace: default
spec:
  tls:
    - secretName: ssl-cert-eample-domain.com
      hosts:
        - example-domain.com
    # Repeated for each domain using SSL
  rules:
    - host: '*'
      http:
        paths:
        - backend:
            serviceName: the-backend
            servicePort: '80'
    - host: example-domain.com
      http:
        paths:
        - backend:
            serviceName: the-backend
            servicePort: '80'
            headerRules:
            - X-HTTPS YES

станет:

apiVersion: voyager.appscode.com/v1beta1
kind: Ingress
metadata:
  name: star-domain
  namespace: default
spec:
  rules:
    - host: '*'
      http:
        paths:
        - backend:
            serviceName: the-backend
            servicePort: '80'

а затем повторите эту структуру для каждого из доменов:

apiVersion: voyager.appscode.com/v1beta1
kind: Ingress
metadata:
  name: example-domain
  namespace: default
spec:
  tls:
    - secretName: ssl-cert-example-domain.com
      hosts:
        - example-domain.com
  rules:
    - host: example-domain.com
      http:
        paths:
        - backend:
            serviceName: the-backend
            servicePort: '80'
            headerRules:
            - X-HTTPS YES

также избыточно помещать ingress в metadata: name: из Ingress ресурс, так как при вводе его имени вам нужно будет сказать kubectl describe ingress/generated-ingress

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