Модуль 4.4: Знімки томів та клонування
Складність:
[MEDIUM]— Захист даних та клонуванняЧас на виконання: 30–40 хвилин
Передумови: Модуль 4.2 (PV та PVC), Модуль 4.3 (StorageClasses)
Що ви зможете робити
Розділ «Що ви зможете робити»Після цього модуля ви зможете:
- Створити VolumeSnapshots та відновити PVC зі знімків для резервного копіювання та відновлення
- Налаштувати VolumeSnapshotClasses та пояснити, як вони пов’язані зі StorageClasses
- Імплементувати стратегію резервного копіювання на основі знімків для stateful-навантажень
- Дебажити збої знімків, перевіряючи логи snapshot controller та можливості CSI-драйвера
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»Знімки томів надають копії ваших постійних даних на певний момент часу — це важливо для резервного копіювання, аварійного відновлення та створення тестових середовищ. Клонування томів дозволяє створювати нові томи з існуючих. На іспиті CKA можуть перевіряти ваше розуміння цих примітивів захисту даних, особливо оскільки вони стають все поширенішими у продакшен-середовищах Kubernetes.
Аналогія з фотоапаратом
Уявіть VolumeSnapshot як фотографію ваших даних у конкретний момент. Фото фіксує саме те, як виглядав ваш диск у цю мить. Пізніше ви можете використати це фото для відновлення диска до точного стану або створити новий диск, який починається як копія того моменту. VolumeSnapshotClass — це як налаштування фотоапарата — він визначає, як знімок створюється та зберігається.
Що ви дізнаєтесь
Розділ «Що ви дізнаєтесь»Після завершення цього модуля ви зможете:
- Розуміти архітектуру знімків (VolumeSnapshotClass, VolumeSnapshot, VolumeSnapshotContent)
- Створювати VolumeSnapshots з існуючих PVC
- Відновлювати томи зі знімків
- Клонувати томи за допомогою dataSource
- Розуміти вимоги CSI для знімків
Чи знали ви?
Розділ «Чи знали ви?»- Знімки є інкрементальними: Більшість бекендів сховища зберігають знімки як різницю від оригіналу, заощаджуючи місце
- CSI є обов’язковим: Застарілі вбудовані (in-tree) плагіни томів не підтримують знімки — вам потрібні CSI-драйвери
- Copy-on-write: Багато систем зберігання використовують CoW для знімків, що робить їх створення майже миттєвим
- Відновлення між namespace: VolumeSnapshotContent має область видимості кластера, що дозволяє реалізувати сценарії аварійного відновлення
Частина 1: Архітектура знімків
Розділ «Частина 1: Архітектура знімків»1.1 Три ресурси знімків
Розділ «1.1 Три ресурси знімків»┌──────────────────────────────────────────────────────────────────────┐│ Архітектура знімків ││ ││ Подібно до моделі PV/PVC: ││ ││ VolumeSnapshotClass VolumeSnapshot VolumeSnapshot ││ (область кластера) (у namespace) Content ││ ┌─────────────────┐ ┌─────────────┐ (область кластера)││ │ Визначає ЯК │ │ Запит на │ ┌─────────────┐ ││ │ створюються │ │ знімок │ │ Фактичне │ ││ │ знімки │◄────────│ конкретного │─────►│ посилання │ ││ │ │ │ PVC │ │ на знімок │ ││ │ - driver │ │ - source │ │ │ ││ │ - deletionPolicy│ │ - class │ │ - driver │ ││ └─────────────────┘ └─────────────┘ │ - handle │ ││ └─────────────┘ ││ ││ Адмін створює Розробник створює Створюється ││ (раз на кластер) (за потреби) автоматично ││ (контролером) │└──────────────────────────────────────────────────────────────────────┘1.2 Як це відповідає PV/PVC
Розділ «1.2 Як це відповідає PV/PVC»| Зберігання | Знімки |
|---|---|
| StorageClass | VolumeSnapshotClass |
| PersistentVolume | VolumeSnapshotContent |
| PersistentVolumeClaim | VolumeSnapshot |
1.3 Передумови
Розділ «1.3 Передумови»Перед використанням знімків вам потрібно:
- CSI-драйвер, що підтримує знімки (не всі підтримують)
- Контролер знімків, розгорнутий у кластері
- CRD для знімків встановлені
- VolumeSnapshotClass створений
# Перевірити, чи встановлені CRD для знімківk get crd | grep snapshot# volumesnapshotclasses.snapshot.storage.k8s.io# volumesnapshotcontents.snapshot.storage.k8s.io# volumesnapshots.snapshot.storage.k8s.io
# Перевірити наявність контролера знімківk get pods -n kube-system | grep snapshotЧастина 2: VolumeSnapshotClass
Розділ «Частина 2: VolumeSnapshotClass»2.1 Створення VolumeSnapshotClass
Розділ «2.1 Створення VolumeSnapshotClass»apiVersion: snapshot.storage.k8s.io/v1kind: VolumeSnapshotClassmetadata: name: csi-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" # Опціональноdriver: ebs.csi.aws.com # Має збігатися з CSI-драйверомdeletionPolicy: Delete # Delete або Retainparameters: # Параметри, специфічні для драйвера # Приклад для деяких драйверів: # csi.storage.k8s.io/snapshotter-secret-name: snap-secret # csi.storage.k8s.io/snapshotter-secret-namespace: default2.2 Політики видалення
Розділ «2.2 Політики видалення»| Політика | Поведінка |
|---|---|
| Delete | VolumeSnapshotContent та базовий знімок видаляються при видаленні VolumeSnapshot |
| Retain | VolumeSnapshotContent та знімок зберігаються після видалення VolumeSnapshot |
2.3 Приклади для хмарних провайдерів
Розділ «2.3 Приклади для хмарних провайдерів»AWS EBS CSI:
apiVersion: snapshot.storage.k8s.io/v1kind: VolumeSnapshotClassmetadata: name: ebs-snapclassdriver: ebs.csi.aws.comdeletionPolicy: DeleteGCP PD CSI:
apiVersion: snapshot.storage.k8s.io/v1kind: VolumeSnapshotClassmetadata: name: gcp-snapclassdriver: pd.csi.storage.gke.iodeletionPolicy: Deleteparameters: storage-locations: us-central1Azure Disk CSI:
apiVersion: snapshot.storage.k8s.io/v1kind: VolumeSnapshotClassmetadata: name: azure-snapclassdriver: disk.csi.azure.comdeletionPolicy: Deleteparameters: incremental: "true"Частина 3: Створення знімків
Розділ «Частина 3: Створення знімків»3.1 Створення VolumeSnapshot
Розділ «3.1 Створення VolumeSnapshot»apiVersion: snapshot.storage.k8s.io/v1kind: VolumeSnapshotmetadata: name: data-snapshot namespace: productionspec: volumeSnapshotClassName: csi-snapclass # Посилання на клас source: persistentVolumeClaimName: data-pvc # PVC для знімка3.2 Процес створення знімка
Розділ «3.2 Процес створення знімка»┌─────────────────────────────────────────────────────────────────────┐│ Процес створення знімка ││ ││ 1. Створити VolumeSnapshot ││ │ ││ ▼ ││ 2. Контролер знімків перевіряє ││ - PVC існує ││ - VolumeSnapshotClass існує ││ - CSI-драйвер підтримує знімки ││ │ ││ ▼ ││ 3. CSI-драйвер створює знімок на бекенді сховища ││ │ ││ ▼ ││ 4. VolumeSnapshotContent створено (автоматично) ││ │ ││ ▼ ││ 5. Статус VolumeSnapshot: readyToUse=true ││ │└─────────────────────────────────────────────────────────────────────┘3.3 Перевірка статусу знімка
Розділ «3.3 Перевірка статусу знімка»# Список знімківk get volumesnapshot -n production# NAME READYTOUSE SOURCEPVC SOURCESNAPSHOTCONTENT RESTORESIZE SNAPSHOTCLASS# data-snapshot true data-pvc 10Gi csi-snapclass
# Детальний статусk describe volumesnapshot data-snapshot -n production
# Перевірити VolumeSnapshotContentk get volumesnapshotcontent3.4 Поля статусу знімка
Розділ «3.4 Поля статусу знімка»status: boundVolumeSnapshotContentName: snapcontent-xxxxx creationTime: "2024-01-15T10:30:00Z" readyToUse: true # Знімок готовий restoreSize: 10Gi # Розмір при відновленні error: # Якщо невдача, тут повідомлення про помилкуЧастина 4: Відновлення зі знімків
Розділ «Частина 4: Відновлення зі знімків»4.1 Створення PVC зі знімка
Розділ «4.1 Створення PVC зі знімка»apiVersion: v1kind: PersistentVolumeClaimmetadata: name: restored-data namespace: productionspec: accessModes: - ReadWriteOnce storageClassName: fast-ssd # StorageClass для нового PVC resources: requests: storage: 10Gi # Має бути >= розміру знімка dataSource: # Ключова частина! name: data-snapshot # Ім'я VolumeSnapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io4.2 Процес відновлення
Розділ «4.2 Процес відновлення»┌─────────────────────────────────────────────────────────────────────┐│ Відновлення зі знімка ││ ││ VolumeSnapshot Новий PVC ││ ┌─────────────┐ ┌─────────────┐ ││ │ data-snap │ │ restored │ ││ │ │ │ │ ││ │ restoreSize:│◄──dataSource──────│ storage: │ ││ │ 10Gi │ │ 10Gi │ ││ └──────┬──────┘ └──────┬──────┘ ││ │ │ ││ ▼ ▼ ││ VolumeSnapshotContent Новий PV (з даними) ││ (містить дескриптор (наданий зі ││ знімка) знімка) ││ │└─────────────────────────────────────────────────────────────────────┘4.3 Відновлення між namespace
Розділ «4.3 Відновлення між namespace»VolumeSnapshotContent має область видимості кластера, тому можна відновлювати в різних namespace:
# У namespace "dr-test"apiVersion: v1kind: PersistentVolumeClaimmetadata: name: dr-restore namespace: dr-test # Інший namespace!spec: accessModes: - ReadWriteOnce storageClassName: fast-ssd resources: requests: storage: 10Gi dataSourceRef: # Використовуйте dataSourceRef для між-namespace name: data-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io namespace: production # Вихідний namespaceПримітка: Відновлення між namespace потребує Kubernetes 1.26+ та відповідного RBAC.
Частина 5: Клонування томів
Розділ «Частина 5: Клонування томів»5.1 Що таке клонування томів?
Розділ «5.1 Що таке клонування томів?»Клонування створює новий PVC з даними з існуючого PVC без попереднього створення знімка.
┌─────────────────────────────────────────────────────────────────────┐│ Знімок vs Клон ││ ││ ЗНІМОК КЛОН ││ ────── ──── ││ PVC → Знімок → Новий PVC PVC → Новий PVC (напряму) ││ ││ Двокроковий процес Однокроковий процес ││ Резервна копія на момент часу Негайна копія ││ Можна відновити багато разів Одна операція копіювання ││ Знімок зберігається Немає проміжного артефакту ││ │└─────────────────────────────────────────────────────────────────────┘5.2 Створення клону
Розділ «5.2 Створення клону»apiVersion: v1kind: PersistentVolumeClaimmetadata: name: cloned-dataspec: accessModes: - ReadWriteOnce storageClassName: fast-ssd resources: requests: storage: 10Gi # Має бути >= вихідного PVC dataSource: # Клонування з існуючого PVC name: source-pvc # Ім'я вихідного PVC kind: PersistentVolumeClaim # Інший kind, ніж для знімка!5.3 Вимоги до клонування
Розділ «5.3 Вимоги до клонування»- Джерело та клон повинні бути в одному namespace
- Бекенд сховища повинен підтримувати клонування
- Розмір клону має бути >= розміру джерела
- Зазвичай потрібен той самий StorageClass
5.4 Випадки використання клонування
Розділ «5.4 Випадки використання клонування»| Випадок використання | Опис |
|---|---|
| Середовища dev/test | Клонування продакшен-даних для тестування |
| Резервні копії перед оновленням | Клонування перед ризикованими змінами |
| Аналіз даних | Клон для аналітики без впливу на продакшен |
| Паралельна обробка | Кілька клонів для паралельних навантажень |
Частина 6: Найкращі практики
Розділ «Частина 6: Найкращі практики»6.1 Стратегія резервного копіювання
Розділ «6.1 Стратегія резервного копіювання»# Створення знімків за розкладом за допомогою CronJob або зовнішнього інструментуapiVersion: snapshot.storage.k8s.io/v1kind: VolumeSnapshotmetadata: name: daily-backup-2024-01-15 labels: backup-type: daily source-pvc: database-dataspec: volumeSnapshotClassName: csi-snapclass source: persistentVolumeClaimName: database-data6.2 Зберігання знімків
Розділ «6.2 Зберігання знімків»# Очищення старих знімків (концепція скрипта)# Зберігати останні 7 щоденних, 4 щотижневих, 12 щомісячних
# Список знімків старших за 7 днів з міткою dailyk get volumesnapshot -l backup-type=daily --sort-by=.metadata.creationTimestamp6.3 Консистентність додатків
Розділ «6.3 Консистентність додатків»Для консистентних знімків:
- Призупиніть запис перед знімком (якщо можливо)
- Скиньте буфери на диск
- Зробіть знімок швидко
- Відновіть запис
# Приклад: MySQL flush перед знімкомk exec mysql-pod -- mysql -e "FLUSH TABLES WITH READ LOCK;"# Створіть знімок тутk exec mysql-pod -- mysql -e "UNLOCK TABLES;"Типові помилки
Розділ «Типові помилки»| Помилка | Проблема | Рішення |
|---|---|---|
| Немає CSI-драйвера | Знімки не підтримуються | Встановіть CSI-драйвер з підтримкою знімків |
| Відсутні CRD для знімків | Ресурс VolumeSnapshot невідомий | Встановіть CRD для знімків |
| Неправильний driver у SnapshotClass | Знімок тихо не вдається | Узгодьте driver з іменем CSI-драйвера |
| Розмір відновлення замалий | PVC не надається | Використовуйте розмір >= restoreSize |
| Клонування між namespace | Не дозволено | Клони повинні бути в тому самому namespace, що й джерело |
| Видалення вихідного PVC | Клони можуть зазнати невдачі | Переконайтесь, що клон завершено перед видаленням джерела |
Тест
Розділ «Тест»Q1: Знімок vs Клон
Розділ «Q1: Знімок vs Клон»Яка ключова різниця між відновленням зі знімка та клонуванням PVC?
Відповідь
Відновлення зі знімка використовує VolumeSnapshot як посередника — ви створюєте знімок, а потім створюєте новий PVC з цього знімка. Знімок зберігається і може бути використаний багаторазово.
Клонування створює новий PVC безпосередньо з існуючого PVC без проміжного знімка. Це однокроковий процес без постійного артефакту.
Q2: Призначення VolumeSnapshotClass
Розділ «Q2: Призначення VolumeSnapshotClass»Яку роль відіграє VolumeSnapshotClass?
Відповідь
VolumeSnapshotClass визначає як створюються знімки, подібно до того, як StorageClass визначає, як надаються PV. Він вказує:
- Який CSI-драйвер створює знімки
- Політику видалення (Delete або Retain)
- Параметри, специфічні для драйвера
Q3: Передумови для знімків
Розділ «Q3: Передумови для знімків»Які три речі повинні бути встановлені, перш ніж ви зможете використовувати знімки томів?
Відповідь
- CRD для знімків — визначення користувацьких ресурсів для VolumeSnapshot, VolumeSnapshotClass, VolumeSnapshotContent
- Контролер знімків — відстежує ресурси VolumeSnapshot та керує життєвим циклом
- CSI-драйвер з підтримкою знімків — фактичний драйвер, який створює знімки на бекенді сховища
Q4: Відновлення між namespace
Розділ «Q4: Відновлення між namespace»Чи можна відновити VolumeSnapshot в іншому namespace, ніж той, де він був створений?
Відповідь
Так, тому що VolumeSnapshotContent (який містить фактичне посилання на знімок) має область видимості кластера. Ви можете створити PVC в іншому namespace, який посилається на VolumeSnapshot за допомогою dataSourceRef з полем namespace (потрібен Kubernetes 1.26+).
Q5: Поле dataSource
Розділ «Q5: Поле dataSource»Яка різниця між використанням kind: VolumeSnapshot та kind: PersistentVolumeClaim у dataSource PVC?
Відповідь
kind: VolumeSnapshot— відновлення зі знімка (створює новий том зі знімка)kind: PersistentVolumeClaim— клонування існуючого PVC (копіює дані напряму)
Обидва використовують поле dataSource, але створюють новий том по-різному.
Практична вправа: Знімок та відновлення
Розділ «Практична вправа: Знімок та відновлення»Передумови
Розділ «Передумови»Ця вправа потребує кластер з:
- CSI-драйвером, що підтримує знімки
- Встановленими контролером знімків та CRD
Якщо використовуєте kind або minikube, можливо, знадобиться встановити їх вручну.
Завдання 1: Перевірити підтримку знімків
Розділ «Завдання 1: Перевірити підтримку знімків»# Перевірити існування CRDk get crd | grep snapshot
# Перевірити наявність VolumeSnapshotClassk get volumesnapshotclass
# Якщо немає, потрібно створити на основі вашого CSI-драйвераЗавдання 2: Створити тестові дані
Розділ «Завдання 2: Створити тестові дані»# Створити namespacek create ns snapshot-lab
# Створити PVCcat <<EOF | k apply -f -apiVersion: v1kind: PersistentVolumeClaimmetadata: name: source-data namespace: snapshot-labspec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: standard # Використовуйте StorageClass вашого кластераEOF
# Створити Под для запису данихcat <<EOF | k apply -f -apiVersion: v1kind: Podmetadata: name: data-writer namespace: snapshot-labspec: containers: - name: writer image: busybox:1.36 command: ['sh', '-c', 'echo "Important data created at $(date)" > /data/important.txt; sleep 3600'] volumeMounts: - name: data mountPath: /data volumes: - name: data persistentVolumeClaim: claimName: source-dataEOF
# Зачекати, поки дані будуть записаніsleep 10k exec -n snapshot-lab data-writer -- cat /data/important.txtЗавдання 3: Створити VolumeSnapshotClass (за потреби)
Розділ «Завдання 3: Створити VolumeSnapshotClass (за потреби)»# Приклад для AWS EBS CSI (змініть для вашого драйвера)cat <<EOF | k apply -f -apiVersion: snapshot.storage.k8s.io/v1kind: VolumeSnapshotClassmetadata: name: csi-snapclassdriver: ebs.csi.aws.com # Змініть на ваш CSI-драйверdeletionPolicy: DeleteEOFЗавдання 4: Створити знімок
Розділ «Завдання 4: Створити знімок»cat <<EOF | k apply -f -apiVersion: snapshot.storage.k8s.io/v1kind: VolumeSnapshotmetadata: name: source-snapshot namespace: snapshot-labspec: volumeSnapshotClassName: csi-snapclass source: persistentVolumeClaimName: source-dataEOF
# Зачекати, поки знімок буде готовийk get volumesnapshot -n snapshot-lab -w# Зачекайте, поки READYTOUSE покаже "true"Завдання 5: “Пошкодити” оригінальні дані
Розділ «Завдання 5: “Пошкодити” оригінальні дані»# Імітувати втрату данихk exec -n snapshot-lab data-writer -- sh -c 'echo "Corrupted!" > /data/important.txt'k exec -n snapshot-lab data-writer -- cat /data/important.txt# Показує: Corrupted!Завдання 6: Відновити зі знімка
Розділ «Завдання 6: Відновити зі знімка»# Видалити Под (щоб звільнити PVC)k delete pod -n snapshot-lab data-writer
# Створити новий PVC зі знімкаcat <<EOF | k apply -f -apiVersion: v1kind: PersistentVolumeClaimmetadata: name: restored-data namespace: snapshot-labspec: accessModes: - ReadWriteOnce storageClassName: standard resources: requests: storage: 1Gi dataSource: name: source-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.ioEOF
# Створити Под для перевірки відновлених данихcat <<EOF | k apply -f -apiVersion: v1kind: Podmetadata: name: data-reader namespace: snapshot-labspec: containers: - name: reader image: busybox:1.36 command: ['sh', '-c', 'cat /data/important.txt; sleep 3600'] volumeMounts: - name: data mountPath: /data volumes: - name: data persistentVolumeClaim: claimName: restored-dataEOF
# Перевірити, що оригінальні дані відновленіk logs -n snapshot-lab data-reader# Має показати: Important data created at <оригінальна мітка часу>Критерії успіху
Розділ «Критерії успіху»- VolumeSnapshotClass створено
- VolumeSnapshot показує readyToUse: true
- Новий PVC створено зі знімка
- Відновлені дані збігаються з оригіналом (не пошкоджена версія)
Очищення
Розділ «Очищення»k delete ns snapshot-labk delete volumesnapshotclass csi-snapclassПрактичні вправи
Розділ «Практичні вправи»Вправа 1: Список ресурсів знімків (1 хв)
Розділ «Вправа 1: Список ресурсів знімків (1 хв)»# Завдання: Знайти всі ресурси, пов'язані зі знімкамиk api-resources | grep snapshotВправа 2: Створити VolumeSnapshotClass (2 хв)
Розділ «Вправа 2: Створити VolumeSnapshotClass (2 хв)»# Завдання: Створити SnapshotClass для вашого CSI-драйвера з політикою DeleteВправа 3: Перевірити статус знімка (1 хв)
Розділ «Вправа 3: Перевірити статус знімка (1 хв)»# Завдання: Перевірити, що знімок готовий до використанняk get volumesnapshot <name> -o jsonpath='{.status.readyToUse}'Вправа 4: Відновити зі знімка (2 хв)
Розділ «Вправа 4: Відновити зі знімка (2 хв)»# Завдання: Створити PVC зі знімка "backup-snap"# Ключ: dataSource з kind: VolumeSnapshotВправа 5: Клонувати PVC (2 хв)
Розділ «Вправа 5: Клонувати PVC (2 хв)»# Завдання: Клонувати PVC "source-pvc" до "clone-pvc"# Ключ: dataSource з kind: PersistentVolumeClaimВправа 6: Знайти розмір знімка (1 хв)
Розділ «Вправа 6: Знайти розмір знімка (1 хв)»# Завдання: Отримати розмір відновлення знімкаk get volumesnapshot <name> -o jsonpath='{.status.restoreSize}'Вправа 7: Перевірити VolumeSnapshotContent (1 хв)
Розділ «Вправа 7: Перевірити VolumeSnapshotContent (1 хв)»# Завдання: Знайти VolumeSnapshotContent для VolumeSnapshotk get volumesnapshot <name> -o jsonpath='{.status.boundVolumeSnapshotContentName}'Наступний модуль
Розділ «Наступний модуль»Переходьте до Модуль 4.5: Усунення несправностей зберігання, щоб дізнатися, як діагностувати та виправляти типові проблеми зберігання.