Как разрешить доступ к БД PostgreSQL извне, если она находится в кластере Kubernetes

«Как разрешить доступ к БД PostgreSQL извне, если она находится в кластере Kubernetes» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для безопасного доступа к PostgreSQL извне кластера Kubernetes я обычно реализую один из следующих подходов, в зависимости от требований к безопасности и окружения:

1. Service типа NodePort (для тестовых сред):

apiVersion: v1
kind: Service
metadata:
  name: postgres-external
spec:
  type: NodePort
  selector:
    app: postgres
  ports:
    - port: 5432
      targetPort: 5432
      nodePort: 30001  # Диапазон 30000-32767

После этого доступ будет по node-ip:30001. Обязательно настраиваю listen_addresses = '*' в postgresql.conf и соответствующие правила в pg_hba.conf.

2. Ingress Controller с TLS (рекомендуемый для production):

  • Разворачиваю Ingress Controller (nginx, traefik)
  • Создаю Service типа ClusterIP
  • Настраиваю Ingress ресурс с TLS терминацией
  • Использую аннотации для TCP/UDP проксирования (для nginx-ingress):
    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: tcp-services
    namespace: ingress-nginx
    data:
    "5432": "default/postgres-service:5432"

3. Использование Cloud Load Balancer:

apiVersion: v1
kind: Service
metadata:
  name: postgres-loadbalancer
spec:
  type: LoadBalancer
  selector:
    app: postgres
  ports:
    - port: 5432
      targetPort: 5432

В облачных провайдерах это автоматически создаст внешний балансировщик нагрузки.

Критические меры безопасности, которые я всегда применяю:

  • Ограничение доступа по IP через Network Policies
  • Обязательное использование TLS для соединений
  • Регулярная ротация сертификатов
  • Мониторинг и логирование всех подключений
  • Для production систем предпочитаю использовать VPN (WireGuard, OpenVPN) или bastion-host вместо прямого доступа к порту БД.