Вопрос или проблема
проблема:
У меня есть приложение, работащее на кластере EKS, которое должно подключаться к базе данных MongoDB Atlas.
Я должен предоставить приложению, работающему в кластере EKS, сетевой доступ, указав его IP-адрес.
Я не знаю IP-адрес сервиса/развертывания приложения внутри кластера.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app-image:latest
env:
- name: MONGO_URI
value: "mongodb+srv://<username>:<password>@cluster0.mongodb.net/my-db?retryWrites=true&w=majority"
ports:
- containerPort: 8080
Ответ или решение
Для обеспечения доступа приложения, развернутого в кластере EKS (Elastic Kubernetes Service), к базе данных MongoDB Atlas, необходимо понять архитектурные особенности работы Kubernetes и службы EKS. MongoDB Atlas использует строгие политики сетевой безопасности, которые требуют указания разрешенных IP-адресов для подключения к базе данных. Однако EKS динамически назначает IP-адреса для Pod’ов внутри кластера, что создает определенные сложности при добавлении этих IP-адресов в белый список MongoDB Atlas.
Теория
При работе с EKS все Pod’ы, размещенные внутри вашего кластера, имеют внутренние IP-адреса, которые могут меняться при каждом новом развертывании или пересоздании Pod’ов. Однако для соединения с внешними ресурсами, такими как MongoDB Atlas, используется выделение внешнего IP-адреса, который и необходимо добавить в список разрешенных IP-адресов на стороне MongoDB Atlas.
Одним из решений для данной задачи является использование Kubernetes Service с типом LoadBalancer. Это позволит назначить статический внешний IP-адрес, который можно будет безопасно добавить в белый список MongoDB Atlas.
Пример
-
Создание LoadBalancer Service:
Вам нужно создать сервис типа LoadBalancer, который будет предоставлять внешний доступ к вашему приложению. Обратите внимание, что служба LoadBalancer автоматически предоставляет внешний IP-адрес, который может быть использован для настроек безопасности MongoDB Atlas.
Пример конфигурации:
apiVersion: v1 kind: Service metadata: name: my-app-service spec: type: LoadBalancer selector: app: my-app ports: - port: 8080 targetPort: 8080
После создания сервиса через команду
kubectl apply -f service.yaml
, вам будет назначен внешний IP-адрес. Этот адрес необходимо скопировать и использовать для настройки сетевого доступа в MongoDB Atlas. -
Настройка сетевого доступа в MongoDB Atlas:
Перейдите в консоль управления MongoDB Atlas и выберите ваш кластер. Перейдите в раздел ‘Network Access’ и добавьте полученный внешний IP-адрес LoadBalancer в белый список. Это позволит вашему приложению в EKS подключаться к базе данных MongoDB Atlas.
Применение
Теперь, когда у вас есть внешний IP-адрес от Kubernetes LoadBalancer, он добавлен в сетевые настройки MongoDB Atlas, ваше приложение сможет безопасно подключаться к базе данных. Такой подход обеспечивает надежное и контролируемое подключение, ведь вы знаете IP-адрес, с которого происходят запросы к базе.
Кроме того, чтобы избежать лишних затрат, вы можете рассмотреть возможности внедрения архауса безопасности, когда поды и службы ограничены только необходимыми сетевыми взаимодействиями в пределах кластера и вне его. Это достигается с помощью Network Policies в Kubernetes, которые могут быть настроены для обеспечения сетевой безопасности, ограничивая исходящие и входящие соединения на уровне Pod’ов.
Также стоит рассмотреть использование VPC Peering, если ваш кластер EKS и кластер MongoDB Atlas размещены в одном облачном провайдере, таким образом сократив путь данных и увеличив безопасность передачи.
Следует помнить, что предоставленный IP-адрес LoadBalancer может измениться при изменениях конфигураций или пересоздании сервиса, поэтому рекомендуется мониторинг и автоматизация процесса обновления адресов в MongoDB Atlas. В контексте AWS можно использовать Elastic Load Balancer (ELB) с Elastic IP (EIP) для получения постоянного IP-адреса.