Вопрос или проблема
У нас есть два аккаунта AWS (A и B), на каждом из которых развернут частный EKS (k8s-A и k8s-B). VPC соединены через Transit Gateway. Мы знаем, что рабочие узлы могут общаться друг с другом, потому что из k8s-A мы можем вызвать сервис на k8s-B через LB.
Теперь на k8s-B мы развернули dex и gangway на обоих k8s-A и k8s-B (если вы знаете лучшую альтернативу, не стесняйтесь упомянуть об этом).
На k8s-B настройка Dex+Gangway для OIDC аутентификации заработала как по волшебству практически из коробки. На k8s-A мы не можем заставить это работать. Конкретно, похоже, что Control Plane в A не может получить доступ к частному LB на B.
В логах API кубернетес (A) мы можем видеть каждые несколько секунд:
oidc authenticator: initializing plugin: Get "https://dex.mycompany.cloud/.well-known/openid-configuration": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Я знаю, что Control Plane находится в управляемом AWS VPC, но можем ли мы как-то предоставить ему доступ к VPC в B как-то?
Ответ или решение
Доступ контрольной плоскости EKS к дополнительным VPC для централизованной OIDC аутентификации
Ваша проблема, касающаяся соединения контрольной плоскости Amazon EKS в аккаунте A с развернутым Dex в аккаунте B в контексте OIDC аутентификации, вызвана несколькими факторами сетевой архитектуры AWS и особенностями управления доступом. Давайте глубже разберем проблему и предложим возможные решения.
1. Понимание архитектуры и ограничений
Контрольная плоскость Amazon EKS развернута в управляемом VPC, и, как следствие, напрямую не имеет возможностей для настройки маршрутизации или доступа, как это возможно для рабочих узлов. Если ваша контрольная плоскость в аккаунте A не может обращаться к внутреннему балансировщику нагрузки (LB) в VPC аккаунта B, это может быть связано с тем, что контрольная плоскость не видит этот LB в сетевом контексте.
2. Решения по настройке доступа
Чтобы предоставить контрольной плоскости EKS доступ к Dex на другом VPC, рассмотрите следующие шаги:
a. Настройка peering или Transit Gateway:
Поскольку ваши VPC соединены через Transit Gateway, вам нужно убедиться, что все необходимые маршруты настроены корректно.
- Убедитесь, что маршруты в таблицах маршрутизации обоих VPC включают возможность доступа к другим VPC.
- Проверьте, что маршруты для CIDR диапазонов (разделов) VPC настроены на доступ из управления VPC в управление другого VPC и наоборот.
b. Настройка правил безопасности (Security Groups):
Убедитесь, что правила безопасности вашего внутреннего LB на k8s-B настроены на прием трафика из CIDR диапазонов VPC, где расположена контрольная плоскость EKS (k8s-A). Это может включать:
- Исключительные правила для портов, используемых OIDC (обычно это 443 для HTTPS).
- Разрешить inbound-трафик от IP диапазонов вашего VPC в аккаунте A.
c. Настройка Network ACL:
Проверьте настройки Network ACL, чтобы они не блокировали трафик между вашими двумя VPC. Network ACL должны быть должным образом настроены для разрешения входящего и исходящего трафика.
3. Доступ через публичное DNS имени
Если подключение через приватный балансировщик нагрузки вызывает проблемы, в качестве временного решения можно рассмотреть возможность использования публичного API и переключить Dex на прием публичного трафика:
- Убедитесь, что у вас есть замечательная система аутентификации и шифрования, чтобы избежать утечек.
- Измените конфигурацию Dex в кластере B так, чтобы она могла принимать соединения из публичной сети (например, через AWS API Gateway).
4. Логирование и отладка
Для разработки более надежного подхода:
- Активируйте более детальное логирование как на стороне контрольной плоскости A, так и на Dex в B.
- Отслеживайте любые сетевые вызовы и их статус через AWS CloudTrail, чтобы убедиться, что нет неожиданных блокировок.
Заключение
С вводом вышеуказанных решений вы сможете разрешить проблемы с OIDC аутентификацией между вашими кластерами EKS в разных аккаунтах. Убедительно рекомендую продолжить тщательную проверку всех настроек сети, учитывая рекомендации по безопасной конфигурации. Убедитесь, что ваше облачное окружение остается защищенным и управляемым, поскольку это критически важно для любой инфраструктуры.
Если у вас остались вопросы или необходима дополнительная помощь в реализации, не стесняйтесь обращаться.