Вопрос или проблема
Я успешно установил aws ssm и хотел бы использовать его для доступа к моему частному кластеру eks. Мне приходится заходить на хост-бастион в публичной подсети с установленными командами kubectl. Я хотел бы избавиться от этого хоста-бастиона.
Я могу открыть туннель с помощью ssm, используя следующую команду
aws ssm start-session --target <идентификатор рабочего узла> --region <регион eks> --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["443"],"localPortNumber":["8443"]}'
Я также обновил свой локальный kubeconfig, который показывает мой контекст aws eks, когда я запускаю kubectl config get-contexts
. Теперь я могу войти по ssh на рабочий узел из другого терминала, когда сессия ssm открыта, но я не хочу устанавливать kubectl на рабочем узле, но мне все еще хочется получить доступ к моему кластеру eks.
Мой кластер EKS находится в частной подсети с частным конечным пунктом. Есть ли способ запускать мои команды kubectl локально после открытия сессии ssm и запрашивать мои частные кластеры eks?
В данный момент я получаю
немогу получить текущий список групп API сервера: Get "https://<endpoint eks>.<регион>.eks.amazonaws.com/api?timeout=32s": dial tcp <ip-адрес>:443: connect: connection refused
Ответ или решение
Для безопасного доступа к вашему EKS-кластеру через SSM (AWS Systems Manager) без необходимости использовать Bastion host, вы можете воспользоваться функцией портового перенаправления, которая позволяет вашему локальному компьютеру взаимодействовать с кластером Kubernetes в частной сети. В следующем руководстве я подробно описываю, как это сделать.
Этап 1: Убедитесь, что у вас настроен SSM
- Проверьте, что у вас правильно настроен AWS SSM Agent на узлах вашего EKS-кластера. Также убедитесь, что IAM роль узла EKS имеет все необходимые разрешения для использования SSM.
- Изучите и выполните команды, чтобы убедиться, что вы можете получить доступ к SSM:
aws ssm describe-instance-information
Этап 2: Настройка конфигурации kubeconfig
Убедитесь, что ваш файл kubeconfig
настроен правильно и указывает на ваш кластер EKS. Это можно сделать с помощью команды:
aws eks update-kubeconfig --name <имя-кластера> --region <регион>
Этап 3: Создание SSM-сессии с портовым перенаправлением
Теперь вы можете открыть SSM-сессию с портовым перенаправлением, используя следующую команду:
aws ssm start-session --target <идентификатор-узла> --region <регион-eks> --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["443"],"localPortNumber":["8443"]}'
Это перенаправит локальный порт 8443 на порт 443 к вашему EKS-кластеру через указанный рабочий узел.
Этап 4: Проверка соединения
Теперь у вас открыта сессия SSM, и вы можете проверить соединение с вашим кластером, отправив запрос к API сервера:
curl https://localhost:8443/version --insecure
Если запрос успешен, вы увидите версию Kubernetes, что подтверждает корректное перенаправление трафика.
Этап 5: Использование kubectl
Теперь вы можете выполнять команды kubectl
, не устанавливая их на рабочий узел. Например:
kubectl get pods --kubeconfig ~/.kube/config
Ваши команды kubectl
теперь будут маршрутизироваться через SSM и доступны к вашему EKS-кластеру, что позволяет вам взаимодействовать с кластером в частной сети.
Устранение проблем
Если вы столкнулись с ошибкой:
couldn't get current server API group list: Get "https://<eks-endpoint>.<region>.eks.amazonaws.com/api?timeout=32s": dial tcp <ip-address>:443: connect: connection refused
Это может означать, что ваш локальный kubeconfig
неправильно настроен или что есть проблемы с портовым перенаправлением. Проверьте, верно ли указан адрес API и открыт ли порт.
Заключение
Используя AWS SSM для доступа к вашему EKS-кластеру без добавления Bastion host, вы значительно упростите свою архитектуру с точки зрения безопасности и управления. Этот метод минимизирует количество сетевых компонентов, что делает вашу инфраструктуру более защищенной и управляемой.