Обходной путь этой ошибки 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