ADG Оставить заявку
Блог DevOps 4 мин чтения

Kubernetes 1.17: переводим production на beta Volume Snapshots

Kubernetes 1.17 вышел в декабре 2019-го с GA-статусом Storage Topology и beta Volume Snapshots. Переводим первые production-кластеры и разбираем, что это меняет для stateful-приложений.

Контекст момента

Kubernetes 1.17 GA (декабрь 2019): Volume Snapshot beta, Storage Topology GA, IPv4/IPv6 dual-stack alpha

Kubernetes 1.17 вышел в декабре, и мы дали ему пару недель на то, чтобы осесть в виде нормальных пакетов в managed-провайдерах. Теперь переводим первые production-кластеры. Главная причина торопиться - не dual-stack и не Storage Topology (хотя последнее тоже приятно), а то, что Volume Snapshots наконец перешли в статус beta.

Это первый цикл обновления, где мы не чувствуем, что бежим по льду.

Что именно вышло

Volume Snapshot - beta. Было alpha ещё с 1.12, но API трясло достаточно, чтобы не ставить в production ничего всерьёз зависящего от него. Теперь VolumeSnapshot, VolumeSnapshotContent и VolumeSnapshotClass - официальный beta с зафиксированным API. CSI-драйвер со стороны провайдера нужен, но сам механизм больше не меняется под ногами.

Storage Topology - GA. Планировщик теперь официально умеет учитывать топологию при размещении PVC: если узел в зоне ru-central1-a, томами из другой зоны его кормить не будет. Звучит банально, но до 1.17 это был бета-флаг, который мы включали с осторожностью.

IPv4/IPv6 dual-stack - alpha. Нас это не касается напрямую, отмечаем как факт.

Почему Volume Snapshots важны именно сейчас

До 1.17 бэкап stateful-приложений в Kubernetes выглядел примерно так: Velero плюс Restic плюс что-то кастомное поверх, если провайдерский CSI не дружил с Restic нужным образом. Работало, но каждый раз собирался небольшой Франкенштейн - зоопарк хуков, скриптов перед/после, ручных снэпшотов через API провайдера.

С beta-снэпшотами пайплайн становится проще:

  • Создаёшь VolumeSnapshotClass под конкретный CSI-драйвер.
  • В каждом namespace, где живут stateful-workload-ы, вешаешь CronJob или используешь оператор типа Stash / k8up - они умеют создавать VolumeSnapshot нативно.
  • Снэпшот идёт через CSI-драйвер провайдера, то есть на стороне провайдера это честный блочный снэпшот, а не копирование файлов по сети.
  • Восстановление - dataSource в новом PVC. Чисто, предсказуемо.

Велеро с 1.17 тоже начинает нативно работать с VolumeSnapshot вместо Restic, если провайдер поддерживает CSI. Это разница между «бэкап 20 минут файловым копированием» и «снэпшот за 30 секунд на уровне блочного устройства».

Как обновляем

Схема обновления у нас стандартная для managed Kubernetes: сначала dev-кластер, потом staging, потом production по одному кластеру с окном обслуживания.

На 1.17 пока перевели dev и один из staging. Несколько наблюдений:

Deprecation API 1.16 уже аукается. extensions/v1beta1 для Ingress и Deployments deprecated с 1.16, и если манифесты не обновили заранее - обновление 1.16 -> 1.17 это снова напоминает об этом. У нас большинство чистили ещё при переходе на 1.16, но в паре репозиториев нашлись старые Helm-чарты с apiVersion: extensions/v1beta1. Удобный момент разобраться.

VolumeSnapshotClass требует CSI-драйвера с нужной версией. Не любой CSI-драйвер, который был в 1.16, умеет нормально работать с beta-снэпшотами. Нужно проверить, что драйвер обновлён у провайдера.

Storage Topology работает без дополнительных телодвижений, если provisionMode у StorageClass уже был WaitForFirstConsumer. Большинство наших production-классов так и настроены - переход прозрачный.

Про бэкап Postgres конкретно

Мы в нескольких кластерах держим Postgres через оператор. Раньше бэкап - это pgBackRest в sidecar плюс S3. Надёжно, но сложно. С VolumeSnapshot появляется альтернатива для точек восстановления: снэпшот PVC как дополнение к WAL-архиву. Восстановить кластер с снэпшота плюс WAL-реплей до нужной транзакции - стандартная схема, теперь первую часть делаем через Kubernetes, а не через API провайдера вручную.

Полностью на снэпшоты как единственный метод переходить не собираемся - слишком свежо, чтобы на это полагаться без pgBackRest под боком. Но иметь нативный снэпшот как дополнительный уровень - это уже другой разговор.

Что дальше

До конца января планируем перевести первые production-кластеры. Если что-то пойдёт не так - расскажем. Пока статистика обновления dev/staging не даёт поводов для паники, что уже хорошо.

Storage Topology GA убирает один класс неприятных сюрпризов с PVC в мультизональных кластерах. Volume Snapshots переводят бэкап stateful-workload-ов с «работает, но страшновато» в «можно доверять схеме». Для нас это два достаточных аргумента, чтобы не затягивать с переходом.

Контакт

Нужна такая же инженерная работа?

Опишите задачу и контекст. Ответим в течение рабочего дня, при необходимости подпишем NDA.