Временное решение: ошибка kubernetes: «сгенерированный вход» Ingress недействителен: metadata.annotations: слишком длинный: должен содержать не более 262144 символов - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь повторить то, что мы настроили в нашей железной инфраструктуре, используя 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 Ответ

0 голосов
/ 23 октября 2019

Я полагаю, что вас укусила 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

...