Ответ
Для безопасного доступа к 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 вместо прямого доступа к порту БД.