Рецепт 12. Доступ к PostgreSQL извне Kubernetes через Service Templates

Как использовать managed services и service templates в CloudNativePG 1.24 для создания LoadBalancer-сервиса и подключения к PostgreSQL извне кластера Kubernetes.
Опубликовано:

Как с помощью 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:

SH
go install sigs.k8s.io/cloud-provider-kind@latest
Нажмите, чтобы развернуть и увидеть больше

Запустите в отдельном терминале (на macOS может потребоваться sudo):

SH
sudo cloud-provider-kind
Нажмите, чтобы развернуть и увидеть больше

В другом терминале создайте Kind-кластер:

SH
kind create cluster --name cnpg
Нажмите, чтобы развернуть и увидеть больше

Установите оператор CloudNativePG:

SH
kubectl apply --server-side -f \
  https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/main/releases/cnpg-1.24.1.yaml
Нажмите, чтобы развернуть и увидеть больше

Создание PostgreSQL-кластера

Используем managed services для:

YAML
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
Нажмите, чтобы развернуть и увидеть больше

Ключевые моменты:

Применяем:

SH
kubectl apply -f cluster-example.yaml
Нажмите, чтобы развернуть и увидеть больше

Проверяем сервисы:

SH
kubectl get service
Нажмите, чтобы развернуть и увидеть больше
PLAINTEXT
NAME                    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.

Детали сервиса:

SH
kubectl describe service cluster-example-rw-lb
Нажмите, чтобы развернуть и увидеть больше

Обратите внимание на Selector:

PLAINTEXT
Selector: cnpg.io/cluster=cluster-example,cnpg.io/instanceRole=primary
Нажмите, чтобы развернуть и увидеть больше

Сервис автоматически направляет трафик на текущий primary.

Проверка подключения через psql

Подключаемся к БД извне кластера:

SH
psql -h 172.18.0.4 -U app app
Нажмите, чтобы развернуть и увидеть больше

Пароль можно получить из секрета:

SH
kubectl get secret cluster-example-app \
  -o jsonpath="{.data.password}" | base64 -d
Нажмите, чтобы развернуть и увидеть больше

Успешное подключение:

PLAINTEXT
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 эту метку нужно удалить:

SH
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-сценариях:

Комбинация Kind + cloud-provider-kind позволяет тестировать эти возможности локально перед деплоем в продакшн.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша