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-ов с «работает, но страшновато» в «можно доверять схеме». Для нас это два достаточных аргумента, чтобы не затягивать с переходом.