Оригинал: CNPG Recipe 12 — Exposing Postgres outside Kubernetes with Service Templates — 26 августа 2024.
Как с помощью service templates в CloudNativePG 1.24 создать LoadBalancer-сервис и подключиться к PostgreSQL из-за пределов Kubernetes-кластера.
CloudNativePG 1.24 вводит managed services и service templates — механизм декларативного создания дополнительных сервисов (например, LoadBalancer) для доступа к PostgreSQL извне кластера. Это существенно упрощает DBaaS-развёртывания.
Контекст
PostgreSQL-кластеры, управляемые CloudNativePG, всё чаще используются в DBaaS-окружениях (IBM Cloud Pak, GKE, AKS, Tembo, EDB). Типичная ситуация: приложение и база данных — в разных Kubernetes-кластерах, и нужен внешний доступ к БД.
Раньше для этого вручную создавали LoadBalancer-сервис или настраивали Ingress. В CloudNativePG 1.24 это делается декларативно через serviceTemplate прямо в манифесте Cluster.
Прежде чем начать
Убедитесь, что можете развернуть Kind-кластер (см. Рецепт 1).
Для эмуляции внешнего load balancer’а потребуется Cloud Provider KIND .
Настройка локального окружения
Установите cloud-provider-kind:
go install sigs.k8s.io/cloud-provider-kind@latestЗапустите в отдельном терминале (на macOS может потребоваться sudo):
sudo cloud-provider-kindВ другом терминале создайте Kind-кластер:
kind create cluster --name cnpgУстановите оператор CloudNativePG:
kubectl apply --server-side -f \
https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/main/releases/cnpg-1.24.1.yamlСоздание PostgreSQL-кластера
Используем managed services для:
- Отключения дефолтных read-only (
-ro) и read (-r) сервисов. - Создания внешнего LoadBalancer-сервиса, указывающего на primary.
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: cluster-example
spec:
instances: 3
storage:
size: 1Gi
managed:
services:
disabledDefaultServices: ["ro", "r"]
additional:
- selectorType: rw
serviceTemplate:
metadata:
name: cluster-example-rw-lb
spec:
type: LoadBalancerКлючевые моменты:
disabledDefaultServices: ["ro", "r"]— отключает создание-roи-rсервисов (по умолчанию типClusterIP).additional— определяет дополнительные сервисы черезserviceTemplateс полным доступом к API KubernetesService.- В
metadataможно добавлять аннотации для управления load balancer’ом на конкретном облачном провайдере.
Применяем:
kubectl apply -f cluster-example.yamlПроверяем сервисы:
kubectl get serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cluster-example-rw-lb LoadBalancer 10.96.58.150 172.18.0.4 5432:31096/TCP 3s
cluster-example-rw ClusterIP 10.96.121.235 <none> 5432/TCP 3s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 20mДва сервиса: обязательный ClusterIP для primary и LoadBalancer с внешним IP 172.18.0.4.
Детали сервиса:
kubectl describe service cluster-example-rw-lbОбратите внимание на Selector:
Selector: cnpg.io/cluster=cluster-example,cnpg.io/instanceRole=primaryСервис автоматически направляет трафик на текущий primary.
Проверка подключения через psql
Подключаемся к БД извне кластера:
psql -h 172.18.0.4 -U app appПароль можно получить из секрета:
kubectl get secret cluster-example-app \
-o jsonpath="{.data.password}" | base64 -dУспешное подключение:
psql (16.4 (Homebrew))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
app=>Подключение работает с любым PostgreSQL-клиентом — psql, pgAdmin и т.д.
Дополнительно
При использовании Kind с несколькими узлами control plane помечены меткой node.kubernetes.io/exclude-from-external-load-balancers. Для работы cloud-provider-kind эту метку нужно удалить:
kubectl label node cnpg-control-plane \
node.kubernetes.io/exclude-from-external-load-balancers-Для создания load balancer’ов к репликам используйте selectorType: ro (только реплики) или selectorType: r (любой инстанс).
Заключение
Service templates в CloudNativePG 1.24 — значительный шаг вперёд для PostgreSQL в Kubernetes, особенно в DBaaS-сценариях:
- Создание
LoadBalancer-сервисов декларативно, прямо в манифестеCluster. - Управление аннотациями для конкретного облачного провайдера.
- Отключение ненужных дефолтных сервисов.
- Полный контроль через Infrastructure as Code.
Комбинация Kind + cloud-provider-kind позволяет тестировать эти возможности локально перед деплоем в продакшн.