cnpg — официальный плагин для kubectl, который ставится через krew и сильно облегчает повседневную работу с PostgreSQL-кластерами под управлением CloudNativePG . Без него почти каждая операция превращается в длинную цепочку kubectl get/patch/exec с YAML-патчами и ручным base64 -d.

В статье — установка и подробный разбор всех практически полезных команд плагина, с примерами и краткими комментариями, когда что использовать.

Если вы только знакомитесь с CloudNativePG — посмотрите серию переводов рецептов Gabriele Bartolini. А Рецепт 14 даёт обзор связки cnpg + view-secret + view-cert + stern, которая закрывает 90% повседневной операционки.

Установка

Через krew (рекомендуется)

Если уже установлен krew:

BASH
kubectl krew install cnpg
Нажмите, чтобы развернуть и увидеть больше

Обновление:

BASH
kubectl krew update
kubectl krew upgrade cnpg
Нажмите, чтобы развернуть и увидеть больше

Альтернативные способы

Установочный скрипт от мейнтейнеров:

BASH
curl -sSfL \
  https://github.com/cloudnative-pg/cloudnative-pg/raw/main/hack/install-cnpg-plugin.sh | \
  sudo sh -s -- -b /usr/local/bin
Нажмите, чтобы развернуть и увидеть больше

Homebrew (управляется community):

BASH
brew install kubectl-cnpg
Нажмите, чтобы развернуть и увидеть больше

Готовые пакеты (.deb, .rpm) под Linux лежат в Releases — удобно для air-gapped окружений и CI-агентов.

Поддерживаемые архитектуры

Linux (amd64, arm 5/6/7, arm64, s390x, ppc64le), macOS (amd64, arm64), Windows (386, amd64, arm 5/6/7, arm64).

Автодополнение

BASH
# bash
echo "source <(kubectl cnpg completion bash)" >> ~/.bashrc

# zsh
kubectl cnpg completion zsh > "${fpath[1]}/_kubectl-cnpg"
Нажмите, чтобы развернуть и увидеть больше

В Homebrew autocomplete уже подключается автоматически.

Краткая шпаргалка

КатегорияКоманды
Диагностикаstatus, report operator, report cluster, logs
Жизненный циклrestart, reload, promote, destroy, hibernate, maintenance
Бэкапbackup
Сертификатыcertificate
Бенчмаркиpgbench, fio
Доступ к БДpsql, pgadmin4
Логическая репликацияpublication create/drop, subscription create/drop/sync-sequences
Управление операторомinstall generate
Прочееversion, completion, fencing

Дальше — детально по каждой.

Диагностика

status — обзор состояния кластера

Самая ходовая команда. Показывает: имя и system ID кластера, образ PostgreSQL, имя primary и uptime, число инстансов и ready-инстансов, размер БД, текущую WAL-позицию, статус continuous backup, статус streaming replication (LSN, лаги, sync state) и список инстансов с их ролями.

BASH
kubectl cnpg status sandbox
Нажмите, чтобы развернуть и увидеть больше

Пример вывода:

PLAINTEXT
Cluster Summary
Name:                default/sandbox
System ID:           7423474350493388827
PostgreSQL Image:    ghcr.io/cloudnative-pg/postgresql:16.4
Primary instance:    sandbox-1
Primary start time:  2024-10-08 18:31:57 +0000 UTC (uptime 1m14s)
Status:              Cluster in healthy state
Instances:           3
Ready instances:     3
Size:                126M
Current Write LSN:   0/604DE38 (Timeline: 1 - WAL File: 000000010000000000000006)

Streaming Replication status
Name       Sent LSN   Write LSN  Flush LSN  Replay LSN  ...  State      Sync State
sandbox-2  0/604DE38  0/604DE38  0/604DE38  0/604DE38   ...  streaming  async
sandbox-3  0/604DE38  0/604DE38  0/604DE38  0/604DE38   ...  streaming  async

Instances status
Name       Current LSN  Replication role  Status  QoS         Manager  Node
sandbox-1  0/604DE38    Primary           OK      BestEffort  1.29.0   k8s-eu-worker
sandbox-2  0/604DE38    Standby (async)   OK      BestEffort  1.29.0   k8s-eu-worker2
sandbox-3  0/604DE38    Standby (async)   OK      BestEffort  1.29.0   k8s-eu-worker
Нажмите, чтобы развернуть и увидеть больше

Полезные флаги:

report operator и report cluster — диагностический ZIP

Когда что-то сломалось и нужно отдать данные мейнтейнерам / коллегам.

По оператору:

BASH
kubectl cnpg report operator -n cnpg-system
Нажмите, чтобы развернуть и увидеть больше

Соберёт в ZIP: deployment оператора, ConfigMaps, события, логи подов оператора, секреты (по запросу), webhook configs, OLM-ресурсы (если есть).

По кластеру:

BASH
kubectl cnpg report cluster sandbox
Нажмите, чтобы развернуть и увидеть больше

В архив попадут: манифест Cluster, список подов, их логи, события, jobs, PVC-ы. Полезные флаги:

logs cluster и logs pretty — централизованные логи

BASH
# Скачать логи всех инстансов кластера в файлы
kubectl cnpg logs cluster sandbox --output ./sandbox-logs

# Стримить логи всех инстансов
kubectl cnpg logs cluster sandbox -f
Нажмите, чтобы развернуть и увидеть больше

logs pretty форматирует JSON-логи оператора в человеко-читаемый вид:

BASH
kubectl logs deployment/cnpg-controller-manager -n cnpg-system | \
  kubectl cnpg logs pretty
Нажмите, чтобы развернуть и увидеть больше

Жизненный цикл кластера

restart — рестарт кластера или одного инстанса

BASH
# Rolling-restart всего кластера (полезно после изменения ConfigMap)
kubectl cnpg restart sandbox

# Рестарт конкретного инстанса
kubectl cnpg restart sandbox sandbox-2
Нажмите, чтобы развернуть и увидеть больше

Поведение зависит от роли:

Если хочется, чтобы изменения в ConfigMap/Secret применялись автоматически, повесьте на них лейбл cnpg.io/reload.

reload — мягкий reconcile

BASH
kubectl cnpg reload sandbox
Нажмите, чтобы развернуть и увидеть больше

Просит оператор прокрутить reconcile-цикл. Применить новые ConfigMap‘ы с custom-метриками — без рестарта подов.

promote — повысить standby до primary

BASH
# По имени пода
kubectl cnpg promote sandbox sandbox-2

# Или по серийному номеру
kubectl cnpg promote sandbox 2
Нажмите, чтобы развернуть и увидеть больше

Используется для контролируемого switchover’а (например, перед обслуживанием конкретной ноды).

destroy — снести инстанс и его PVC

BASH
# Удалить под и все его PVC
kubectl cnpg destroy cluster-example 2

# Сохранить PVC (для последующего ручного использования)
kubectl cnpg destroy cluster-example 2 --keep-pvc
Нажмите, чтобы развернуть и увидеть больше

С --keep-pvc оператор уберёт ownerReferences и поменяет лейбл cnpg.io/pvcStatus с ready на detached. Повторный запуск без флага — окончательно удалит «отвязанные» PVC.

hibernate — гибернация кластера

Полезно, когда временно нужно остановить кластер, не удаляя данные. Под капотом — аннотация cnpg.io/hibernation.

BASH
# Усыпить (поды убираются, PVC живут)
kubectl cnpg hibernate on sandbox

# Разбудить
kubectl cnpg hibernate off sandbox

# Проверка
kubectl cnpg status sandbox
Нажмите, чтобы развернуть и увидеть больше

maintenance — окно обслуживания нод

Массовое выставление .spec.nodeMaintenanceWindow.inProgress:

BASH
# Выставить флаг maintenance во всех namespace'ах
kubectl cnpg maintenance set --all-namespaces

# Снять
kubectl cnpg maintenance unset --all-namespaces
Нажмите, чтобы развернуть и увидеть больше

С флагом --reusePVC оператор будет реюзать PVC при пересоздании подов.

Перед применением плагин показывает список затрагиваемых кластеров и просит подтверждение:

PLAINTEXT
Namespace  Cluster Name     Maintenance  reusePVC
---------  ------------     -----------  --------
default    cluster-example  true         false
default    pg-backup        true         false
test       cluster-example  true         false
Do you want to proceed? [y/n]: y
Нажмите, чтобы развернуть и увидеть больше

fencing — заморозка инстансов

Заморозка отключает оператор от управления конкретным инстансом или всем кластером — полезно для ручного дебага PostgreSQL изнутри.

BASH
# Заморозить весь кластер
kubectl cnpg fencing on sandbox

# Заморозить конкретный под
kubectl cnpg fencing on sandbox sandbox-2

# Снять заморозку
kubectl cnpg fencing off sandbox
Нажмите, чтобы развернуть и увидеть больше

Бэкап

backup — запросить новый физический бэкап

Создаёт ресурс Backup:

BASH
# Обычный backup (Barman Cloud, например)
kubectl cnpg backup sandbox

# Volume snapshot
kubectl cnpg backup sandbox -m volumeSnapshot

# Online (hot) volume snapshot
kubectl cnpg backup sandbox -m volumeSnapshot --online

# Указать целевой инстанс политики
kubectl cnpg backup sandbox --backup-target prefer-standby
Нажмите, чтобы развернуть и увидеть больше

Имя бэкапа генерируется по времени запроса:

PLAINTEXT
$ kubectl cnpg backup cluster-example
backup/cluster-example-20230121002300 created
Нажмите, чтобы развернуть и увидеть больше

Дополнительные тонкие флаги для volume snapshot’ов: --immediate-checkpoint, --wait-for-archive.

Сертификаты

certificate — выпустить TLS-сертификат для пользователя

Оператор уже поднял CA для каждого кластера (см. Рецепт 2). Этой командой выпускается клиентский сертификат для конкретного PostgreSQL-пользователя.

BASH
kubectl cnpg certificate cluster-cert \
  --cnpg-cluster sandbox \
  --cnpg-user app
Нажмите, чтобы развернуть и увидеть больше

Извлечь содержимое:

BASH
kubectl get secret cluster-cert -o json | \
  jq -r '.data | map(@base64d) | .[]'
Нажмите, чтобы развернуть и увидеть больше

Бенчмарки

pgbench — нагрузочный тест PostgreSQL

BASH
# 30 секунд, 1 клиент, 1 поток
kubectl cnpg pgbench sandbox -- --time 30 --client 1 --jobs 1
Нажмите, чтобы развернуть и увидеть больше

Всё, что после --, передаётся встроенному pgbench. Поднимает временный Job рядом с кластером, который и гоняет нагрузку.

fio — бенчмарк storage

BASH
kubectl cnpg fio my-fio-job -n default
Нажмите, чтобы развернуть и увидеть больше

Создаёт PVC + ConfigMap + Deployment с fio для измерения IOPS/throughput на storage-классе CloudNativePG. Очень полезно при выборе storage-класса под Postgres (Рецепт 6).

Доступ к БД

psql — psql внутри пода

BASH
# Подключение к primary (под пользователем postgres, к БД postgres)
kubectl cnpg psql sandbox

# К реплике
kubectl cnpg psql --replica sandbox

# К конкретной БД
kubectl cnpg psql sandbox -- app

# Сразу выполнить запрос
kubectl cnpg psql sandbox -- -c "SELECT pg_is_in_recovery();"
Нажмите, чтобы развернуть и увидеть больше

⚠️ Подключение идёт от пользователя postgres (суперпользователя). На проде использовать только осознанно и авторизованно. Подробнее про политику suprerusers в CloudNativePG — Рецепт 3.

pgadmin4 — pgAdmin рядом с кластером

BASH
# Desktop-mode, без аутентификации (для evaluation/обучения)
kubectl cnpg pgadmin4 --mode desktop sandbox

# Server-mode (с аутентификацией pgAdmin)
kubectl cnpg pgadmin4 sandbox

# Просто посмотреть манифесты
kubectl cnpg pgadmin4 --dry-run sandbox
Нажмите, чтобы развернуть и увидеть больше

После запуска плагин подсказывает, как сделать port-forward на pgAdmin. Подробнее — Рецепт 4.

Логическая репликация

Самая мощная часть плагина — управление PostgreSQL PUBLICATION / SUBSCRIPTION декларативно через kubectl. Спасает при миграциях ~0 downtime (Рецепт 5).

⚠️ Перед использованием — обязательно изучите ограничения логической репликации PostgreSQL (DDL, sequences, large objects).

publication create — создать публикацию

Структура:

BASH
kubectl cnpg publication create \
  --publication PUBLICATION_NAME \
  [--external-cluster EXTERNAL_CLUSTER] \
  LOCAL_CLUSTER [options]
Нажмите, чтобы развернуть и увидеть больше

Два сценария:

Способы выбрать таблицы:

--dry-run показывает SQL, который будет выполнен, но не выполняет его.

Пример: публикация на внешнем кластере

BASH
kubectl cnpg publication create destination-cluster \
  --external-cluster=source-cluster \
  --all-tables
Нажмите, чтобы развернуть и увидеть больше

Пример: публикация в локальном кластере

BASH
kubectl cnpg publication create source-cluster \
  --publication=app --all-tables
Нажмите, чтобы развернуть и увидеть больше

publication drop — удалить публикацию

BASH
kubectl cnpg publication drop \
  --publication PUBLICATION_NAME \
  [--external-cluster EXTERNAL_CLUSTER] \
  LOCAL_CLUSTER
Нажмите, чтобы развернуть и увидеть больше

subscription create — создать подписку

BASH
kubectl cnpg subscription create \
  --subscription SUBSCRIPTION_NAME \
  --publication PUBLICATION_NAME \
  --external-cluster EXTERNAL_CLUSTER \
  LOCAL_CLUSTER
Нажмите, чтобы развернуть и увидеть больше

Подписка живёт в LOCAL_CLUSTER и тянет данные из publication во внешнем кластере.

Пример:

BASH
kubectl cnpg subscription create destination-cluster \
  --external-cluster=source-cluster \
  --publication=app \
  --subscription=app
Нажмите, чтобы развернуть и увидеть больше

subscription drop — удалить подписку

BASH
kubectl cnpg subscription drop \
  --subscription SUBSCRIPTION_NAME \
  LOCAL_CLUSTER
Нажмите, чтобы развернуть и увидеть больше

subscription sync-sequences — синхронизация последовательностей

Главное ограничение PostgreSQL logical replication — последовательности (sequences) не реплицируются. При cutover их надо синхронизировать вручную перед переключением приложения. Эта команда подключается к источнику, читает все sequence’ы и обновляет их значения в локальной (целевой) БД:

BASH
kubectl cnpg subscription sync-sequences \
  --subscription app \
  destination-cluster
Нажмите, чтобы развернуть и увидеть больше

Установочные манифесты

install generate — сгенерировать манифесты оператора

Полезно для GitOps: сохранить манифесты оператора в репозиторий и применять через Argo/Flux.

BASH
# Сгенерировать дефолтный набор
kubectl cnpg install generate > cnpg.yaml

# Указать namespace и watch-namespace
kubectl cnpg install generate \
  --namespace cnpg-system \
  --watch-namespaces "default,production" \
  > cnpg.yaml
Нажмите, чтобы развернуть и увидеть больше

Применяется как обычно: kubectl apply --server-side -f cnpg.yaml.

Permissions: что нужно RBAC

Не все команды требуют админ-прав. Для CI / on-call ролей можно нарезать узкие RBAC. Минимальная сводка из официальной доки:

КомандаЧто нужно
statusclusters: get; pods: list; pods/exec, pods/proxy: create; PDBs: list
backupclusters: get; backups: create
restartclusters: get,patch; pods: get,delete
promoteclusters: get; clusters/status: patch; pods: get
psqlpods: get,list; pods/exec: create
logsclusters: get; pods: list; pods/log: get
pgadmin4clusters: get; configmaps,deployments,services,secrets: create
publication/subscriptionclusters: get; pods: get,list; pods/exec: create
report clusterclusters: get; pods: list; pods/log: get; jobs,events,PVCs: list
install/versionnone

Полная таблица — в официальной документации .

💡 Дать роли list на clusters — заработает автодополнение для большинства команд.

Интеграция с k9s

В k9s можно повесить cnpg-команды на горячие клавиши через k9s/plugins.yml . После этого, например, Shift+P на ресурсе Cluster запустит kubectl cnpg promote, Shift+Rrestart, Shift+Sstatus, и т. д.

Что в итоге

cnpg-плагин закрывает практически весь day-to-day управления PostgreSQL в Kubernetes: от рутинной диагностики и backup’ов до сложной логической репликации с миграцией ~0 downtime. Особенно полезен в связке с другими krew-плагинами:

BASH
kubectl krew install cnpg view-secret view-cert stern ctx ns neat
Нажмите, чтобы развернуть и увидеть больше

Этот набор закрывает 90% операционки и сильно сокращает количество CLI-цепочек, которые надо помнить наизусть.

Полезные ссылки

Авторские права

Автор: Vasiliy Fakunin

Ссылка: https://notes.melancholic.tech/posts/cnpg-kubectl-%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD-%D0%B4%D0%BB%D1%8F-cloudnativepg-%D0%BF%D0%BE%D0%B4%D1%80%D0%BE%D0%B1%D0%BD%D1%8B%D0%B9-%D1%80%D0%B0%D0%B7%D0%B1%D0%BE%D1%80-%D0%B2%D1%81%D0%B5%D1%85-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

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

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