Це багатосторінковий друкований вигляд цього розділу. Натисність щоб друкувати.
Зберігання
Pod
ів у вашому кластері.1 - Томи
Файли на диску в контейнері є ефемерними, що викликає певні проблеми для складних застосунків при їх виконанні в контейнерах. Одна з проблем виникає під час аварії або зупинки контейнера. Стан контейнера не зберігається, тому всі файли, що були створені чи змінені під час життя контейнера, втрачаються. Під час аварії kubelet перезапускає контейнер в його первісному стані. Ще одна проблема виникає, коли кілька контейнерів працюють у Pod
та потребують спільного доступу до файлів. Створення та отримання доступу до спільної файлової системи для всіх контейнерів може бути не простим завданням. Абстракція volume у Kubernetes дозволяє розвʼязати обидві ці проблеми. Рекомендується вже мати уявлення про Podʼи.
Контекст
Kubernetes підтримує багато типів томів. Pod може використовувати одночасно будь-яку кількість типів томів. Типи ефемеральних томів існують протягом життєвого циклу Podʼа, але постійні томи існують поза життєвим циклом Podʼа. Коли Pod припиняє існування, Kubernetes знищує ефемеральні томи; проте Kubernetes не знищує постійні томи. Для будь-якого виду тому в певному Podʼі дані зберігаються при перезапуску контейнера.
У своєму основному визначенні том — це каталог, можливо, з деякими даними в ньому, який доступний контейнерам в Podʼі. Те, як цей каталог стає наявним, носій, який його підтримує, і його вміст визначаються конкретним типом тому.
Для використання тому вказуйте томи, які надаються для Podʼа в .spec.volumes
і зазначте, куди монтувати ці томи в контейнери в .spec.containers[*].volumeMounts
. Процес в контейнері бачить перегляд файлової системи, створений з початкового вмісту образу контейнера, а також томи (якщо визначено), змонтовані всередині контейнера. Процес бачить кореневу файлову систему, яка спочатку відповідає вмісту образу контейнера. Будь-які записи всередині ієрархії файлової системи, якщо дозволено, впливають на те, що цей процес бачить при виконанні наступного доступу до файлової системи. Томи монтуються за вказаними шляхами всередині образу. Для кожного контейнера, визначеного в Podʼі, ви повинні незалежно вказати, куди монтувати кожен том, яким користується контейнер.
Томи не можуть монтуватися всередині інших томів (але див. Використання subPath для повʼязаного механізму). Також том не може містити жорстке посилання на будь-що в іншому томі.
Типи томів
Kubernetes підтримує кілька типів томів.
awsElasticBlockStore (застаріло)
У Kubernetes 1.31, всі операції з типом awsElasticBlockStore
будуть перенаправлені на драйвер ebs.csi.aws.com
CSI.
Вбудований драйвер сховища AWSElasticBlockStore був застарілим у випуску Kubernetes v1.19 і потім був повністю вилучений у випуску v1.27.
Проєкт Kubernetes рекомендує використовувати сторонній драйвер сховища AWS EBS замість.
azureDisk (застаріло)
У Kubernetes 1.31, всі операції з типом azureDisk
будуть перенаправлені на драйвер disk.csi.azure.com
CSI.
Вбудований драйвер сховища AzureDisk був застарілим у випуску Kubernetes v1.19 і потім був повністю вилучений у випуску v1.27.
Проєкт Kubernetes рекомендує використовувати сторонній драйвер сховища Azure Disk замість.
azureFile (застаріло)
Kubernetes v1.21 [deprecated]
Тип тому azureFile
монтує том файлу Microsoft Azure (SMB 2.1 і 3.0) в Pod.
Для отримання докладнішої інформації див. Втулок томів azureFile
.
Міграція до CSI для azureFile
Kubernetes v1.26 [stable]
Функція CSIMigration
для azureFile
, якщо увімкнена, перенаправляє всі операції втулка з наявного вбудованого втулка до драйвера інтерфейсу зберігання (Container Storage Interface, CSI) file.csi.azure.com
контейнера. Для використання цієї функції необхідно встановити Драйвер CSI для Azure File у кластері, і функціональна можливість CSIMigrationAzureFile
має бути увімкненою.
Драйвер CSI для Azure File не підтримує використання одного й того ж тому з різними fsgroups. Якщо CSIMigrationAzureFile
увімкнено, використання одного й того ж тому з різними fsgroups взагалі не підтримується.
Завершення міграції до CSI для azureFile
Kubernetes v1.21 [alpha]
Щоб вимкнути завантаження втулка сховища azureFile
контролером і менеджером kubelet, встановіть прапорець InTreePluginAzureFileUnregister
в значення true
.
cephfs (видалено)
Kubernetes 1.31 не містить типу тому cephfs
.
Драйвер вбудованої системи зберігання cephfs
був застарілий у випуску Kubernetes v1.28, а потім повністю видалений у випуску v1.31.
cinder (застаріло)
У Kubernetes 1.31, всі операції з типом cinder
будуть перенаправлені на драйвер cinder.csi.openstack.org
CSI.
Вбудований драйвер сховища Cinder для OpenStack був застарілим ще у випуску Kubernetes v1.11 і потім був повністю вилучений у випуску v1.26.
Проєкт Kubernetes рекомендує натомість використовувати сторонній драйвер сховища OpenStack Cinder.
configMap
ConfigMap надає можливість вводити конфігураційні дані у Podʼи. Дані, збережені в ConfigMap, можуть бути використані у томі типу configMap
і потім використовуватись контейнеризованими застосунками, що працюють у Podʼі.
При посиланні на ConfigMap ви вказуєте імʼя ConfigMap у томі. Ви можете налаштувати шлях для конкретного запису в ConfigMap. Наведена нижче конфігурація показує, як замонтувати ConfigMap з імʼям log-config
у Pod з імʼям configmap-pod
:
apiVersion: v1
kind: Pod
metadata:
name: configmap-pod
spec:
containers:
- name: test
image: busybox:1.28
command: ['sh', '-c', 'echo "The app is running!" && tail -f /dev/null']
volumeMounts:
- name: config-vol
mountPath: /etc/config
volumes:
- name: config-vol
configMap:
name: log-config
items:
- key: log_level
path: log_level
ConfigMap log-config
змонтовано як том, і весь вміст, збережений у його запису log_level
, змонтовано в Pod за шляхом /etc/config/log_level
. Зверніть увагу, що цей шлях виводиться з mountPath
тому та path
з ключем log_level
.
Примітка:
Ви повинні створити ConfigMap, перш ніж ви зможете його використовувати.
ConfigMap завжди монтується як
readOnly
.Контейнер, який використовує ConfigMap як том з
subPath
монтування тому, не буде отримувати оновлення ConfigMap.Текстові дані використовуються як файли за допомогою кодування UTF-8. Для інших кодувань символів використовуйте
binaryData
.
downwardAPI
Том downwardAPI
робить дані downward API доступними для застосунків. У межах тому ви можете знайти відкриті дані, викладені у вигляді файлів у форматі звичайного тексту, доступні для читання.
Примітка:
Контейнер, який використовує downward API як монтування тому зsubPath
, не отримує оновлень при зміні значень полів.Дивіться Передавання інформації про Podʼи контейнерам через файли для отримання докладнішої інформації.
emptyDir
Для Podʼа, який визначає том emptyDir
, том створюється, коли Pod призначається до вузла. Як і зазначено в назві, том emptyDir
спочатку є порожнім. Всі контейнери в Pod можуть читати та записувати ті самі файли у томі emptyDir
, хоча цей том може бути змонтований на той самий чи різні шляхи в кожному контейнері. При видаленні Podʼа з вузла з будь-якої причини дані в томі emptyDir
видаляються назавжди.
Примітка:
Крах контейнера не призводить до видалення Podʼа з вузла. Дані в томіemptyDir
зберігаються при аваріях контейнера.Деякі використання тому emptyDir
:
- робочий простір, наприклад, для сортування залишків на основі диска
- контрольна точка для тривалого обчислення для відновлення після аварії
- утримання файлів, якими управляє контейнер вмісту, поки контейнер вебсервер обслуговує дані
Поле emptyDir.medium
контролює, де зберігаються томи emptyDir
. Типово томи emptyDir
зберігаються у томі, який підтримує вузол такому як диск, SSD або мережеве сховище, залежно від вашого середовища. Якщо ви встановите поле emptyDir.medium
в "Memory"
, Kubernetes автоматично монтує tmpfs (віртуальна файлова система в памʼяті) замість цього. Хоча tmpfs дуже швидкий, слід памʼятати, що, на відміну від дисків, файли, які ви записуєте, враховуються у ліміті памʼяті контейнера, який їх записав.
Можна вказати обмеження розміру для типового носія, яке обмежує місткість тому emptyDir
. Простір виділяється з ефемерного сховища вузла. Якщо він заповнюється з іншого джерела (наприклад, файли логів чи образи), том emptyDir
може вийти з ладу через це обмеження.
Примітка:
Ви можете вказати розмір для томів, що зберігаються в памʼяті, за умови, що фцнкціональну можливістьSizeMemoryBackedVolumes
увімкнено у вашому кластері (вона була бета-версією та типово активною починаючи з випуску Kubernetes 1.22). Якщо ви не вказуєте розмір тому, томи, що зберігаються в памʼяті, налаштовуються на обсяг доступної памʼяті вузла.Увага:
Будь ласка, перевірте тут пункти, які слід врахувати з точки зору управління ресурсами при використанніemptyDir
, що зберігаються в памʼяті.Приклад налаштування emptyDir
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir:
sizeLimit: 500Mi
fc (fibre channel)
Тип тому fc
дозволяє монтувати наявний том з блочного зберігання по каналу звʼязку в Pod. Ви можете вказати одне чи кілька імен шляхів цілей (world wide name, WWN) за допомогою параметра targetWWNs
у конфігурації вашого тому. Якщо вказано кілька WWN, targetWWNs
очікує, що ці WWN належать до зʼєднань з багатьма шляхами.
Примітка:
Ви повинні налаштувати зону FC SAN, щоб виділити та приховати ці LUN (томи) для WWN цілей заздалегідь, щоб хости Kubernetes могли до них отримувати доступ.Дивіться приклад fibre channel для отримання докладнішої інформації.
gcePersistentDisk (застаріло)
У Kubernetes 1.31, всі операції з типом gcePersistentDisk
будуть перенаправлені на драйвер pd.csi.storage.gke.io
CSI.
Драйвер вбудованого сховища gcePersistentDisk
був застарілим ще у випуску Kubernetes v1.17 і потім був повністю вилучений у випуску v1.28.
Проєкт Kubernetes рекомендує натомість використовувати сторонній драйвер сховища Google Compute Engine Persistent Disk CSI.
gitRepo (застаріло)
Попередження:
Тип тому gitRepo
застарів. Щоб забезпечити те, що Pod має змонтований репозиторій git, ви можете змонтувати том EmptyDir, який монтується в init container, що клонує репозиторій за допомогою git, а потім монтує EmptyDir в контейнер Podʼа.
Ви можете обмежити використання томів gitRepo
у вашому кластері, використовуючи політики, такі як ValidatingAdmissionPolicy. Ви можете використовувати наступний вираз мови виразів загального виразу (Common Expression Language, CEL) як частину політики для відхилення використання томів gitRepo
: has(object.spec.volumes) || !object.spec.volumes.exists(v, has(v.gitRepo))
.
Том gitRepo
є прикладом втулка тому. Цей втулок монтує порожній каталог і клонує репозиторій git у цей каталог
для використання вашим Podʼом.
Ось приклад тому gitRepo
:
apiVersion: v1
kind: Pod
metadata:
name: server
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- mountPath: /mypath
name: git-volume
volumes:
- name: git-volume
gitRepo:
repository: "git@somewhere:me/my-git-repository.git"
revision: "22f1d8406d464b0c0874075539c1f2e96c253775"
glusterfs (вилучено)
Тип тому glusterfs
не включено в Kubernetes 1.31.
Вбудований драйвер сховища GlusterFS був застарілим ще у випуску Kubernetes v1.25 і потім був повністю вилучений у випуску v1.26.
hostPath
Том hostPath
монтує файл або каталог з файлової системи вузла хосту у ваш Pod. Це не є необхідним для більшості Podʼів, але це надає потужний аварійний вихід для деяких застосунків.
Попередження:
Використання типу тому hostPath
призводить до багатьох ризиків з погляду безпеки. Якщо ви можете уникнути використання тому hostPath
, то слід це зробити. Наприклад, визначте local
PersistentVolume та використовуйте натомість його.
Якщо ви обмежуєте доступ до конкретних каталогів на вузлі за допомогою перевірки прийняття часу валідації, це обмеження є ефективним лише тоді, коли ви додатково вимагаєте, щоб будь-які монтування тому hostPath
були тільки для читання. Якщо ви дозволяєте монтування тому hostPath
на читання та запис для ненадійного Podʼа, контейнери в цьому Podʼі можуть порушувати монтування хосту для читання та запису.
Будьте обережні при використанні томів hostPath
, незалежно від того, чи вони монтуються як тільки для читання, чи для читання та запису, оскільки:
- Доступ до файлової системи вузла може викрити привілейовані системні облікові дані (такі як для kubelet) або привілейовані API (такі як сокет середовища виконання контейнера), які можуть бути використані для втечі з контейнера або для атаки інших частин кластера.
- Podʼи з однаковою конфігурацією (такою як створені за допомогою PodTemplate) можуть поводитися по-різному на різних вузлах через різні файли на вузлах.
- Використання тома
hostPath
не розглядається як використання ефемерного сховища. Ви маєте самостійно стежити за використанням диска, оскільки надмірне використання диска `hostPath призведе до тиску на диск на вузлі.
Деякі використання тому hostPath
:
- виконання контейнера, який потребує доступу до системних компонентів рівня вузла (такого як контейнер, який передає системні логи до центрального сховища, з доступом до цих логів за допомогою монтування
/var/log
тільки для читання) - надання конфігураційного файлу, збереженого на хост-системі, доступного тільки для читання для статичного Podʼа; на відміну від звичайних Podʼів, статичні Podʼи не можуть отримувати доступ до ConfigMaps.
Типи томів hostPath
Крім обовʼязкової властивості path
, ви можете вказати необовʼязковий параметр type
для тому hostPath
.
Доступні значення для type
:
Значення | Поведінка |
---|---|
"" | Порожній рядок (стандартно) призначений для забезпечення сумісності з попередніми версіями, що означає, що перед монтуванням тому hostPath не виконуватимуться перевірки. |
DirectoryOrCreate | Якщо нічого не існує за вказаним шляхом, буде створено порожній каталог за необхідності з правами на виконання, встановленими на 0755, з тією ж групою і власником, що й Kubelet. |
Directory | Повинен існувати каталог за вказаним шляхом |
FileOrCreate | Якщо нічого не існує за вказаним шляхом, буде створено порожній файл за необхідності з правами на виконання, встановленими на 0644, з тією ж групою і власником, що й Kubelet. |
File | Повинен існувати файл за вказаним шляхом |
Socket | Має існувати UNIX-сокет за вказаним шляхом |
CharDevice | (Лише вузли Linux) Має існувати символьний пристрій за вказаним шляхом |
BlockDevice | (Лише вузли Linux) Має існувати блочний пристрій за вказаним шляхом |
Увага:
РежимFileOrCreate
не створює батьківський каталог файлу. Якщо батьківський каталог змонтуваного файлу не існує, Pod не вдасться запуститися. Щоб забезпечити роботу цього режиму, можна спробувати монтувати каталоги та файли окремо, як показано в прикладі FileOrCreate
для hostPath
.Деякі файли або каталоги, створені на базових вузлах, можуть бути доступні лише користувачу root. В такому випадку вам слід або запускати свій процес як root у привілейованому контейнері або змінювати права доступу до файлів на вузлі щоб мати змогу читати (або записувати) у том hostPath
.
Приклад конфігурації hostPath
---
# Цей маніфест монтує /data/foo на вузлі як /foo всередині
# єдиного контейнера, який працює в межах Podʼа hostpath-example-linux
#
# Монтування в контейнер тільки для читання
apiVersion: v1
kind: Pod
metadata:
name: hostpath-example-linux
spec:
os: { name: linux }
nodeSelector:
kubernetes.io/os: linux
containers:
* name: example-container
image: registry.k8s.io/test-webserver
volumeMounts:
* mountPath: /foo
name: example-volume
readOnly: true
volumes:
* name: example-volume
# монтувати /data/foo, але тільки якщо цей каталог вже існує
hostPath:
path: /data/foo # розташування каталогу на вузлі
type: Directory # це поле є необовʼязковим
---
# Цей маніфест монтує C:\Data\foo на вузлі як C:\foo всередині
# єдиного контейнера, який працює в межах Podʼа hostpath-example-windows
#
# Монтування в контейнер тільки для читання
apiVersion: v1
kind: Pod
metadata:
name: hostpath-example-windows
spec:
os: { name: windows }
nodeSelector:
kubernetes.io/os: windows
containers:
* name: example-container
image: microsoft/windowsservercore:1709
volumeMounts:
* name: example-volume
mountPath: "C:\\foo"
readOnly: true
volumes:
# монтувати C:\Data\foo з вузла, але тільки якщо цей каталог вже існує
* name: example-volume
hostPath:
path: "C:\\Data\\foo" # розташування каталогу на вузлі
type: Directory # це поле є необовʼязковим
Приклад конфігурації hostPath
для FileOrCreate
У наступному маніфесті визначено Pod, який монтує /var/local/aaa
всередині єдиного контейнера в Podʼі. Якщо на вузлі не існує шляху /var/local/aaa
, kubelet створює його як каталог і потім монтує його в Pod.
Якщо /var/local/aaa
вже існує, але не є каталогом, Pod зазнає невдачі. Крім того, kubelet намагається створити файл із назвою /var/local/aaa/1.txt
всередині цього каталогу (як бачить його вузол); якщо щось вже існує за цим шляхом і це не є звичайним файлом, Pod також зазнає невдачі.
Ось приклад маніфесту:
apiVersion: v1
kind: Pod
metadata:
name: test-webserver
spec:
os: { name: linux }
nodeSelector:
kubernetes.io/os: linux
containers:
- name: test-webserver
image: registry.k8s.io/test-webserver:latest
volumeMounts:
- mountPath: /var/local/aaa
name: mydir
- mountPath: /var/local/aaa/1.txt
name: myfile
volumes:
- name: mydir
hostPath:
# Забезпечте створення каталогу файлів.
path: /var/local/aaa
type: DirectoryOrCreate
- name: myfile
hostPath:
path: /var/local/aaa/1.txt
type: FileOrCreate
image
Kubernetes v1.31 [alpha]
(стандартно увімкнено: false)Джерело тому image
представляє обʼєкт OCI (образ контейнера або артефакт), який доступний на хост-машині kubelet.
Ось приклад використання джерела тому image
:
apiVersion: v1
kind: Pod
metadata:
name: image-volume
spec:
containers:
- name: shell
command: ["sleep", "infinity"]
image: debian
volumeMounts:
- name: volume
mountPath: /volume
volumes:
- name: volume
image:
reference: quay.io/crio/artifact:v1
pullPolicy: IfNotPresent
Том визначається при запуску Podʼа в залежності від значення pullPolicy
:
Always
- kubelet завжди намагається завантажити посилання. Якщо завантаження не вдається, kubelet встановлює статус Podʼа як
Failed
. Never
- kubelet ніколи не завантажує посилання і використовує лише локальний образ або артефакт. Pod стає
Failed
, якщо будь-які шари образу не присутні локально або якщо маніфест для цього образу не закешований. IfNotPresent
- kubelet завантажує образ, якщо посилання не присутнє на диску. Pod стає
Failed
, якщо посилання не присутнє і завантаження не вдалося.
Том буде знову визначено, якщо Pod буде видалено і перезавантажено, що означає, що новий віддалений контент стане доступним після відновлення Podʼа. Невдача у визначені або завантаженні образу під час запуску Podʼа заблокує запуск контейнерів і може спричинити значну затримку. Невдалі спроби будуть повторені з використанням звичайного механізму відновлення тому і буде повідомлено в причини та повідомленні Podʼа.
Типи обʼєктів, які можуть бути змонтовані цим томом, визначені реалізацією середовища виконання контейнерів на хост-машині і повинні включати всі дійсні типи, підтримувані полем образу контейнера. Обʼєкт OCI монтується в одну теку (spec.containers[*].volumeMounts.mountPath
) і буде змонтований в режимі тільки для читання. В Linux, середовище виконання контейнерів зазвичай також монтує том з блокуванням виконання файлів (noexec
).
Крім того:
- Субшляхи монтування контейнерів не підтримуються (
spec.containers[*].volumeMounts.subpath
). - Поле
spec.securityContext.fsGroupChangePolicy
не має жодного ефекту для цього типу тому. - Admission Controller
AlwaysPullImages
також працює для цього джерела тому, як і для образів контейнерів.
Доступні наступні поля для типу image
:
reference
- Посилання на артефакт, який слід використовувати. Наприклад, ви можете вказати
registry.k8s.io/conformance:v1.31.0
для завантаження файлів з образу тестування Kubernetes. Працює так само, якpod.spec.containers[*].image
. Секрети завантаження образів будуть зібрані так само, як для образу контейнера, шукаючи облікові дані вузла, секрети службового облікового запису завантаження образів та секрети завантаження образів з специфікації Podʼа. Це поле є необовʼязковим, щоб дозволити вищому рівню управління конфігурацією використовувати стандартні або перевизначати образи контейнерів у контролерах навантаження, таких як Deployments і StatefulSets. Більше інформації про образи контейнерів pullPolicy
- Політика завантаження обʼєктів OCI. Можливі значення:
Always
,Never
абоIfNotPresent
. Стандартно встановлюєтьсяAlways
, якщо вказано теґ:latest
, абоIfNotPresent
в іншому випадку.
Дивіться приклад Використання образу тому з Podʼом для більш детальної інформації про те, як використовувати джерело тому.
iscsi
Обʼєкт iscsi
дозволяє монтувати наявний том iSCSI (SCSI через IP) у ваш Pod. На відміну від emptyDir
, який видаляється, коли Pod видаляється, вміст тому iscsi
зберігається, і том просто розмонтується. Це означає, що том iSCSI можна наперед наповнити даними, і ці дані можна спільно використовувати між Podʼами.
Примітка:
Вам потрібно мати власний сервер iSCSI, на якому створено том, перш ніж ви зможете його використовувати.Особливістю iSCSI є те, що його можна монтувати як тільки для читання одночасно багатьма споживачами. Це означає, що ви можете наперед наповнити том своїми даними та потім обслуговувати їх паралельно зі стількох Podʼів, скільки вам потрібно. На жаль, томи iSCSI можна монтувати тільки одним споживачем у режимі читання-запису. Одночасні операції запису не допускаються.
Докладніше дивіться у прикладі iSCSI.
local
Обʼєкт local
представляє собою підключений локальний пристрій зберігання, такий як диск, розділ чи каталог.
Локальні томи можна використовувати лише як статично створені PersistentVolume. Динамічне розгортання не підтримується.
У порівнянні з томами hostPath
, томи local
використовуються в надійний та переносимий спосіб, не потрібно вручну планувати Podʼи на вузли. Система обізнана з обмеженнями вузла тому, переглядаючи приналежність вузла до PersistentVolume.
Однак томи local
є предметом доступності підключеного вузла і не підходять для всіх застосунків. Якщо вузол стає несправним, то том local
стає недоступним для Podʼи. Pod, що використовує цей том, не може працювати. Застосунки, які використовують томи local
, повинні бути здатні терпіти це зменшення доступності, а також можливу втрату даних, залежно від характеристик стійкості підключеного диска.
У наступному прикладі показано PersistentVolume з використанням тому local
і nodeAffinity
:
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 100Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /mnt/disks/ssd1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- example-node
Вам потрібно встановити nodeAffinity
для PersistentVolume при використанні томів local
. Планувальник Kubernetes використовує nodeAffinity
PersistentVolume для планування цих Podʼів на відповідний вузол.
PersistentVolume volumeMode
може бути встановлено на "Block" (замість станадартного значення "Filesystem") для експозиції локального тому як чистого (raw) блокового пристрою.
При використанні локальних томів рекомендується створити StorageClass із встановленим volumeBindingMode
в WaitForFirstConsumer
. Докладніше дивіться у прикладі StorageClass для локальних томів. Затримка вибору тому дозволяє переконатися, що рішення щодо привʼязки PersistentVolumeClaim буде оцінено разом із будь-якими іншими обмеженнями вузла, які може мати Pod, такими як вимоги до ресурсів вузла, вибір вузла, спорідненість Podʼа та анти-спорідненість Podʼа.
Можна використовувати зовнішнього статичного постачальника для кращого управління циклом життя локального тому. Зазначте, що цей постачальник не підтримує динамічне постачання. Для прикладу того, як запустити зовнішнього постачальника локального тому, дивіться посібник користувача постачальника локального тому.
Примітка:
Локальний PersistentVolume вимагає вручного очищення та видалення користувачем, якщо зовнішній статичний постачальник не використовується для управління циклом життя тому.nfs
Обʼєкт nfs
дозволяє приєднати наявний розділ NFS (Network File System) до Podʼа. На відміну від emptyDir
, який видаляється, коли Pod видаляється, вміст тому nfs
зберігається, і том просто відмонтується. Це означає, що том NFS можна попередньо наповнити даними, і ці дані можна спільно використовувати між Podʼами. Том NFS може бути приєднаний одночасно кількома записувачами.
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /my-nfs-data
name: test-volume
volumes:
- name: test-volume
nfs:
server: my-nfs-server.example.com
path: /my-nfs-volume
readOnly: true
Примітка:
Перед його використанням, вам потрібно мати власний сервер NFS, на якому експортовано розділ.
Також враховуйте, що ви не можете вказувати параметри монтування NFS у специфікації Podʼаа. Ви можете встановлювати параметри монтування на боці сервера або використовувати /etc/nfsmount.conf. Ви також можете монтувати томи NFS через PersistentVolumes, які дозволяють вам встановлювати параметри монтування.
Дивіться приклад NFS для прикладу монтування томів NFS з PersistentVolumes.
persistentVolumeClaim
Обʼєкт persistentVolumeClaim
використовується для монтування PersistentVolume в Pod. PersistentVolumeClaim є способом для користувачів "вимагати" надійне сховище (наприклад, том iSCSI) без знання деталей конкретного хмарного середовища.
Дивіться інформацію щодо PersistentVolumes для отримання додаткових деталей.
portworxVolume (застаріло)
Kubernetes v1.25 [deprecated]
Обʼєкт portworxVolume
— це еластичний рівень блочного сховища, який працює в режимі гіперконвергенції з Kubernetes. Portworx визначає сховище на сервері, розділяє його за можливостями і агрегує місткість на кількох серверах. Portworx працює в гостьовій операційній системі віртуальних машин або на bare metal серверах з ОС Linux.
Обʼєкт portworxVolume
можна динамічно створити через Kubernetes або його можна попередньо налаштувати та вказати в Podʼі. Тут наведено приклад Podʼа, який посилається на попередньо налаштований том Portworx:
apiVersion: v1
kind: Pod
metadata:
name: test-portworx-volume-pod
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /mnt
name: pxvol
volumes:
- name: pxvol
# Цей том Portworx повинен вже існувати.
portworxVolume:
volumeID: "pxvol"
fsType: "<fs-type>"
Примітка:
Переконайтеся, що існує том Portworx з іменемpxvol
, перш ніж використовувати його в Podʼі.Докладніше дивіться приклади томів Portworx.
Міграція на Portworx CSI
Kubernetes v1.25 [beta]
Стандартно Kubernetes 1.31 намагається мігрувати старі томи Portworx для використання CSI. (Міграція CSI для Portworx була доступна з Kubernetes v1.23, але стала стандатно увімкненою лише з випуску v1.31). Якщо ви хочете вимкнути автоматичну міграцію, ви можете встановити функціональну можливість CSIMigrationPortworx
у false
; це необхідно зробити як для kube-controller-manager, так і для кожного відповідного kubelet.
Це перенаправляє всі операції втулка з існуючого втулка вбудованої системи до драйвера Container Storage Interface (CSI) pxd.portworx.com
. Portworx CSI Driver повинен бути встановлений в кластері.
projected
Том projected підʼєднує кілька існуючих джерел томів в одну теку. Докладніше дивіться projected томи.
rbd (вилучено)
Kubernetes 1.31 не включає тип тому rbd
.
Драйвер зберігання Rados Block Device (RBD) і підтримка його міграції CSI були визнані застарілими у випуску Kubernetes v1.28 і повністю видалені в випуску v1.31.
secret
Том secret
використовується для передачі конфіденційної інформації, такої як паролі, у Podʼи. Ви можете зберігати секрети в API Kubernetes і монтувати їх як файли для використання Podʼами без привʼязки безпосередньо до Kubernetes. Томи secret
підтримуються tmpfs (файлова система, яка знаходиться в оперативній памʼяті), тому їх ніколи не записують на постіний носій.
Примітка:
Ви повинні створити Secret в API Kubernetes, перш ніж ви зможете його використовувати.
Секрет завжди монтується як
readOnly
.Контейнер, який використовує Secret як том
subPath
, не отримує оновлення Secret.
Для отримання додаткової інформації дивіться Налаштування Secret.
vsphereVolume (застаріло)
Примітка:
Проєкт Kubernetes рекомендує використовувати vSphere CSI зовнішній драйвер сховища замість цього.vsphereVolume
використовується для монтування тому vSphere VMDK у ваш Pod. Зміст тому зберігається при його демонтажі. Підтримуються обидва типи сховища VMFS та VSAN.
Для отримання додаткової інформації дивіться приклади томів vSphere.
Міграція на vSphere CSI
Kubernetes v1.26 [stable]
У Kubernetes 1.31, всі операції для типу vsphereVolume
, що використовується в інтегрованому стеку, перенаправляються на драйвер csi.vsphere.vmware.com
CSI.
Для цього має бути встановлений драйвер CSI для vSphere на кластері. Додаткові поради щодо міграції з інтегрованого стеку vsphereVolume
можна знайти на сторінці документації VMware Migrating In-Tree vSphere Volumes to vSphere Container Storage Plug-in. Якщо драйвер vSphere CSI не встановлено, не буде можливості виконати операції з томами, створеними за допомогою типу vsphereVolume
з інтегрованим стеком.
Для успішної міграції до драйвера vSphere CSI вам слід використовувати vSphere версії 7.0u2 або пізніше.
Якщо ви використовуєте версію Kubernetes відмінну від v1.31, перевірте документацію для цієї версії Kubernetes.
Примітка:
Наступні параметри StorageClass вбудованого втулка vsphereVolume
не підтримуються драйвером vSphere CSI:
diskformat
hostfailurestotolerate
forceprovisioning
cachereservation
diskstripes
objectspacereservation
iopslimit
Наявні томи, створені з використанням цих параметрів, будуть перенесені на драйвер vSphere CSI, але нові томи, створені драйвером vSphere CSI, не будуть враховувати ці параметри.
Завершення міграція до vSphere CSI
Kubernetes v1.19 [beta]
Щоб вимкнути завантаження втулка vsphereVolume
контролер-менеджером та kubelet, потрібно встановити прапорець InTreePluginvSphereUnregister
в значення true
. Драйвер csi.vsphere.vmware.com
CSI повинен бути встановлений на всіх вузлах робочого навантаження.
Використання subPath
Іноді корисно ділити один том для кількох цілей у одному Podʼі. Властивість volumeMounts[*].subPath
вказує підшлях всередині посилання на том, а не його корінь.
У наступному прикладі показано, як налаштувати Pod із стеком LAMP (Linux Apache MySQL PHP) за допомогою одного загального тому. Ця конфігурація subPath
у прикладі не рекомендується для використання в операційному середовищі.
Код та ресурси PHP-застосунку відображаються на томі у папці html
, а база даних MySQL зберігається у папці mysql
на цьому томі. Наприклад:
apiVersion: v1
kind: Pod
metadata:
name: my-lamp-site
spec:
containers:
- name: mysql
image: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "rootpasswd"
volumeMounts:
- mountPath: /var/lib/mysql
name: site-data
subPath: mysql
- name: php
image: php:7.0-apache
volumeMounts:
- mountPath: /var/www/html
name: site-data
subPath: html
volumes:
- name: site-data
persistentVolumeClaim:
claimName: my-lamp-site-data
Використання subPath із розширеними змінними середовища
Kubernetes v1.17 [stable]
Використовуйте поле subPathExpr
для створення імен каталогів subPath
із змінних середовища downward API. Властивості subPath
та subPathExpr
є взаємовиключними.
У цьому прикладі Pod
використовує subPathExpr
для створення каталогу pod1
всередині тома hostPath
/var/log/pods
. Том hostPath
отримує імʼя Pod
із downwardAPI
. Директорія хоста /var/log/pods/pod1
монтується у /logs
в контейнері.
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: container1
env:
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
image: busybox:1.28
command: [ "sh", "-c", "while [ true ]; do echo 'Hello'; sleep 10; done | tee -a /logs/hello.txt" ]
volumeMounts:
- name: workdir1
mountPath: /logs
# Для змінних використовуються круглі дужки (не фігурні).
subPathExpr: $(POD_NAME)
restartPolicy: Never
volumes:
- name: workdir1
hostPath:
path: /var/log/pods
Ресурси
Носій інформації (такий як диск чи SSD) тома emptyDir
визначається середовищем файлової системи, яке утримує кореневий каталог kubelet (зазвичай /var/lib/kubelet
). Немає обмежень щодо того, скільки місця може використовувати том emptyDir
чи hostPath
, і відсутня ізоляція між контейнерами чи між Podʼами.
Щоб дізнатися про те, як запросити місце за допомогою специфікації ресурсів, дивіться як управляти ресурсами.
Сторонні втулки томів
До стороннії втулків томів належать Container Storage Interface (CSI), а також FlexVolume (який є застарілим). Ці втулки дозволяють виробникам засобів для зберігання створювати власні зовнішні втулки томів без додавання їх вихідного коду до репозиторію Kubernetes.
Раніше всі втулки томів були "вбудованими". "Вбудовані" втулки збиралися, звʼязувалися, компілювалися і входили до базових бінарних файлів Kubernetes. Це означало, що для додавання нової системи зберігання до Kubernetes (втулка тому) потрібно було додавати код у основний репозиторій коду Kubernetes.
Як CSI, так і FlexVolume дозволяють розробляти втулки томів незалежно від кодової бази Kubernetes і встановлювати їх (інсталювати) на кластерах Kubernetes як розширення.
Для виробників засобів для зберігання, які прагнуть створити зовнішній втулок тома, будь ласка, звертайтеся до Поширених питань щодо втулків томів.
csi
Інтерфейс зберігання контейнерів (Container Storage Interface) (CSI) визначає стандартний інтерфейс для систем оркестрування контейнерів (таких як Kubernetes), щоб вони могли надавати доступ до різних систем зберігання своїм робочим навантаженням контейнерів.
Будь ласка, прочитайте пропозицію щодо дизайну CSI для отримання додаткової інформації.
Примітка:
Підтримка версій специфікації CSI 0.2 та 0.3 є застарілою в Kubernetes v1.13 і буде видалена у майбутньому релізі.Примітка:
Драйвери CSI можуть бути несумісними у всіх версіях Kubernetes. Перевірте документацію конкретного драйвера CSI для підтримуваних кроків розгортання для кожного релізу Kubernetes та матриці сумісності.Після розгортання сумісного з CSI драйвера тому у кластері Kubernetes, користувачі можуть використовувати тип тома csi
, щоб долучати чи монтувати томи, які надаються драйвером CSI.
Том csi
можна використовувати в Pod трьома різними способами:
- через посилання на PersistentVolumeClaim
- з загальним ефемерним томом
- з CSI ефемерним томом, якщо драйвер підтримує це
Для налаштування постійного тому CSI адміністраторам доступні такі поля:
driver
: Рядкове значення, яке вказує імʼя драйвера тома, яке треба використовувати. Це значення повинно відповідати значенню, що повертається відповіддюGetPluginInfoResponse
драйвера CSI, як це визначено в специфікації CSI. Воно використовується Kubernetes для ідентифікації того, який драйвер CSI слід викликати, і драйверами CSI для ідентифікації того, які обʼєкти PV належать драйверу CSI.volumeHandle
: Рядкове значення, яке унікально ідентифікує том. Це значення повинно відповідати значенню, що повертається в поліvolume.id
відповіддюCreateVolumeResponse
драйвера CSI, як це визначено в специфікації CSI. Значення передається якvolume_id
у всі виклики драйвера тома CSI при посиланні на том.readOnly
: Необовʼязкове булеве значення, яке вказує, чи повинен бути том «ControllerPublished» (приєднаний) як тільки для читання. Станадртно — false. Це значення передається драйверу CSI через полеreadonly
уControllerPublishVolumeRequest
.fsType
: ЯкщоVolumeMode
PV —Filesystem
, тоді це поле може бути використано для вказівки файлової системи, яку слід використовувати для монтування тому. Якщо том не був відформатований і підтримується форматування, це значення буде використано для форматування тому. Це значення передається драйверу CSI через полеVolumeCapability
уControllerPublishVolumeRequest
,NodeStageVolumeRequest
таNodePublishVolumeRequest
.volumeAttributes
: Масив зі строк, що вказує статичні властивості тому. Цей масив має відповідати масиву, що повертається в поліvolume.attributes
відповіддюCreateVolumeResponse
драйвера CSI, як це визначено в специфікації CSI. Масив передається драйверу CSI через полеvolume_context
уControllerPublishVolumeRequest
,NodeStageVolumeRequest
таNodePublishVolumeRequest
.controllerPublishSecretRef
: Посилання на обʼєкт secret, який містить конфіденційну інформацію для передачі драйверу CSI для завершення викликівControllerPublishVolume
таControllerUnpublishVolume
CSI. Це поле є необовʼязковим і може бути порожнім, якщо не потрібно жодного secretʼу. Якщо Secret містить більше одного secret, передаються всі secretʼи.nodeExpandSecretRef
: Посилання на secret, який містить конфіденційну інформацію для передачі драйверу CSI для завершення викликуNodeExpandVolume
. Це поле є необовʼязковим і може бути порожнім, якщо не потрібен жоден secret. Якщо обʼєкт містить більше одного secret, передаються всі secretʼи. Коли ви налаштовуєте конфіденційні дані secret для розширення тому, kubelet передає ці дані через викликNodeExpandVolume()
драйверу CSI. Усі підтримувані версії Kubernetes пропонують полеnodeExpandSecretRef
і мають його стандартно доступним. Випуски Kubernetes до v1.25 не включали цю підтримку.- Увімкніть функціональну можливість з назвою
CSINodeExpandSecret
для кожного kube-apiserver та для kubelet на кожному вузлі. З версії Kubernetes 1.27 цю функцію типово ввімкнено і не потрібно явно використовувати функціональну можливість. Також вам потрібно використовувати драйвер CSI, який підтримує або вимагає конфіденційні дані secret під час операцій зміни розміру зберігання, ініційованих вузлом. nodePublishSecretRef
: Посилання на обʼєкт secret, який містить конфіденційну інформацію для передачі драйверу CSI для завершення викликуNodePublishVolume
. Це поле є необовʼязковим і може бути порожнім, якщо не потрібен жоден secret. Якщо обʼєкт secret містить більше одного secret, передаються всі secretʼи.nodeStageSecretRef
: Посилання на обʼєкт secret, який містить конфіденційну інформацію для передачі драйверу CSI для завершення викликуNodeStageVolume
. Це поле є необовʼязковим і може бути порожнім, якщо не потрібен жоден secret. Якщо Secret містить більше одного secret, передаються всі secretʼи.
Підтримка CSI для блочних томів
Kubernetes v1.18 [stable]
Виробники зовнішніх драйверів CSI можуть реалізувати підтримку блочних томів безпосередньо в робочих навантаженнях Kubernetes.
Ви можете налаштувати ваш PersistentVolume/PersistentVolumeClaim із підтримкою блочний томів як зазвичай, без будь-яких конкретних змін CSI.
Ефемерні томи CSI
Kubernetes v1.25 [stable]
Ви можете безпосередньо налаштувати томи CSI в межах специфікації Pod. Такі томи є ефемерними і не зберігаються після перезапуску Podʼів. Див. Ефемерні томи для отримання додаткової інформації.
Для отримання додаткової інформації про те, як розробити драйвер CSI, див. документацію kubernetes-csi
Проксі CSI для Windows
Kubernetes v1.22 [stable]
Драйвери вузла CSI повинні виконувати різні привілейовані операції, такі як сканування пристроїв диска та монтування файлових систем. Ці операції відрізняються для кожної операційної системи хоста. Для робочих вузлів Linux, контейнеризовані вузли CSI зазвичай розгортуто як привілейовані контейнери. Для робочих вузлів Windows, підтримка привілеїрованих операцій для контейнеризованих вузлів CSI підтримується за допомогою csi-proxy, бінарного файлц, що розробляється спільнотою, який повинен бути встановлений на кожному вузлі Windows.
Докладніше див. в посібнику з розгортання втулку CSI, який ви хочете розгортати.
Міграція на драйвери CSI з вбудованих втулків
Kubernetes v1.25 [stable]
Функція CSIMigration
направляє операції щодо існуючих вбудованих втулків до відповідних втулків CSI (які очікується, що вони будуть встановлені та налаштовані). Внаслідок цього операторам не потрібно робити жодних змін конфігурації існуючих класів сховища, стійких томів або заявок на стійкі томи (які посилаються на вбудовані втулки) при переході до драйвера CSI, який заміщає вбудований ввтулок.
Примітка:
Існуючі постійні томи (PV), створені вбудованим втулком томів, можна продовжувати використовувати у майбутньому без будь-яких змін конфігурації, навіть після завершення міграції до драйвера CSI для цього типу тома і навіть після оновлення до версії Kubernetes, у якій вже немає вбудованої підтримки для цього типу сховища.
Для здійснення цієї міграції вам або іншому адміністратору кластера необхідно встановити та налаштувати відповідний драйвер CSI для цього типу сховища. Основна частина Kubernetes не встановлює це програмне забезпечення за вас.
Після завершення цієї міграції ви також можете визначати нові заявки на стійкі томи (PVC) та постійні томи (PV), які посилаються на старі, вбудовані інтеграції сховищ. Забезпечивши встановлення та налаштування відповідного драйвера CSI, створення постійних томів продовжує працювати, навіть для зовсім нових томів. Фактичне управління сховищем тепер відбувається через драйвер CSI.
Підтримувані операції та функції включають: створення/видалення, приєднання/відʼєднання, монтування/розмонтовування та зміна розміру томів.
Вбудовані втулки, які підтримують CSIMigration
і мають відповідний реалізований драйвер CSI перераховуються в Типи томів.
Підтримуються також вбудовані втулки, які підтримують постійне сховище на вузлах Windows:
flexVolume (застаріло)
Kubernetes v1.23 [deprecated]
FlexVolume — це інтерфейс зовнішнього втулка, який використовує модель на основі викликів exec для взаємодії із засобами сховища. Виконувані файли драйверів FlexVolume повинні бути встановлені в попередньо визначений шлях для втулків томів на кожному вузлі і, в деяких випадках, на вузлах панелі упраіління.
Podʼи взаємодіють із драйверами FlexVolume через вбудований втулок тому flexVolume
. Докладні відомості див. у документі FlexVolume README.
Наступні втулки FlexVolume, розгорнуті як сценарії PowerShell на хості, підтримують вузли Windows:
Примітка:
FlexVolume застарів. Рекомендований спосіб інтеграції зовнішнього сховища з Kubernetes — використовувати сторонній драйвер CSI.
Розробники драйвера FlexVolume повинні реалізувати драйвер CSI та допомагати переходити користувачам драйверів FlexVolume на CSI. Користувачі FlexVolume повинні переміщати свої робочі навантаження на еквівалентний драйвер CSI.
Поширення монтування
Увага:
Поширення монтування є низькорівневою функцією, яка не працює послідовно на всіх типах томів. Рекомендується використовувати її тільки з томами типуhostPath
або з томами emptyDir
, що розміщені в памʼяті. Більше деталей можна знайти в цьому обговоренні.Поширення монтування дозволяє обʼєднувати томи, змонтовані контейнером, іншим контейнерам у тому ж Podʼі або навіть іншим Podʼам на тому самому вузлі.
Поширення монтування тому керується полем mountPropagation
в containers[*].volumeMounts
. Його значення такі:
None
— Це монтування тома не отримає жодних подальших монтувань, які монтуються на цей том або будь-які його підкаталоги хостом. Також ніякі монтування, створені контейнером, не будуть видимими на хості. Це стандартний режим.Цей режим еквівалентний поширенню монтування
rprivate
, як описано вmount(8)
Однак CRI runtime може вибрати поширення монтування
rslave
(тобто,HostToContainer
), коли поширенняrprivate
не може бути використано. Відомо, що cri-dockerd (Docker) обирає поширення монтуванняrslave
, коли джерело монтування містить кореневий каталог демона Docker (/var/lib/docker
).HostToContainer
— Це монтування тома отримає всі подальші монтування, які монтуються на цей том або будь-які його підкаталоги.Іншими словами, якщо хост монтує будь-що всередині тома, контейнер побачить, що щось змонтовано там.
Також, якщо будь-який Pod із поширенням монтування
Bidirectional
на той же том монтує будь-що там, контейнер із монтуваннямHostToContainer
буде це бачити.Цей режим еквівалентний поширенню монтування
rslave
, як описано вmount(8)
Bidirectional
— Це монтування тома веде себе так само, як монтуванняHostToContainer
. Крім того, всі монтування тома, створені контейнером, будуть поширені назад на хост і на всі контейнери всіх Podʼів, які використовують той самий том.Типовим використанням для цього режиму є Pod із драйвером FlexVolume або CSI або Pod, який повинен щось змонтувати на хості за допомогою тома типу
hostPath
.Цей режим еквівалентний поширенню монтування
rshared
, як описано вmount(8)
Попередження:
Поширення монтуванняBidirectional
може бути небезпечним. Воно може пошкодити операційну систему хоста і тому дозволяється тільки в привілейованих контейнерах. Рекомендується ретельне знайомство з поведінкою ядра Linux. Крім того, всі монтування томів, створені контейнерами в Podʼах, повинні бути знищені (розмонтовані) контейнерами під час їх завершення.
Монтування тільки для читання
Монтування може бути зроблено тільки для читання, втсановленням у поле .spec.containers[].volumeMounts[].readOnly
значення true
. Це не робить том сам по собі тільки для читання, але конкретний контейнер не зможе записувати в нього. Інші контейнери в Podʼі можуть монтувати той самий том з правами читання-запису.
У Linux, монтування тільки для читання стандартно не є рекурсивними. Наприклад, розгляньте Pod, який монтує /mnt
хостів як том hostPath
. Якщо існує інша файлова система, яка монтується для читання-запису на /mnt/<SUBMOUNT>
(така як tmpfs, NFS або USB-сховище), то том, змонтований у контейнерах, також буде мати запис для /mnt/<SUBMOUNT>
, навіть якщо монтування само було вказано як тільки для читання.
Рекурсивне монтування тільки для читання
Kubernetes v1.31 [beta]
(стандартно увімкнено: true)Рекурсивне монтування тільки для читання може бути увімкнено встановленням функціональної можливості RecursiveReadOnlyMounts
для kubelet та kube-apiserver, і встановленням поля .spec.containers[].volumeMounts[].recursiveReadOnly
для Podʼа.
Допустимі значення:
Disabled
(стандартно): без ефекту.Enabled
: робить монтування рекурсивно тільки для читання. Потрібно задовольняти всі наступні вимоги:readOnly
встановлено наtrue
mountPropagation
не встановлено або встановлено наNone
- Хост працює з ядром Linux v5.12 або пізніше
- Середовище виконання контейнерів рівня CRI підтримує рекурсивне монтування тільки для читання
- Середовище виконання контейнерів рівня OCI підтримує рекурсивне монтування тільки для читання. Це не спрацює якщо хоча б одна з цих умов не виконується.
IfPossible
: намагається застосуватиEnabled
і повертається доDisabled
, якщо функція не підтримується ядром або класом середовища виконання.
Приклад:
apiVersion: v1
kind: Pod
metadata:
name: rro
spec:
volumes:
- name: mnt
hostPath:
# tmpfs змонтовано у /mnt/tmpfs
path: /mnt
containers:
- name: busybox
image: busybox
args: ["sleep", "infinity"]
volumeMounts:
# /mnt-rro/tmpfs не має права на запис
- name: mnt
mountPath: /mnt-rro
readOnly: true
mountPropagation: None
recursiveReadOnly: Enabled
# /mnt-ro/tmpfs має право на запис
- name: mnt
mountPath: /mnt-ro
readOnly: true
# /mnt-rw/tmpfs має право на запис
- name: mnt
mountPath: /mnt-rw
Коли ця властивість розпізнається kubelet та kube-apiserver, поле .status.containerStatuses[].volumeMounts[].recursiveReadOnly
буде встановлено на Enabled
або Disabled
.
Реалізації
Відомо, що наступні середовища виконання контейнерів підтримують рекурсивне монтування тільки для читання.
Рівень CRI:
- containerd, починаючи з v2.0
- CRI-O, починаючи з v1.30
Рівень OCI:
Що далі
Ознайомтесь з прикладом розгортання WordPress та MySQL з Persistent Volume.
2 - Постійні томи
Цей документ описує постійні томи (persistent volumes) в Kubernetes. Рекомендується вже мати уявлення про томи, StorageClasses та VolumeAttributesClasses.
Вступ
Управління зберіганням — це задача, що є відокремленою від управління обчислювальними ресурсами. Підсистема PersistentVolume надає API для користувачів та адміністраторів, яке абстрагує деталі того, як забезпечується зберігання від того, як воно використовується. Для цього ми вводимо два нових ресурси API: PersistentVolume та PersistentVolumeClaim.
PersistentVolume (PV) — це частина системи зберігання в кластері, яка була надана адміністратором або динамічно надана за допомогою Storage Classes. Це ресурс в кластері, так само як вузол — це ресурс кластера. PV — це втулки томів, так само як Volumes, але вони мають життєвий цикл, незалежний від будь-якого окремого Podʼа, який використовує PV. Цей обʼєкт API охоплює деталі реалізації зберігання, такі як NFS, iSCSI або система зберігання, специфічна для постачальника хмарних послуг.
PersistentVolumeClaim (PVC) — це запит на зберігання від користувача. Він схожий на Pod. Podʼи використовують ресурси вузла, а PVC використовують ресурси PV. Podʼи можуть запитувати конкретні рівні ресурсів (CPU та памʼять). Claims можуть запитувати конкретний розмір та режими доступу (наприклад, їх можна монтувати в режимі ReadWriteOnce, ReadOnlyMany, ReadWriteMany або ReadWriteOncePod, див. AccessModes).
Хоча PersistentVolumeClaims дозволяють користувачам споживати абстрактні ресурси зберігання, часто користувачам потрібні PersistentVolumes з різними властивостями, такими як продуктивність для різних завдань. Адміністратори кластера повинні мати можливість надавати різноманітні PersistentVolumes, які відрізняються не тільки розміром і режимами доступу, але й іншими характеристиками, не розголошуючи користувачам деталей того, як реалізовані ці томи. Для цих потреб існує ресурс StorageClass.
Дивіться докладний огляд із робочими прикладами.
Життєвий цикл тому та запиту
PV (PersistentVolume) — це ресурс в кластері. PVC (PersistentVolumeClaim) — це запити на ці ресурси та також діють як перевірки запитів ресурсів. Взаємодія між PV та PVC слідує такому життєвому циклу:
Виділення
Існує два способи надання PV: статичне чи динамічне.
Статичне
Адміністратор кластера створює кілька PV. Вони містять деталі реального зберігання, яке доступне для використання користувачами кластера. Вони існують в API Kubernetes і доступні для споживання.
Динамічне
Коли жоден зі статичних PV, які створив адміністратор, не відповідає PersistentVolumeClaim користувача, кластер може спробувати динамічно надати том спеціально для PVC. Це надання ґрунтується на StorageClasses: PVC повинен запитати клас зберігання, а адміністратор повинен створити та налаштувати цей клас для динамічного надання. Заявки, які запитують клас ""
, ефективно вимикають динамічне надання для себе.
Для активації динамічного надання сховища на основі класу зберігання адміністратор кластера повинен увімкнути контролер допуску DefaultStorageClass
на API-сервері. Це можна зробити, наприклад, забезпечивши, що DefaultStorageClass
знаходиться серед значень, розділених комами, у впорядкованому списку для прапорця --enable-admission-plugins
компонента API-сервера. Для отримання додаткової інформації щодо прапорців командного рядка API-сервера перевірте документацію kube-apiserver.
Звʼязування
Користувач створює, або, у разі динамічного надання, вже створив, PersistentVolumeClaim із конкретним обсягом запитаного сховища та з певними режимами доступу. Цикл керування в панелі управління бачить нові PVC, знаходить відповідний PV (якщо це можливо), і звʼязує їх один з одним. Якщо PV був динамічно наданий для нового PVC, цикл завжди буде привʼязувати цей PV до PVC. В іншому випадку користувач завжди отримає принаймні те, про що вони просили, але том може бути більшим, ніж те, що було запитано. Як тільки звʼязування виконане, привʼязки PersistentVolumeClaim є ексклюзивними, незалежно від того, як вони були звʼязані. Привʼязка PVC до PV — це відображення один до одного, використовуючи ClaimRef, яке є двонапрямним звʼязуванням між PersistentVolume і PersistentVolumeClaim.
Заявки залишатимуться непривʼязаними нескінченно довго, якщо відповідного тому не існує. Заявки будуть привʼязані, в міру того як стають доступні відповідні томи. Наприклад, кластер, який має багато PV розміром 50Gi, не буде відповідати PVC розміром 100Gi. PVC може бути привʼязаний, коли до кластера додається PV розміром 100Gi.
Використання
Podʼи використовують заявки як томи. Кластер перевіряє заявку, щоб знайти привʼязаний том і монтує цей том для Podʼа. Для томів, які підтримують кілька режимів доступу, користувач вказує бажаний режим при використанні своєї заявки як тому в Podʼі.
Якщо у користувача є заявка, і ця заявка привʼязана, привʼязаний PV належить користувачеві стільки, скільки він йому потрібний. Користувачі планують Podʼи та отримують доступ до своїх заявлених PV, включивши розділ persistentVolumeClaim
в блок volumes
Podʼа. Див. Заявки як томи для отримання докладнішої інформації щодо цього.
Захист обʼєкта зберігання, що використовується
Мета функції захисту обʼєктів зберігання — це забезпечити, що PersistentVolumeClaims (PVC), які активно використовуються Podʼом, та PersistentVolume (PV), які привʼязані до PVC, не видаляються з системи, оскільки це може призвести до втрати даних.
Примітка:
PVC активно використовується Podʼом, коли існує обʼєкт Pod, який використовує PVC.Якщо користувач видаляє PVC, що активно використовується Podʼом, PVC не видаляється негайно. Видалення PVC відкладається до тих пір, поки PVC більше активно не використовується жодними Podʼами. Також, якщо адміністратор видаляє PV, який привʼязаний до PVC, PV не видаляється негайно. Видалення PV відкладається до тих пір, поки PV більше не є привʼязаним до PVC.
Ви можете перевірити, що PVC захищено, коли статус PVC — «Terminating», а список Finalizers
включає kubernetes.io/pvc-protection
:
kubectl describe pvc hostpath
Name: hostpath
Namespace: default
StorageClass: example-hostpath
Status: Terminating
Volume:
Labels: <none>
Annotations: volume.beta.kubernetes.io/storage-class=example-hostpath
volume.beta.kubernetes.io/storage-provisioner=example.com/hostpath
Finalizers: [kubernetes.io/pvc-protection]
...
Ви можете перевірити, що PV захищено, коли статус PV — «Terminating», а список Finalizers
також включає kubernetes.io/pv-protection
:
kubectl describe pv task-pv-volume
Name: task-pv-volume
Labels: type=local
Annotations: <none>
Finalizers: [kubernetes.io/pv-protection]
StorageClass: standard
Status: Terminating
Claim:
Reclaim Policy: Delete
Access Modes: RWO
Capacity: 1Gi
Message:
Source:
Type: HostPath (bare host directory volume)
Path: /tmp/data
HostPathType:
Events: <none>
Повторне використання
Коли користувач закінчує використання свого тому, він може видалити обʼєкти PVC з API, що дозволяє відновлення ресурсу. Політика відновлення для PersistentVolume повідомляє кластеру, що робити з томом після звільнення заявки на нього. Наразі томи можуть бути Retained, Recycled, або Deleted
Retain
Політика повторного використання Retain
дозволяє ручне повторне використання ресурсу. Коли видаляється PersistentVolumeClaim, PersistentVolume все ще існує, і том вважається "звільненим". Але він ще не доступний для іншої заявки через те, що дані попередньої заявки залишаються на томі. Адміністратор може вручну відновити том виконавши наступні кроки.
- Видаліть PersistentVolume. Повʼязаний актив в зовнішній інфраструктурі все ще існує після видалення PV.
- Вручну очистіть дані на повʼязаному активі відповідно.
- Вручну видаліть повʼязаний актив.
Якщо ви хочете використовувати той самий актив, створіть новий PersistentVolume з тим же описом активу.
Delete
Для втулків томів, які підтримують політику відновлення Delete
, видалення видаляє як обʼєкт PersistentVolume з Kubernetes, так і повʼязаний актив зовнішньої інфраструктури. Томи, які були динамічно виділені, успадковують політику пвоторного використання їх StorageClass, яка типово встановлена в Delete
. Адміністратор повинен налаштувати StorageClass відповідно до очікувань користувачів; в іншому випадку PV повинен бути відредагований або виправлений після створення. Див.
Змінення політики повторного використання PersistentVolume.
Recycle
Попередження:
Політика повторного використанняRecycle
є застарілою. Замість цього рекомендований підхід — використовувати динамічне виділення.Якщо підтримується відповідний втулок томів, політика повторного використання Recycle
виконує базове очищення (rm -rf /thevolume/*
) тому та знову робить його доступним для нової заявки.
Однак адміністратор може налаштувати власний шаблон Podʼа для повторного використання тому за допомогою аргументів командного рядка контролера Kubernetes, як описано в довідці. Власний шаблон Podʼа повторного використання тому повинен містити специфікацію volumes
, як показано у прикладі нижче:
apiVersion: v1
kind: Pod
metadata:
name: pv-recycler
namespace: default
spec:
restartPolicy: Never
volumes:
- name: vol
hostPath:
path: /any/path/it/will/be/replaced
containers:
- name: pv-recycler
image: "registry.k8s.io/busybox"
command: ["/bin/sh", "-c", "test -e /scrub && rm -rf /scrub/..?* /scrub/.[!.]* /scrub/* && test -z \"$(ls -A /scrub)\" || exit 1"]
volumeMounts:
- name: vol
mountPath: /scrub
Проте конкретний шлях, вказаний у власному шаблоні Podʼа для повторного використання тому, в частині volumes
, замінюється конкретним шляхом тому, який використовується.
Завершувач захисту від видалення PersistentVolume
Kubernetes v1.31 [beta]
(стандартно увімкнено: true)До PersistentVolume можна додавати завершувачі, щоб забезпечити, що PersistentVolume з політикою відновлення Delete
буде видалено лише після видалення сховища, яке він забезпечував.
Завершувач external-provisioner.volume.kubernetes.io/finalizer
(введений у v1.31) додається як до динамічно, так і до статично виділених томів CSI.
Завершувач kubernetes.io/pv-controller
(введений у v1.31) додається до динамічно виділених томів внутрішнього втулка і пропускається для статично виділених томів внутрішнього втулка.
Ось приклад динамічно виділеного тому внутрішнього втулка:
kubectl describe pv pvc-74a498d6-3929-47e8-8c02-078c1ece4d78
Name: pvc-74a498d6-3929-47e8-8c02-078c1ece4d78
Labels: <none>
Annotations: kubernetes.io/createdby: vsphere-volume-dynamic-provisioner
pv.kubernetes.io/bound-by-controller: yes
pv.kubernetes.io/provisioned-by: kubernetes.io/vsphere-volume
Finalizers: [kubernetes.io/pv-protection kubernetes.io/pv-controller]
StorageClass: vcp-sc
Status: Bound
Claim: default/vcp-pvc-1
Reclaim Policy: Delete
Access Modes: RWO
VolumeMode: Filesystem
Capacity: 1Gi
Node Affinity: <none>
Message:
Source:
Type: vSphereVolume (a Persistent Disk resource in vSphere)
VolumePath: [vsanDatastore] d49c4a62-166f-ce12-c464-020077ba5d46/kubernetes-dynamic-pvc-74a498d6-3929-47e8-8c02-078c1ece4d78.vmdk
FSType: ext4
StoragePolicyName: vSAN Default Storage Policy
Events: <none>
Завершувач external-provisioner.volume.kubernetes.io/finalizer
додається для томів CSI. Наприклад:
Name: pvc-2f0bab97-85a8-4552-8044-eb8be45cf48d
Labels: <none>
Annotations: pv.kubernetes.io/provisioned-by: csi.vsphere.vmware.com
Finalizers: [kubernetes.io/pv-protection external-provisioner.volume.kubernetes.io/finalizer]
StorageClass: fast
Status: Bound
Claim: demo-app/nginx-logs
Reclaim Policy: Delete
Access Modes: RWO
VolumeMode: Filesystem
Capacity: 200Mi
Node Affinity: <none>
Message:
Source:
Type: CSI (a Container Storage Interface (CSI) volume source)
Driver: csi.vsphere.vmware.com
FSType: ext4
VolumeHandle: 44830fa8-79b4-406b-8b58-621ba25353fd
ReadOnly: false
VolumeAttributes: storage.kubernetes.io/csiProvisionerIdentity=1648442357185-8081-csi.vsphere.vmware.com
type=vSphere CNS Block Volume
Events: <none>
Коли прапорець функції CSIMigration{provider}
увімкнено для конкретного внутрішнього втулка, завершувач kubernetes.io/pv-controller
замінюється завершувачем external-provisioner.volume.kubernetes.io/finalizer
.
Завершувачі забезпечують, що обʼєкт PV видаляється лише після того, як том буде видалений з бекенду зберігання, якщо політика відновлення PV є Delete
. Це також гарантує, що том буде видалений з бекенду зберігання незалежно від порядку видалення PV і PVC.
Резервування PersistentVolume
Панель управління може привʼязувати PersistentVolumeClaims до PersistentVolume в кластері. Однак, якщо вам потрібно, щоб PVC привʼязувався до певного PV, вам слід заздалегідь їх привʼязувати.
Вказавши PersistentVolume в PersistentVolumeClaim, ви оголошуєте привʼязку між цим конкретним PV та PVC. Якщо PersistentVolume існує і не зарезервував PersistentVolumeClaim через своє поле claimRef
, тоді PersistentVolume і PersistentVolumeClaim будуть привʼязані.
Привʼязка відбувається попри деякі критерії відповідності, включаючи спорідненість вузла. Панель управління все ще перевіряє, що клас сховища, режими доступу та розмір запитаного сховища є дійсними.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: foo-pvc
namespace: foo
spec:
storageClassName: "" # Порожній рядок повинен бути явно встановлений, інакше буде встановлено типовий StorageClass
volumeName: foo-pv
...
Цей метод не гарантує жодних привʼязок для PersistentVolume. Якщо інші PersistentVolumeClaims можуть використовувати PV, який ви вказуєте, вам слід заздалегідь резервувати цей обсяг сховища. Вкажіть відповідний PersistentVolumeClaim у поле claimRef
PV, щоб інші PVC не могли привʼязатися до нього.
apiVersion: v1
kind: PersistentVolume
metadata:
name: foo-pv
spec:
storageClassName: ""
claimRef:
name: foo-pvc
namespace: foo
...
Це корисно, якщо ви хочете використовувати PersistentVolumes з політикою повторного використання Retain
, включаючи випадки, коли ви повторно використовуєте наявний PV.
Розширення Persistent Volume Claims
Kubernetes v1.24 [stable]
Підтримка розширення PersistentVolumeClaims (PVCs) є типово увімкненою. Ви можете розширити наступні типи томів:
- azureFile (застарілий)
- csi
- flexVolume (застарілий)
- rbd (застарілий)
- portworxVolume (застарілий)
Ви можете розширити PVC лише в тому випадку, якщо поле allowVolumeExpansion
його класу сховища має значення true.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: example-vol-default
provisioner: vendor-name.example/magicstorage
parameters:
resturl: "http://192.168.10.100:8080"
restuser: ""
secretNamespace: ""
secretName: ""
allowVolumeExpansion: true
Для запиту більшого тому для PVC відредагуйте обʼєкт PVC та вказуйте більший розмір. Це спричинює розширення тому, який стоїть за основним PersistentVolume. Новий PersistentVolume ніколи не створюється для задоволення вимоги. Замість цього, змінюється розмір поточного тому.
Попередження:
Пряме редагування розміру PersistentVolume може запобігти автоматичному зміненню розміру цього тому. Якщо ви редагуєте обсяг PersistentVolume, а потім редагуєте.spec
відповідного PersistentVolumeClaim, щоб розмір PersistentVolumeClaim відповідав PersistentVolume, то зміна розміру сховища не відбудеться. Панель управління Kubernetes побачить, що бажаний стан обох ресурсів збігається, і робить висновок, що розмір обʼєкта був збільшений вручну і розширення не потрібне.Розширення томів CSI
Kubernetes v1.24 [stable]
Підтримка розширення томів CSI типово увімкнена, але вона також вимагає, щоб конкретний драйвер CSI підтримував розширення тому. Зверніться до документації відповідного драйвера CSI для отримання додаткової інформації.
Зміна розміру тому, що містить файлову систему
Ви можете змінювати розмір томів, що містять файлову систему, тільки якщо файлова система є XFS, Ext3 або Ext4.
Коли том містить файлову систему, розмір файлової системи змінюється тільки тоді, коли новий Pod використовує PersistentVolumeClaim у режимі ReadWrite
. Розширення файлової системи виконується при запуску нового Pod або коли Pod працює, і базова файлова система підтримує онлайн-розширення.
FlexVolumes (застарілий починаючи з Kubernetes v1.23) дозволяє змінювати розмір, якщо драйвер налаштований із можливістю RequiresFSResize
встановленою в true
. FlexVolume може бути змінений при перезапуску Pod.
Зміна розміру використовуваного PersistentVolumeClaim
Kubernetes v1.24 [stable]
В цьому випадку вам не потрібно видаляти та перестворювати Pod або Deployment, який використовує наявний PVC. Будь-який PVC, який знаходиться у використанні, автоматично стає доступним для свого Pod, як тільки його файлова система буде розширена. Ця функція не впливає на PVC, які не використовуються Pod або Deployment. Ви повинні створити Pod, який використовує PVC, перш ніж розширення може завершитися.
Аналогічно іншим типам томів — томи FlexVolume також можуть бути розширені в разі використання Podʼом.
Примітка:
Змінювати розмір FlexVolume можливо лише тоді, коли зміна розміру підтримується драйвером.Відновлення після невдалих спроб розширення томів
Якщо користувач вказав новий розмір, який надто великий для задоволення базовою системою зберігання, розширення PVC буде намагатися робити спроби його задовольнити, доки користувач або адміністратор кластера не вживе будь-яких заходів. Це може бути небажаним, і, отже, Kubernetes надає наступні методи відновлення після таких невдач.
Якщо розширення базового сховища не вдається, адміністратор кластера може вручну відновити стан Persistent Volume Claim (PVC) та скасувати запити на зміну розміру. Інакше запити на зміну розміру буде продовжено автоматично контролером без втручання адміністратора.
- Позначте Persistent Volume (PV), який привʼязаний до Persistent Volume Claim (PVC), політикою вилучення
Retain
. - Видаліть PVC. Оскільки PV має політику вилучення
Retain
, ми не втратимо жодних даних під час повторного створення PVC. - Видаліть запис
claimRef
з характеристик PV, щоб новий PVC міг привʼязатися до нього. Це повинно зробити PVAvailable
. - Створіть заново PVC з меншим розміром, ніж у PV, і встановіть в поле
volumeName
PVC імʼя PV. Це повинно привʼязати новий PVC до наявного PV. - Не забудьте відновити політику вилучення PV.
Kubernetes v1.23 [alpha]
Примітка:
Можливість відновлення після невдачі розширення PVC користувачами доступна як альфа-функція з Kubernetes 1.23. ФункціюRecoverVolumeExpansionFailure
слід увімкнути для коректної роботи цієї функції. Докладніше дивіться в документації feature gate.Якщо в вашому кластері увімкнено feature gate RecoverVolumeExpansionFailure
, і розширення не вдалося для PVC, ви можете повторити спробу розширення з меншим розміром, ніж раніше запитаний. Щоб запросити нову спробу розширення з новим запропонованим розміром, відредагуйте .spec.resources
для цього PVC і виберіть значення, яке менше за попереднє значення. Це корисно, якщо розширення до більшого значення не вдалося через обмеження місткості. Якщо це трапилося або ви підозрюєте, що це може трапитися, ви можете повторити спробу розширення, вказавши розмір, який знаходиться в межах обмежень місткості базового постачальника сховища. Ви можете слідкувати за станом операції зміни розміру, спостерігаючи за .status.allocatedResourceStatuses
та подіями на PVC.
Зверніть увагу, що, навіть якщо ви можете вказати менше обсягу зберігання, ніж запитано раніше, нове значення все ще повинно бути вищим за .status.capacity
. Kubernetes не підтримує зменшення PVC до меншого розміру, ніж його поточний розмір.
Типи Persistent Volume
Типи PersistentVolume реалізовані у вигляді втулків. Kubernetes наразі підтримує наступні втулки:
csi
— Інтерфейс зберігання контейнерів (Container Storage Interface, CSI)fc
— Сховище Fibre Channel (FC)hostPath
— Том HostPath (для тестування на одному вузлі лише; НЕ ПРАЦЮВАТИМЕ в кластері з декількома вузлами; розгляньте використання томуlocal
замість цього)iscsi
— Сховище iSCSI (SCSI через IP)local
— Локальні пристрої зберігання, підключені до вузлів.nfs
— Сховище в мережевій файловій системі (NFS)
Наступні типи PersistentVolume застарілі, але все ще доступні. Якщо ви використовуєте ці типи томів, окрім flexVolume
, cephfs
та rbd
, будь ласка, встановіть відповідні драйвери CSI.
awsElasticBlockStore
— AWS Elastic Block Store (EBS) (міграція типово увімкнена починаючи з v1.23)azureDisk
— Azure Disk (міграція типово увімкнена починаючи з v1.23)azureFile
— Azure File (міграція типово увімкнена починаючи з v1.24)cinder
— Cinder (блочне сховище OpenStack) (міграція типово увімкнена починаючи з v1.21)flexVolume
— FlexVolume (застаріло починаючи з версії v1.23, план міграції відсутній, планів припинення підтримки немає)gcePersistentDisk
— GCE Persistent Disk (застаріло починаючи з v1.23, план міграції відсутній, планів припинення підтримки немає)portworxVolume
— Том Portworx (міграція типово увімкнена починаючи з v1.31)vsphereVolume
- vSphere VMDK volume (міграція типово увімкнена починаючи з v1.25)
Старші версії Kubernetes також підтримували наступні типи вбудованих PersistentVolume:
cephfs
(недоступно починаючи з версії v1.31)flocker
— Flocker storage. (недоступно починаючи з версії v1.25)photonPersistentDisk
— Photon controller persistent disk. (недоступно починаючи з версії v1.15)quobyte
— Том Quobyte. (недоступно починаючи з версії v1.25)rbd
— Rados Block Device (RBD) volume (недоступно починаючи з версії v1.31)scaleIO
— Том ScaleIO. (недоступно починаючи з версії v1.21)storageos
— Том StorageOS. (недоступно починаючи з версії v1.25)
Persistent Volumes
Кожен PersistentVolume (PV) містить специфікацію та статус, які являють собою характеристики та стан тому. Імʼя обʼєкта PersistentVolume повинно бути дійсним DNS імʼям субдомену.
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: /tmp
server: 172.17.0.2
Примітка:
Можливо, для використання PersistentVolume у кластері будуть потрібні допоміжні програми. У цьому прикладі PersistentVolume має тип NFS, і для підтримки монтування файлових систем NFS необхідна допоміжна програма /sbin/mount.nfs.Обсяг
Зазвичай у PV є конкретний обсяг зберігання. Він встановлюється за допомогою атрибута capacity
PV, який є значенням кількості обсягу.
Наразі розмір — це єдиний ресурс, який можна встановити або вимагати. Майбутні атрибути можуть включати IOPS, пропускну здатність тощо.
Режим тому
Kubernetes v1.18 [stable]
Kubernetes підтримує два режими volumeModes
для PersistentVolumes: Filesystem
та Block
.
volumeMode
є необовʼязковим параметром API. Filesystem
є типовим режимом, який використовується, коли параметр volumeMode
пропущено.
Том з volumeMode: Filesystem
монтується в Podʼах в каталог. Якщо том підтримується блоковим пристроєм, і пристрій порожній, Kubernetes створює файлову систему на пристрої перед його першим монтуванням.
Ви можете встановити значення volumeMode
в Block
, щоб використовувати том як блоковий пристрій. Такий том представляється в Podʼі як блоковий пристрій, без будь-якої файлової системи на ньому. Цей режим корисний, щоб надати Podʼу найшвидший можливий спосіб доступу до тому, без будь-якого рівня файлової системи між Podʼом і томом. З іншого боку, застосунок, який працює в Podʼі, повинен знати, як взаємодіяти з блоковим пристроєм. Дивіться Підтримка блокового тому для прикладу використання тому з volumeMode: Block
в Podʼі.
Режими доступу
PersistentVolume може бути підключений до вузла будь-яким способом, який підтримує постачальник ресурсів. Як показано в таблиці нижче, постачальники матимуть різні можливості, і кожному PV присвоюється набір режимів доступу, які описують можливості саме цього PV.
Режими доступу такі:
ReadWriteOnce
- том може бути підключений як для читання-запису одним вузлом. Режим доступу ReadWriteOnce все ще може дозволяти доступ до тому для кількох Podʼів, коли Podʼи працюють на тому самому вузлі. Для доступу одного Podʼа, див. ReadWriteOncePod.
ReadOnlyMany
- том може бути підключений як для читання лише багатьма вузлами.
ReadWriteMany
- том може бути підключений як для читання-запису багатьма вузлами.
ReadWriteOncePod
- СТАН ФУНКЦІОНАЛУ:том може бути підключений як для читання-запису одним Podʼом. Використовуйте режим доступу ReadWriteOncePod, якщо ви хочете забезпечити, що тільки один Pod по всьому кластеру може читати цей PVC або писати в нього.
Kubernetes v1.29 [stable]
Примітка:
Режим доступу ReadWriteOncePod
підтримується лише для CSI томів та Kubernetes версії 1.22+. Щоб використовувати цю функцію, вам потрібно оновити наступні CSI sidecars до цих версій або новіших:
У командному рядку режими доступу скорочено так:
- RWO — ReadWriteOnce
- ROX — ReadOnlyMany
- RWX — ReadWriteMany
- RWOP — ReadWriteOncePod
Примітка:
Kubernetes використовує режими доступу до тому для відповідності PersistentVolumeClaims та PersistentVolumes. У деяких випадках режими доступу до тому також обмежують місця, де може бути підключений PersistentVolume. Режими доступу до тому не накладають захист від запису після підключення сховища. Навіть якщо режими доступу вказані як ReadWriteOnce, ReadOnlyMany або ReadWriteMany, вони не встановлюють жодних обмежень на том. Наприклад, навіть якщо PersistentVolume створено як ReadOnlyMany, це не гарантує, що він буде доступний лише для читання. Якщо режими доступу вказані як ReadWriteOncePod, том обмежений і може бути підключений лише до одного пода.Важливо! Том може бути підключений лише одним режимом доступу одночасно, навіть якщо він підтримує багато.
Тип тому | ReadWriteOnce | ReadOnlyMany | ReadWriteMany | ReadWriteOncePod |
---|---|---|---|---|
AzureFile | ✓ | ✓ | ✓ | - |
CephFS | ✓ | ✓ | ✓ | - |
CSI | залежить від драйвера | залежить від драйвера | залежить від драйвера | залежить від драйвера |
FC | ✓ | ✓ | - | - |
FlexVolume | ✓ | ✓ | залежить від драйвера | - |
HostPath | ✓ | - | - | - |
iSCSI | ✓ | ✓ | - | - |
NFS | ✓ | ✓ | ✓ | - |
RBD | ✓ | ✓ | - | - |
VsphereVolume | ✓ | - | - (працює, коли Podʼи розташовані разом) | - |
PortworxVolume | ✓ | - | ✓ | - |
Class
PV може мати клас, який вказується, встановленням атрибуту storageClassName
на імʼя StorageClass. PV певного класу може бути призначений лише до PVC, що запитує цей клас. PV без storageClassName
не має класу і може бути призначений тільки до PVC, які не запитують жодного конкретного класу.
У минулому для цього використовувався атрибут volume.beta.kubernetes.io/storage-class
замість storageClassName
. Ця анотація все ще працює; однак вона повністю застаріє в майбутньому релізі Kubernetes.
Політика повторного використання
Поточні політики повторного використання:
- Retain — ручне відновлення
- Recycle — базова очистка (
rm -rf /thevolume/*
) - Delete — видалити том
Для Kubernetes 1.31 підтримують повторнн використання лише типи томів nfs
та hostPath
.
Параметри монтування
Адміністратор Kubernetes може вказати додаткові параметри монтування для випадку, коли постійний том монтується на вузлі.
Примітка:
Не всі типи постійних томів підтримують параметри монтування.Наступні типи томів підтримують параметри монтування:
azureFile
cephfs
(застаріло в v1.28)cinder
(застаріло в v1.18)iscsi
nfs
rbd
(застаріло в v1.28)vsphereVolume
Параметри монтування не перевіряються на валідність. Якщо параметр монтування недійсний, монтування не вдасться.
У минулому для цього використовувалася анотація volume.beta.kubernetes.io/mount-options
замість атрибуту mountOptions
. Ця анотація все ще працює; однак вона повністю застаріє в майбутньому релізі Kubernetes.
Node Affinity
Примітка:
Для більшості типів томів вам не потрібно встановлювати це поле. Вам слід явно встановити його для локальних томів.Постійний том може вказувати властивості спорідненості вузла для визначення обмежень, які обмежують доступ до цього тому з визначених вузлів. Podʼи, які використовують PV, будуть заплановані тільки на ті вузли, які вибрані за допомогою спорідненості вузла. Щоб вказати спорідненість вузла, встановіть nodeAffinity
в .spec
PV. Деталі поля можна знайти у референсі API PersistentVolume.
Фаза
PersistentVolume може перебувати в одній з наступних фаз:
Available
- вільний ресурс, який ще не призначений запиту
Bound
- том призначено запиту
Released
- запит було видалено, але повʼязане сховища ще не вилучено кластером
Failed
- том не вдалося вилучити (автоматично)
Ви можете бачити імʼя PVC, призначеного для PV, використовуючи kubectl describe persistentvolume <імʼя>
.
Час переходу фази
Kubernetes v1.31 [stable]
(стандартно увімкнено: true)Поле .status
для PersistentVolume може включати альфа-поле lastPhaseTransitionTime
. Це поле фіксує відмітку часу, коли том востаннє перейшов у свою фазу. Для новостворених томів фаза встановлюється як Pending
, а lastPhaseTransitionTime
встановлюється на поточний час.
PersistentVolumeClaims
Кожен PVC містить специфікацію та статус, які визначають вимоги та стан заявок. Імʼя обʼєкта PersistentVolumeClaim повинно бути дійсним DNS-піддоменом.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 8Gi
storageClassName: slow
selector:
matchLabels:
release: "stable"
matchExpressions:
- {key: environment, operator: In, values: [dev]}
Режим доступу
Заявки використовують ті ж самі конвенції, що й томи, коли вони вимагають зберігання з конкретними режимами доступу.
Режим тому
Заявки використовують ту ж саму конвенцію, що і томи, щоб вказати споживання тому як файлової системи чи блокового пристрою.
Ресурси
Заявки, подібно до Podʼів, можуть вимагати конкретну кількість ресурсів. У цьому випадку запит стосується зберігання. До заявок застосовується та ж модель ресурсів, що і до томів.
Селектор
Заявки можуть вказати селектор міток, щоб додатково фільтрувати набір томів. До заявки може бути привʼязано лише ті томи, мітки яких відповідають селектору. Селектор може складатися з двох полів:
matchLabels
— том повинен містити мітку з таким значеннямmatchExpressions
— список вимог, які визначаються за допомогою ключа, списку значень та оператора, який повʼязує ключ і значення. Допустимі оператори включають In, NotIn, Exists та DoesNotExist.
Всі вимоги як з matchLabels
, так і з matchExpressions
обʼєднуються за допомогою ЛОГІЧНОГО «І» — всі вони повинні бути задоволені, щоб мати збіг.
Class
Заявка може вимагати певний клас, вказавши імʼя StorageClass за допомогою атрибута storageClassName
. Тільки Томи з запитаним класом, тобто ті, у яких storageClassName
збігається з PVC, можуть бути привʼязані до PVC.
PVC не обоʼязково повинен вимагати клас. PVC зі своїм storageClassName
, встановленим рівним ""
, завжди інтерпретується як PVC, який вимагає PV без класу, тобто він може бути привʼязаний лише до PV без класу (без анотації або з анотацією, встановленою рівною ""
). PVC без storageClassName
не зовсім те ж саме і відзначається по-іншому кластером, залежно від того, чи включений втулок доступу DefaultStorageClass
.
- Якщо втулок доступу увімкнено, адміністратор може вказати типовий StorageClass. Усі PVC, у яких немає
storageClassName
, можуть бути привʼязані лише до PV з цим типовим StorageClass. Вказання типового StorageClass виконується, встановивши анотаціюstorageclass.kubernetes.io/is-default-class
рівноюtrue
в обʼєкті StorageClass. Якщо адміністратор не вказав типовий StorageClass, кластер відповідає на створення PVC так, ніби втулок доступу був вимкнений. Якщо вказано більше одного типового StorageClass, для привʼязки PVC використовується остання версія типового StorageClass, коли PVC динамічно виділяється. - Якщо втулок доступу вимкнено, немає поняття типового StorageClass. Усі PVC, у яких
storageClassName
встановлено рівно""
, можуть бути привʼязані лише до PV, у якихstorageClassName
також встановлено рівно""
. Однак PVC з відсутнімstorageClassName
можна буде оновити пізніше, коли стане доступним типовий StorageClass. Якщо PVC оновлюється, він більше не буде привʼязуватися до PV зstorageClassName
, також встановленим рівно""
.
Дивіться ретроактивне призначення типового StorageClass для отримання докладнішої інформації.
Залежно від методу встановлення, типовий StorageClass може бути розгорнутий в кластер Kubernetes менеджером надбудов під час встановлення.
Коли PVC вказує selector
, крім вимоги типового StorageClass, вимоги використовують ЛОГІЧНЕ «І»: лише PV вказаного класу і з вказаними мітками може бути привʼязаний до PVC.
Примітка:
На даний момент PVC з непорожнімselector
не може мати PV, динамічно виділеного для нього.У минулому анотація volume.beta.kubernetes.io/storage-class
використовувалася замість атрибута storageClassName
. Ця анотація все ще працює; однак вона не буде підтримуватися в майбутньому релізі Kubernetes.
Ретроактивне призначення типового StorageClass
Kubernetes v1.28 [stable]
Ви можете створювати PersistentVolumeClaim без вказівки storageClassName
для нового PVC, і ви можете це робити навіть тоді, коли в кластері немає типового StorageClass. У цьому випадку новий PVC створюється так, як ви його визначили, і storageClassName
цього PVC залишається невизначеним, доки не стане доступним типовий StorageClass.
Коли стає доступним типовий StorageClass, панель управління ідентифікує всі наявні PVC без storageClassName
. Для PVC, у яких або встановлено порожнє значення для storageClassName
, або цей ключ взагалі відсутній, панель управління оновлює ці PVC, встановлюючи storageClassName
, щоб відповідати новому типовому StorageClass. Якщо у вас є наявний PVC, у якого storageClassName
дорівнює ""
, і ви налаштовуєте типовий StorageClass, то цей PVC не буде оновлено.
Щоб продовжувати привʼязувати до PV з storageClassName
, встановленим рівно ""
(коли присутній типовий StorageClass), вам потрібно встановити storageClassName
асоційованого PVC рівно ""
.
Це поведінка допомагає адміністраторам змінювати типовий StorageClass, видаляючи спочатку старий, а потім створюючи або встановлюючи інший. Це короткочасне вікно, коли немає типового StorageClass, призводить до того, що PVC без storageClassName
, створені в цей час, не мають жодного типового значення, але завдяки ретроактивному призначенню типового StorageClass цей спосіб зміни типових значень є безпечним.
Заявки як томи
Podʼи отримують доступ до сховища, використовуючи заявки як томи. Заявки повинні існувати в тому ж просторі імен, що і Pod, який її використовує. Кластер знаходить заявку в просторі імен Pod і використовує її для отримання PersistentVolume, який підтримує заявку. Потім том монтується на хост та у Pod.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim
Примітка щодо просторів імен
Привʼязки PersistentVolumes є ексклюзивними, і оскільки PersistentVolumeClaims є обʼєктами з простором імен, монтування заявк з режимами "Many" (ROX
, RWX
) можливе лише в межах одного простору імен.
PersistentVolumes типу hostPath
PersistentVolume типу hostPath
використовує файл або каталог на вузлі для емуляції мережевого сховища. Див. приклад тому типу hostPath
.
Підтримка блокового тому
Kubernetes v1.18 [stable]
Наступні втулки томів підтримують блокові томи, включаючи динамічне надання, де це можливо:
- CSI
- FC (Fibre Channel)
- iSCSI
- Локальний том
- OpenStack Cinder
- RBD (застаріло)
- RBD (Ceph Block Device; застаріло)
- VsphereVolume
PersistentVolume, що використовує блоковий том
apiVersion: v1
kind: PersistentVolume
metadata:
name: block-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
volumeMode: Block
persistentVolumeReclaimPolicy: Retain
fc:
targetWWNs: ["50060e801049cfd1"]
lun: 0
readOnly: false
PersistentVolumeClaim, який запитує блоковий том
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: block-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Block
resources:
requests:
storage: 10Gi
Специфікація Pod з додаванням шляху блокового пристрою в контейнер
apiVersion: v1
kind: Pod
metadata:
name: pod-with-block-volume
spec:
containers:
- name: fc-container
image: fedora:26
command: ["/bin/sh", "-c"]
args: [ "tail -f /dev/null" ]
volumeDevices:
- name: data
devicePath: /dev/xvda
volumes:
- name: data
persistentVolumeClaim:
claimName: block-pvc
Примітка:
При додаванні блокового пристрою для Pod ви вказуєте шлях до пристрою в контейнері замість шляху монтування.Привʼязка блокових томів
Якщо користувач вимагає блокового тому, вказавши це за допомогою поля volumeMode
у специфікації PersistentVolumeClaim, правила привʼязки трохи відрізняються від попередніх версій, які не враховували цей режим як частину специфікації. У таблиці наведено можливі комбінації, які користувач і адміністратор можуть вказати для запиту блокового пристрою. Таблиця показує, чи буде привʼязаний том чи ні, враховуючи ці комбінації: Матриця привʼязки томів для статично виділених томів:
PV volumeMode | PVC volumeMode | Результат |
---|---|---|
не вказано | не вказано | ПРИВ'ЯЗАНИЙ |
не вказано | Блоковий | НЕ ПРИВ'ЯЗАНИЙ |
не вказано | Файлова система | ПРИВ'ЯЗАНИЙ |
Блоковий | не вказано | НЕ ПРИВ'ЯЗАНИЙ |
Блоковий | Блоковий | ПРИВ'ЯЗАНИЙ |
Блоковий | Файлова система | НЕ ПРИВ'ЯЗАНИЙ |
Файлова система | Файлова система | ПРИВ'ЯЗАНИЙ |
Файлова система | Блоковий | НЕ ПРИВ'ЯЗАНИЙ |
Файлова система | не вказано | ПРИВ'ЯЗАНИЙ |
Примітка:
Підтримуються лише статично виділені томи для альфа-релізу. Адміністраторам слід бути обережними, враховуючи ці значення при роботі з блоковими пристроями.Підтримка знімків томів та відновлення тому зі знімка
Kubernetes v1.20 [stable]
Знімки томів підтримують лише зовнішні втулки томів CSI. Докладні відомості див. у Знімках томів. Втулки томів, які входять до складу Kubernetes, є застарілими. Про застарілі втулки томів можна прочитати в ЧаПи втулків томів.
Створення PersistentVolumeClaim із знімка тому
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: restore-pvc
spec:
storageClassName: csi-hostpath-sc
dataSource:
name: new-snapshot-test
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Клонування томів
Клонування томів доступне лише для втулків томів CSI.
Створення PersistentVolumeClaim із існуючого PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cloned-pvc
spec:
storageClassName: my-csi-plugin
dataSource:
name: existing-src-pvc-name
kind: PersistentVolumeClaim
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Наповнювачі томів та джерела даних
Kubernetes v1.24 [beta]
Kubernetes підтримує користувацькі заповнювачі томів. Для використання користувацьких заповнювачів томів слід увімкнути функціональну можливість AnyVolumeDataSource
для kube-apiserver та kube-controller-manager.
Наповнювачі томів використовують поле специфікації PVC, що називається dataSourceRef
. На відміну від поля dataSource
, яке може містити тільки посилання на інший PersistentVolumeClaim або на VolumeSnapshot, поле dataSourceRef
може містити посилання на будь-який обʼєкт у тому ж просторі імен, за винятком основних обʼєктів, окрім PVC. Для кластерів, які мають увімкнутий feature gate, використання dataSourceRef
бажано перед dataSource
.
Джерела даних зі змішаними просторами імен
Kubernetes v1.26 [alpha]
Kubernetes підтримує джерела даних томів зі змішаними просторами імен. Для використання джерел даних томів із змішаними просторами імен слід увімкнути функціональну можливість AnyVolumeDataSource
та CrossNamespaceVolumeDataSource
для kube-apiserver та kube-controller-manager. Також вам слід увімкнути CrossNamespaceVolumeDataSource
для csi-provisioner.
Увімкнення CrossNamespaceVolumeDataSource
дозволяє вам вказати простір імен у полі dataSourceRef
.
Примітка:
Коли ви вказуєте простір імен для джерела даних тому, Kubernetes перевіряє наявність ReferenceGrant у іншому просторі імен перед прийняттям посилання. ReferenceGrant є частиною розширених APIgateway.networking.k8s.io
. Докладні відомості див. в документації API Gateway за посиланням ReferenceGrant. Це означає, що вам слід розширити свій кластер Kubernetes принаймні за допомогою ReferenceGrant зі
специфікації API Gateway, перш ніж ви зможете використовувати цей механізм.Посилання на джерела даних
Поле dataSourceRef
поводиться майже так само, як і поле dataSource
. Якщо в одне задано, а інше — ні, сервер API надасть обом полям одне й те ж значення. Жодне з цих полів не можна змінити після створення, і спроба вказати різні значення для обох полів призведе до помилки перевірки правильності. Таким чином, обидва поля завжди матимуть однаковий вміст.
Є дві різниці між полем dataSourceRef
і полем dataSource
, які користувачам слід знати:
- Поле
dataSource
ігнорує неправильні значення (мовби поле було порожнім), тоді як полеdataSourceRef
ніколи не ігнорує значення і призведе до помилки, якщо використано неправильне значення. Неправильними значеннями є будь-які обʼєкти основних обʼєктів (обʼєкти без apiGroup), окрім PVC. - Поле
dataSourceRef
може містити обʼєкти різних типів, тоді як полеdataSource
дозволяє лише PVC та VolumeSnapshot.
Коли увімкнено CrossNamespaceVolumeDataSource
, є додаткові відмінності:
- Поле
dataSource
дозволяє лише локальні обʼєкти, тоді як полеdataSourceRef
дозволяє обʼєкти у будь-яких просторах імен. - Коли вказано простір імен,
dataSource
іdataSourceRef
не синхронізуються.
Користувачам завжди слід використовувати dataSourceRef
в кластерах, де увімкнено feature gate, і використовувати dataSource
в кластерах, де він вимкнений. В будь-якому випадку необхідно дивитися на обидва поля. Дубльовані значення із трошки різними семантиками існують лише з метою забезпечення сумісності з попередніми версіями. Зокрема, старі й нові контролери можуть взаємодіяти, оскільки поля однакові.
Використання засобів наповнення томів
Засоби наповнення томів — це контролери, які можуть створювати томи з не порожнім вмістом, де вміст тому визначається за допомогою Custom Resource. Користувачі створюють наповнений том, посилаючись на Custom Resource із використанням поля dataSourceRef
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: populated-pvc
spec:
dataSourceRef:
name: example-name
kind: ExampleDataSource
apiGroup: example.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Оскільки засоби наповнення томів — це зовнішні компоненти, спроби створити PVC, який використовує їх, можуть завершитися неуспішно, якщо встановлені не всі необхідні компоненти. Зовнішні контролери повинні генерувати події на PVC для надання зворотного звʼязку щодо стану створення, включаючи попередження, якщо PVC не може бути створено через відсутність деякого компонента.
Ви можете встановити альфа-контролер перевірки джерела даних тому у вашому кластері. Цей контролер генерує події попередження на PVC у випадку, якщо не зареєстровано жодного засобу наповнення для обробки цього виду джерела даних. Коли для PVC встановлюється відповідний засіб наповнення, це відповідальність цього контролера наповнення повідомляти про події, що стосуються створення тому та проблем під час цього процесу.
Використання джерела даних томів зі змішаними просторами імен
Kubernetes v1.26 [alpha]
Створіть ReferenceGrant, щоб дозволити власнику простору імен приймати посилання. Ви визначаєте наповнений том, вказавши джерело даних тому між просторами імен за допомогою поля dataSourceRef
. Вам вже повинен бути дійсний ReferenceGrant у вихідному просторі імен:
apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
name: allow-ns1-pvc
namespace: default
spec:
from:
- group: ""
kind: PersistentVolumeClaim
namespace: ns1
to:
- group: snapshot.storage.k8s.io
kind: VolumeSnapshot
name: new-snapshot-demo
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: foo-pvc
namespace: ns1
spec:
storageClassName: example
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
dataSourceRef:
apiGroup: snapshot.storage.k8s.io
kind: VolumeSnapshot
name: new-snapshot-demo
namespace: default
volumeMode: Filesystem
Написання переносимої конфігурації
Якщо ви пишете шаблони конфігурації або приклади, які повинні працювати на широкому спектрі кластерів і вам потрібне постійний сховище, рекомендується використовувати такий підхід:
- Включайте обʼєкти PersistentVolumeClaim у ваш набір конфігурації (нарізі з Deployment, ConfigMap і т. д.).
- Не включайте обєкти PersistentVolume в конфігурацію, оскільки користувач, який створює конфігурацію, може не мати прав на створення PersistentVolumes.
- Дайте користувачеві можливість надавати імʼя класу сховища при створенні шаблону.
- Якщо користувач вказує імʼя класу сховища, вставте це значення в поле
persistentVolumeClaim.storageClassName
. Це призведе до збігу PVC з відповідним класом сховища, якщо в адміністратора увімкнені класи сховища. - Якщо користувач не вказує імʼя класу сховища, залиште поле
persistentVolumeClaim.storageClassName
нульовим. Це призведе до автоматичного надання користувачеві PV в кластері. Багато середовищ кластеру мають типовий клас сховища, або адміністратори можуть створити свій типовий клас сховища.
- Якщо користувач вказує імʼя класу сховища, вставте це значення в поле
- В інструментах спостерігайте за PVC, які не привʼязуються протягом певного часу та виводьте це користувачеві, оскільки це може вказувати на те, що у кластері відсутня підтримка динамічного сховища (у цьому випадку користувач повинен створити відповідний PV) або у кластері відсутня система сховища (у цьому випадку користувач не може розгортати конфігурацію, що вимагає PVC).
Що далі
- Дізнайтеся більше про створення PersistentVolume.
- Дізнайтеся більше про створення PersistentVolumeClaim.
- Прочитайте документ з дизайну постійного сховища.
API references
Дізнайтеся більше про описані на цій сторінці API:
3 - Projected томи
У цьому документі описано спроєцьовані томи в Kubernetes. Рекомендується ознайомитися з томами для кращого розуміння.
Вступ
Том projected
відображає кілька наявних джерел томів в один каталог.
Зараз наступні типи джерел томів можуть бути спроєцьовані:
Всі джерела повинні бути в тому ж просторі імен, що й Pod. Для отримання додаткових відомостей дивіться документ з дизайну все-в-одному томі.
Приклад конфігурації з secret, downwardAPI та configMap
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: container-test
image: busybox:1.28
command: ["sleep", "3600"]
volumeMounts:
- name: all-in-one
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: mysecret
items:
- key: username
path: my-group/my-username
- downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "cpu_limit"
resourceFieldRef:
containerName: container-test
resource: limits.cpu
- configMap:
name: myconfigmap
items:
- key: config
path: my-group/my-config
Приклад конфігурації: secret з встановленим нестандартним режимом дозволу
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: container-test
image: busybox:1.28
command: ["sleep", "3600"]
volumeMounts:
- name: all-in-one
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: mysecret
items:
- key: username
path: my-group/my-username
- secret:
name: mysecret2
items:
- key: password
path: my-group/my-password
mode: 511
Кожне спроєцьоване джерело тому перераховане в специфікації в розділі sources
. Параметри майже такі ж, за винятком двох пунктів:
- Для секретів поле
secretName
було змінено наname
, щоб бути послідовним з назвою ConfigMap. defaultMode
можна вказати тільки на рівні спроєцьованого тому, а не для кожного джерела тому. Однак, як показано вище, ви можете явно встановитиmode
для кожної окремої проєкції.
Спроєцьовані томи serviceAccountToken
Ви можете впровадити токен для поточного service accountʼу в Pod за вказаним шляхом. Наприклад:
apiVersion: v1
kind: Pod
metadata:
name: sa-token-test
spec:
containers:
- name: container-test
image: busybox:1.28
command: ["sleep", "3600"]
volumeMounts:
- name: token-vol
mountPath: "/service-account"
readOnly: true
serviceAccountName: default
volumes:
- name: token-vol
projected:
sources:
- serviceAccountToken:
audience: api
expirationSeconds: 3600
path: token
Pod в прикладі має project том, що містить впроваджений токен service account. Контейнери в цьому Pod можуть використовувати цей токен для доступу до сервера API Kubernetes, автентифікуючись за відомостями service accountʼу Pod. Поле audience
містить призначену аудиторію токена. Отримувач токена повинен ідентифікувати себе за ідентифікатором, вказаним в аудиторії токена, інакше він повинен відхилити токен. Це поле є необовʼязковим, але стандартним для ідентифікації в API сервері.
Поле expirationSeconds
містить час, через який токен стане недійсним. Типовим є час в одну годину, але він має бути принаймні 10 хвилин (600 секунд). Адміністратор може обмежити максимальне значення вказавши параметр --service-account-max-token-expiration
в API сервері. Поле path
містить відносний шлях до точки монтування тому.
Примітка:
Контейнер, що використовує джерела project томів якsubPath
для монтування тому не отримуватиме оновлення для цих джерел.Спроєцьовані томи clusterTrustBundle
Kubernetes v1.29 [alpha]
Примітка:
Для використання цієї функції в Kubernetes {{ skew currentVersion }} вам потрібно увімкнути підтримку обʼєктів ClusterTrustBundle з функціональною можливістюClusterTrustBundle
та прапорецем --runtime-config=certificates.k8s.io/v1alpha1/clustertrustbundles=true
в kube-apiserver, а потім увімкнути функцію ClusterTrustBundleProjection
.Спроєцьований том clusterTrustBundle
дозволяє впроваджувати контент одного чи більше обʼєктів ClusterTrustBundle як автоматично оновлюваний файл у файловій системі контейнера.
ClusterTrustBundle може бути обраний за допомогою name або signer name.
Для вибору за імʼям використовуйте поле name
, щоб вказати один обʼєкт ClusterTrustBundle.
Для вибору за імʼям підписанта використовуйте поле signerName
(і, за необхідності, поле labelSelector
), щоб вказати набір обʼєктів ClusterTrustBundle, які використовують задане імʼя підписанта. Якщо labelSelector
відсутнє, то вибираються всі ClusterTrustBundle для цього підписанта.
Kubelet виконує відсіювання дублікатів сертифікатів у вибраних обʼєктах ClusterTrustBundle, нормалізує представлення PEM (видаляючи коментарі та заголовки), перегруповує сертифікати та записує їх у файл, вказаний полем path
. При зміні набору вибраних обʼєктів ClusterTrustBundle або їх вмісту kubelet підтримує актуальність файлу.
Типово kubelet запобігає запуску Podʼа, якщо заданий обʼєкт ClusterTrustBundle не знайдено, або якщо signerName
/ labelSelector
не відповідає жодному обʼєкту ClusterTrustBundle. Якщо ця поведінка не відповідає вашим вимогам, встановіть поле optional
в true
, і Pod буде запущено з порожнім файлом за шляхом path
.
apiVersion: v1
kind: Pod
metadata:
name: sa-ctb-name-test
spec:
containers:
- name: container-test
image: busybox
command: ["sleep", "3600"]
volumeMounts:
- name: token-vol
mountPath: "/root-certificates"
readOnly: true
serviceAccountName: default
volumes:
- name: token-vol
projected:
sources:
- clusterTrustBundle:
name: example
path: example-roots.pem
- clusterTrustBundle:
signerName: "example.com/mysigner"
labelSelector:
matchLabels:
version: live
path: mysigner-roots.pem
optional: true
Взаємодія SecurityContext
Пропозиція щодо обробки дозволів файлів у розширенні projected service account volume представляє, що projected файли мають відповідні набори дозволів власника.
Linux
У Podʼах Linux, які мають projected том та RunAsUser
вказано у SecurityContext
, projected файли мають правильно встановлені права власності, включаючи власника контейнера.
Коли у всіх контейнерах в Podʼі встановлено одне й те ж runAsUser
у їх
PodSecurityContext
або SecurityContext
, то kubelet гарантує, що вміст тому serviceAccountToken
належить цьому користувачеві, а файл токена має режим дозволів, встановлений в 0600
.
Примітка:
ефемерні контейнери додані до Podʼа після його створення не змінюють прав доступу до тому, які були встановлені при створенні Podʼа.
Якщо права доступу до тому serviceAccountToken
Podʼа були встановлені на 0600
, тому що всі інші контейнери в Podʼі мають одне і те ж runAsUser
, ефемерні контейнери повинні використовувати той самий runAsUser
, щоб мати змогу читати токен.
Windows
У Windows Podʼах, які мають projected том та RunAsUsername
вказано в SecurityContext
Podʼа, права власності не забезпечуються через спосіб управління користувачами у Windows. Windows зберігає та управляє локальними обліковими записами користувачів і груп у файлі бази даних, який називається Security Account Manager (SAM). Кожен контейнер підтримує свій власний екземпляр бази даних SAM, до якого хост не має доступу під час роботи контейнера. Контейнери Windows призначені для запуску режиму користувача операційної системи в ізоляції від хосту, тому не зберігають динамічну конфігурацію власності файлів хосту для облікових записів віртуалізованих контейнерів. Рекомендується розміщувати файли, які слід спільно використовувати з контейнером на машині-хості, в окремому змісті поза C:\
.
Типово у projected файлах буде встановлено наступні права, як показано для прикладу projected файлу тома:
PS C:\> Get-Acl C:\var\run\secrets\kubernetes.io\serviceaccount\..2021_08_31_22_22_18.318230061\ca.crt | Format-List
Path : Microsoft.PowerShell.Core\FileSystem::C:\var\run\secrets\kubernetes.io\serviceaccount\..2021_08_31_22_22_18.318230061\ca.crt
Owner : BUILTIN\Administrators
Group : NT AUTHORITY\SYSTEM
Access : NT AUTHORITY\SYSTEM Allow FullControl
BUILTIN\Administr
ators Allow FullControl
BUILTIN\Users Allow ReadAndExecute, Synchronize
Audit :
Sddl : O:BAG:SYD:AI(A;ID;FA;;;SY)(A;ID;FA;;;BA)(A;ID;0x1200a9;;;BU)
Це означає, що всі адміністратори, такі як ContainerAdministrator
, матимуть доступ на читання, запис та виконання, тоді як не-адміністратори матимуть доступ на читання та
виконання.
Примітка:
Загалом не рекомендується надавати контейнеру доступ до хосту, оскільки це може відкрити можливості для потенційних використань дірок безпеки.
Створення Windows Podʼа з RunAsUser
в його SecurityContext
призведе до того, що Pod буде застрягати на стадії ContainerCreating
назавжди. Таким чином, рекомендується не використовувати опцію RunAsUser
, яка призначена лише для Linux, з Windows Podʼами.
4 - Ефемерні томи
Цей документ описує ефемерні томи в Kubernetes. Рекомендується мати знайомство з томами, зокрема з PersistentVolumeClaim та PersistentVolume.
Деякі застосунки потребують додаткових ресурсів зберігання, але їм не важливо, чи зберігаються ці дані постійно між перезавантаженнями. Наприклад, служби кешування часто обмежені обсягом памʼяті та можуть переміщувати рідко використовувані дані в ресурси зберігання, які є повільнішими за памʼять з мінімальним впливом на загальну продуктивність.
Інші застосунки очікують, що деякі дані тільки-для-читання будуть присутні в файлах, таких як конфігураційні дані або секретні ключі.
Ефемерні томи призначені для таких сценаріїв використання. Оскільки томи слідкують за життєвим циклом Podʼа та створюються і видаляються разом з Podʼом, Podʼи можуть бути зупинені та перезапущені, не обмежуючись тим, чи доступний будь-який постійний том.
Ефемерні томи вказуються inline в специфікації Podʼа, що спрощує розгортання та управління застосунками.
Типи ефемерних томів
Kubernetes підтримує кілька різновидів ефемерних томів для різних цілей:
- emptyDir: порожній при запуску Podʼа, зберігання здійснюється локально з базового каталогу kubelet (зазвичай кореневий диск) або в ОЗП
- configMap, downwardAPI, secret: впровадження різних видів даних Kubernetes в Podʼі
- image: дозволяє монтувати файли образів контейнерів або артефактів, безпосередньо у Pod.
- CSI ефемерні томи: схожі на попередні види томів, але надаються спеціальними драйверами CSI, які спеціально підтримують цю функцію
- загальні ефемерні томи, які можуть бути надані всіма драйверами зберігання, які також підтримують постійні томи
emptyDir
, configMap
, downwardAPI
, secret
надаються як локальне ефемерне сховище. Вони керуються kubelet на кожному вузлі.
CSI ефемерні томи обовʼязково повинні надаватися сторонніми драйверами зберігання CSI.
Загальні ефемерні томи можуть надаватися сторонніми драйверами зберігання CSI, але також будь-яким іншим драйвером зберігання, який підтримує динамічне виділення томів. Деякі драйвери CSI написані спеціально для ефемерних томів CSI та не підтримують динамічного виділення: їх тоді не можна використовувати для загальних ефемерних томів.
Перевагою використання сторонніх драйверів є те, що вони можуть пропонувати функціональність, яку Kubernetes сам не підтримує, наприклад сховища з іншими характеристиками продуктивності, ніж диск, яким керує kubelet, або впровадження різних даних.
Ефемерні томи CSI
Kubernetes v1.25 [stable]
Примітка:
CSI ефемерні томи підтримуються лише певною підмножиною драйверів CSI. Список драйверів CSI Kubernetes показує, які драйвери підтримують ефемерні томи.Концептуально, ефемерні томи CSI схожі на типи томів configMap
, downwardAPI
та secret
: ресурси зберігання керується локально на кожному вузлі та створюються разом з іншими локальними ресурсами після того, як Pod було
заплановано на вузол. Kubernetes не має поняття про перепланування Podʼів на цьому етапі. Створення тому має бути малоймовірним, інакше запуск Podʼа застрягне. Зокрема, планування Podʼів з урахуванням потужності ресурсів зберігання не підтримується для цих томів. Наразі вони також не входять до обмежень використання томів зберігання Podʼа, оскільки це є чимось, що kubelet може забезпечити лише для ресурсу зберігання, яким він управляє самостійно.
Ось приклад маніфесту для Podʼа, який використовує ефемерне зберігання CSI:
kind: Pod
apiVersion: v1
metadata:
name: my-csi-app
spec:
containers:
- name: my-frontend
image: busybox:1.28
volumeMounts:
- mountPath: "/data"
name: my-csi-inline-vol
command: [ "sleep", "1000000" ]
volumes:
- name: my-csi-inline-vol
csi:
driver: inline.storage.kubernetes.io
volumeAttributes:
foo: bar
Атрибути тому визначають, який том підготовлює драйвер. Ці атрибути є специфічними для кожного драйвера і не стандартизовані. Дивіться документацію кожного драйвера CSI для отримання додаткових інструкцій.
Обмеження драйверів CSI
Ефемерні томи CSI дозволяють користувачам передавати volumeAttributes
прямо до драйвера CSI як частину специфікації Podʼа. Драйвер CSI, який дозволяє використання volumeAttributes
, які зазвичай обмежені для адміністраторів, НЕ підходить для використання в ефемерному томі всередині Podʼа. Наприклад, параметри, які зазвичай визначаються в StorageClass, не повинні використовуватися користувачами через ефемерні томи всередині.
Адміністратори кластера, яким потрібно обмежити драйвери CSI, які дозволяють використання вбудованих томів всередині специфікації Podʼа, можуть зробити це, виконавши наступне:
- Видаліть
Ephemeral
ізvolumeLifecycleModes
в специфікації CSIDriver, що перешкоджає використанню драйвера в якості вбудованого ефемерного тому. - Використання admission webhook для обмеження того, як цей драйвер використовується.
Загальні ефемерні томи
Kubernetes v1.23 [stable]
Загальні ефемерні томи схожі на томи emptyDir
в тому сенсі, що вони надають директорію на кожен Pod для тимчасових даних, які, як правило, порожні після створення. Але вони також можуть мати додаткові функції:
- Зберігання може бути локальним або мережевим.
- Томи можуть мати фіксований розмір, який Podʼи не можуть перевищити.
- У томів може бути певні початкові дані, залежно від драйвера та параметрів.
- Підтримуються типові операції з томами, за умови, що драйвер їх підтримує, включаючи створення знімків, клонування, зміну розміру та відстеження місткості томів.
Приклад:
kind: Pod
apiVersion: v1
metadata:
name: my-app
spec:
containers:
- name: my-frontend
image: busybox:1.28
volumeMounts:
- mountPath: "/scratch"
name: scratch-volume
command: [ "sleep", "1000000" ]
volumes:
- name: scratch-volume
ephemeral:
volumeClaimTemplate:
metadata:
labels:
type: my-frontend-volume
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "scratch-storage-class"
resources:
requests:
storage: 1Gi
Життєвий цикл та PersistentVolumeClaim
Ключова концепція дизайну полягає в тому, що параметри для вимог тому дозволені всередині джерела тому Podʼа. Підтримуються мітки, анотації та весь набір полів для PersistentVolumeClaim. Коли такий Pod створюється, контролер ефемерних томів створює фактичний обʼєкт PersistentVolumeClaim в тому ж просторі імен, що і Pod, та забезпечує видалення PersistentVolumeClaim при видаленні Podʼа.
Це викликає привʼязку та/або резервування тому, або негайно, якщо StorageClass використовує негайне звʼязування тому, або коли Pod тимчасово запланований на вузол (WaitForFirstConsumer
volume binding mode). Останній варіант рекомендований для загальних ефемерних томів, оскільки тоді планувальник може вибрати відповідний вузол для Podʼа. При негайному звʼязуванні планувальник змушений вибрати вузол, який має доступ до тому, якщо він доступний.
З погляду прав власності на ресурси, Pod, який має загальний ефемерний том, є власником PersistentVolumeClaim(s), які забезпечують цей ефемерний том. При видаленні Podʼа, збирач сміття Kubernetes видаляє PVC, що, як правило, спричиняє видалення тому через типову політику повторного використання класів зберігання — видалення томів. Ви можете створити квазі-ефемерне локальне зберігання за допомогою StorageClass з політикою повторного використання retain
: ресурс зберігання існує поза життєвим циклом Podʼа, і в цьому випадку потрібно забезпечити, що очищення тому відбувається окремо.
Поки ці PVC існують, їх можна використовувати, подібно до будь-якого іншого PVC. Зокрема, їх можна вказати як джерело даних для клонування томів або створення знімків. Обʼєкт PVC також містить поточний статус тому.
Найменування PersistentVolumeClaim
Найменування автоматично створених PVC є детермінованим: назва є комбінацією назви Podʼа і назви тому, з дефісом (-
) посередині. У вищезазначеному прикладі назва PVC буде my-app-scratch-volume
. Це детерміноване найменування полегшує
взаємодію з PVC, оскільки не потрібно шукати її, якщо відомі назва Podʼа та назва тому.
Детерміноване найменування також вводить потенційний конфлікт між різними Podʼами (Pod "pod-a" з томом "scratch" і інший Pod з імʼям "pod" і томом "a-scratch" обидва отримають однакове найменування PVC "pod-a-scratch") і між Podʼами та PVC, створеними вручну.
Такі конфлікти виявляються: PVC використовується лише для ефемерного тому, якщо він був створений для Podʼа. Ця перевірка базується на стосунках власності на ресурси. Наявний PVC не перезаписується або не змінюється. Проте це не вирішує конфлікт, оскільки без відповідного PVC Pod не може стартувати.
Увага:
Будьте уважні при найменуванні Podʼів та томів в тому ж просторі імен, щоб уникнути таких конфліктів.Безпека
Використання загальних ефемерних томів дозволяє користувачам створювати PVC непрямо, якщо вони можуть створювати Podʼи, навіть якщо у них немає дозволу на створення PVC безпосередньо. Адміністраторам кластера слід бути обізнаними щодо цього. Якщо це не відповідає їхньому зразку безпеки, вони повинні використовувати admission webhook, який відхиляє обʼєкти, такі як Podʼи, які мають загальний ефемерний том.
Звичайне обмеження квоти для PVC в просторі імен все ще застосовується, тому навіть якщо користувачам дозволено використовувати цей новий механізм, вони не можуть використовувати його для оминання інших політик.
Що далі
Ефемерні томи, керовані kubelet
Див. локальне ефемерне сховище.
Ефемерні томи CSI
- Докладніша інформація про дизайн доступна у Ефемерних Inline CSI томах KEP.
- Для отримання докладнішої інформації про подальший розвиток цієї функції див. тікет #596.
Загальні ефемерні томи
- Для отримання докладнішої інформації про дизайн див. Ефемерні загальні томи з потоковим доступом KEP.
5 - Класи сховищ
Цей документ описує концепцію StorageClass в Kubernetes. Рекомендується мати знайомство з томами та постійними томами.
StorageClass надає можливість адміністраторам описати класи сховищ, які вони надають. Різні класи можуть відповідати рівням обслуговування, політикам резервного копіювання або будь-яким політикам, визначеним адміністраторами кластера. Kubernetes сам не визначає, що являють собою класи.
Концепція Kubernetes StorageClass схожа на "профілі" в деяких інших дизайнах систем збереження.
Обʼєкти StorageClass
Кожен StorageClass містить поля provisioner
, parameters
та reclaimPolicy
, які використовуються, коли PersistentVolume, який належить до класу, має бути динамічно резервований для задоволення PersistentVolumeClaim (PVC).
Імʼя обʼєкта StorageClass має значення, і саме воно дозволяє користувачам запитувати певний клас. Адміністратори встановлюють імʼя та інші параметри класу під час першого створення обʼєктів StorageClass.
Як адміністратор, ви можете вказати типовий StorageClass, який застосовується до будь-яких PVC, які не вимагають конкретного класу. Докладніше див. концепцію PersistentVolumeClaim.
Тут наведено приклад StorageClass:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: low-latency
annotations:
storageclass.kubernetes.io/is-default-class: "false"
provisioner: csi-driver.example-vendor.example
reclaimPolicy: Retain # типове значення — Delete
allowVolumeExpansion: true
mountOptions:
- discard # Це може увімкнути UNMAP / TRIM на рівні зберігання блоків
volumeBindingMode: WaitForFirstConsumer
parameters:
guaranteedReadWriteLatency: "true" # залежить від постачальника
Типовий StorageClass
Ви можете визначити StorageClass як типовий для вашого кластера. Щоб дізнатися, як встановити типовий StorageClass, див. Зміна типового StorageClass.
Якщо PVC не вказує storageClassName
, буде використовуватися типовий StorageClass.
Якщо ви встановите анотацію storageclass.kubernetes.io/is-default-class
у значення true для більше ніж одного StorageClass у вашому кластері, і потім створите PersistentVolumeClaim без вказання storageClassName
, Kubernetes використовуватиме найновіший типовий StorageClass.
Примітка:
Спробуйте мати лише один типовий StorageClass у вашому кластері. Причина, чому Kubernetes дозволяє вам мати кілька типових StorageClass, — це можливість безшовної міграції.Ви можете створити PersistentVolumeClaim, не вказуючи storageClassName
для нового PVC, і ви можете це зробити навіть тоді, коли у вашому кластері немає типового StorageClass. У цьому випадку новий PVC створюється так, як ви його визначили, і storageClassName
цього PVC залишається невизначеним до тих пір, поки не стане доступний типовий StorageClass.
Ви можете мати кластер без типового StorageClass. Якщо ви не встановлюєте жодного StorageClass як типового (і його не визначено, наприклад, постачальником хмари), то Kubernetes не може застосовувати ці типові класи до PersistentVolumeClaims, які йому потрібні.
Якщо або коли стає доступний типовий StorageClass, система керування визначає будь-які наявні PVC без storageClassName
. Для PVC, які або мають порожнє значення для storageClassName
, або не мають цього ключа, система керування потім оновлює ці PVC, щоб встановити storageClassName
відповідно до нового типового StorageClass. Якщо у вас є наявний PVC з storageClassName
""
, і ви налаштовуєте типовий StorageClass, то цей PVC не буде оновлено.
Щоб продовжити привʼязку до PV із storageClassName
, встановленим як ""
(при наявності типового StorageClass), вам потрібно встановити storageClassName
асоційованого PVC як ""
.
Постачальник
У кожного StorageClass є постачальник, який визначає, який модуль обробника тому використовується для надання PV. Це поле повинно бути визначено.
Модуль обробника тому | Внутрішній постачальник | Приклад конфігурації |
---|---|---|
AzureFile | ✓ | Azure File |
CephFS | - | - |
FC | - | - |
FlexVolume | - | - |
iSCSI | - | - |
Local | - | Local |
NFS | - | NFS |
PortworxVolume | ✓ | Portworx Volume |
RBD | - | Ceph RBD |
VsphereVolume | ✓ | vSphere |
Ви не обмежені вказанням "внутрішніх" постачальників, вказаних тут (імена яких починаються з "kubernetes.io" і входять до складу Kubernetes). Ви також можете запускати і вказувати зовнішні постачальники, які є незалежними програмами і слідують специфікації, визначеній Kubernetes. Автори зовнішніх постачальників мають на власний розсуд поводитись щодо того, де розташований їх код, як постачальник надається, як його слід запускати, який модуль обробника тому він використовує (включаючи Flex) тощо. У репозиторії kubernetes-sigs/sig-storage-lib-external-provisioner знаходиться бібліотека для написання зовнішніх постачальників, яка реалізує більшість специфікації. Деякі зовнішні постачальники перелічені у репозиторії kubernetes-sigs/sig-storage-lib-external-provisioner.
Наприклад, NFS не надає внутрішнього постачальника, але можна використовувати зовнішній. Існують також випадки, коли сторонні виробники систем зберігання надають свій власний зовнішній постачальник.
Політика повторного використання
PersistentVolumes, які динамічно створюються за допомогою StorageClass, матимуть політику повторного використання вказану в полі reclaimPolicy
класу, яке може бути або Delete
, або Retain
. Якщо поле reclaimPolicy
не вказано при створенні обʼєкта StorageClass, то типово воно буде Delete
.
PersistentVolumes, які створені вручну та управляються за допомогою StorageClass, матимуть таку політику повторного використання, яку їм було призначено при створенні.
Розширення тому
PersistentVolumes можуть бути налаштовані на розширення. Це дозволяє змінювати розмір тому, редагуючи відповідний обʼєкт PVC і запитуючи новий, більший том зберігання.
Наступні типи томів підтримують розширення тому, коли базовий StorageClass має поле allowVolumeExpansion
, встановлене в значення true.
Тип тому | Потрібна версія Kubernetes для розширення тому |
---|---|
Azure File | 1.11 |
CSI | 1.24 |
FlexVolume | 1.13 |
Portworx | 1.11 |
rbd | 1.11 |
Примітка:
Ви можете використовувати функцію розширення тому лише для збільшення тому, але не для його зменшення.Опції монтування
PersistentVolumes, які динамічно створюються за допомогою StorageClass, матимуть опції монтування, вказані в полі mountOptions
класу.
Якщо обʼєкт тому не підтримує опції монтування, але вони вказані, створення тому завершиться невдачею. Опції монтування не перевіряються ні на рівні класу, ні на рівні PV. Якщо опція монтування є недійсною, монтування PV не вдасться.
Режим привʼязки тому
Поле volumeBindingMode
керує тим, коли привʼязка тому та динамічне створення повинно відбуватися. Коли воно не встановлене, типово використовується режим Immediate
.
Режим Immediate
вказує, що привʼязка тому та динамічне створення відбувається після створення PersistentVolumeClaim. Для сховищ, які обмежені топологією і не доступні з усіх вузлів в кластері, PersistentVolumes буде привʼязаний або створений без знання про планування Podʼа. Це може призвести до неможливості планування Podʼів.
Адміністратор кластера може розвʼязати цю проблему, вказавши режим WaitForFirstConsumer
, який затримає привʼязку та створення PersistentVolume до створення Podʼа з PersistentVolumeClaim. PersistentVolumes будуть обрані або створені відповідно до топології, яку визначають обмеження планування Podʼа. Сюди входять, але не обмежуються вимоги до ресурсів, селектори вузлів, affinity та anti-affinity Podʼа, і taint та toleration.
Наступні втулки підтримують WaitForFirstConsumer
разом із динамічним створенням:
- CSI-томи, за умови, що конкретний драйвер CSI підтримує це
Наступні втулки підтримують WaitForFirstConsumer
разом із попередньо створеною привʼязкою PersistentVolume:
- CSI-томи, за умови, що конкретний драйвер CSI підтримує це
local
Примітка:
Якщо ви вирішили використовувати WaitForFirstConsumer
, не використовуйте nodeName
в специфікації Podʼа, щоб вказати спорідненість (affinity) вузла. Якщо в цьому випадку використовується nodeName
, планувальника буде оминати PVC і вона залишиться в стані pending
.
Замість цього ви можете використовувати селектор вузла для kubernetes.io/hostname
:
apiVersion: v1
kind: Pod
metadata:
name: task-pv-pod
spec:
nodeSelector:
kubernetes.io/hostname: kube-01
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: task-pv-claim
containers:
- name: task-pv-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: task-pv-storage
Дозволені топології
Коли оператор кластера вказує режим привʼязки тому WaitForFirstConsumer
, в більшості випадків не потрібно обмежувати забезпечення конкретних топологій. Однак, якщо це все ще необхідно, можна вказати allowedTopologies
.
У цьому прикладі показано, як обмежити топологію запроваджених томів конкретними зонами та використовувати як заміну параметрам zone
та zones
для підтримуваних втулків.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: example.com/example
parameters:
type: pd-standard
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
- key: topology.kubernetes.io/zone
values:
- us-central-1a
- us-central-1b
Параметри
У StorageClasses є параметри, які описують томи, які належать класу сховища. Різні параметри можуть прийматися залежно від provisioner
. Коли параметр відсутній, використовується який-небудь типове значення.
Може бути визначено не більше 512 параметрів для StorageClass. Загальна довжина обʼєкта параметрів разом із ключами та значеннями не може перевищувати 256 КіБ.
AWS EBS
У Kubernetes 1.31 не включено тип тому awsElasticBlockStore
.
Драйвер зберігання AWSElasticBlockStore у вузлі був відзначений як застарілий у релізі Kubernetes v1.19 і повністю видалений у релізі v1.27.
Проєкт Kubernetes рекомендує використовувати AWS EBS замість вбудованого драйвера зберігання.
Нижче подано приклад StorageClass для драйвера CSI AWS EBS:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ebs-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
csi.storage.k8s.io/fstype: xfs
type: io1
iopsPerGB: "50"
encrypted: "true"
tagSpecification_1: "key1=value1"
tagSpecification_2: "key2=value2"
allowedTopologies:
- matchLabelExpressions:
- key: topology.ebs.csi.aws.com/zone
values:
- us-east-2c
# `tagSpecification`: Теґи з цим префіксом застосовуються до динамічно наданих томів EBS.
AWS EFS
Щоб налаштувати сховище AWS EFS, можна використовувати сторонній драйвер AWS_EFS_CSI_DRIVER.
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: efs-sc
provisioner: efs.csi.aws.com
parameters:
provisioningMode: efs-ap
fileSystemId: fs-92107410
directoryPerms: "700"
provisioningMode
: Тип тому, що створюється за допомогою Amazon EFS. Наразі підтримується лише створення на основі точки доступу (efs-ap
).fileSystemId
: Файлова система, під якою створюється точка доступу.directoryPerms
: Дозволи на теки для кореневої теки, створеної точкою доступу.
Для отримання додаткової інформації зверніться до документації AWS_EFS_CSI_Driver Dynamic Provisioning.
NFS
Для налаштування NFS-сховища можна використовувати вбудований драйвер або драйвер CSI для NFS в Kubernetes (рекомендовано).
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: example-nfs
provisioner: example.com/external-nfs
parameters:
server: nfs-server.example.com
path: /share
readOnly: "false"
server
: Server — це імʼя хосту або IP-адреса сервера NFS.path
: Шлях, який експортується сервером NFS.readOnly
: Прапорець, який вказує, чи буде сховище змонтовано тільки для читання (типово – false).
Kubernetes не включає внутрішній NFS-провайдер. Вам потрібно використовувати зовнішній провайдер для створення StorageClass для NFS. Ось деякі приклади:
vSphere
Існують два типи провайдерів для класів сховища vSphere:
- CSI провайдер:
csi.vsphere.vmware.com
- vCP провайдер:
kubernetes.io/vsphere-volume
Вбудовані провайдери застарілі. Для отримання додаткової інформації про провайдера CSI, див. Kubernetes vSphere CSI Driver та міграцію vSphereVolume CSI.
CSI провайдер
Постачальник сховища StorageClass для vSphere CSI працює з кластерами Tanzu Kubernetes. Для прикладу див. репозитарій vSphere CSI.
vCP провайдер
У наступних прикладах використовується постачальник сховища VMware Cloud Provider (vCP).
Створіть StorageClass із зазначенням формату диска користувачем.
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast provisioner: kubernetes.io/vsphere-volume parameters: diskformat: zeroedthick
diskformat
:thin
,zeroedthick
таeagerzeroedthick
. Стандартно:"thin"
.Створіть StorageClass із форматуванням диска на зазначеному користувачем сховищі.
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast provisioner: kubernetes.io/vsphere-volume parameters: diskformat: zeroedthick datastore: VSANDatastore
datastore
: Користувач також може вказати сховище в StorageClass. Том буде створено на сховищі, вказаному в StorageClass, у цьому випадку —VSANDatastore
. Це поле є необовʼязковим. Якщо сховище не вказано, том буде створено у сховищі, вказаному в конфігураційному файлі vSphere, який використовується для ініціалізації хмарного провайдера vSphere.Керування політикою сховища в Kubernetes
Використання наявної політики SPBM vCenter
Однією з найважливіших функцій vSphere для керування сховищем є керування на основі політики сховища (SPBM). Система управління сховищем на основі політики (SPBM) — це каркас політики сховища, який надає єдину уніфіковану панель управління для широкого спектра служб обробки даних та рішень зберігання. SPBM дозволяє адміністраторам vSphere подолати виклики щодо передбачуваного виділення сховища, такі як планування потужності, різні рівні обслуговування та управління потужністю.
Політики SPBM можна вказати в StorageClass за допомогою параметра
storagePolicyName
.Підтримка політики Virtual SAN всередині Kubernetes
Адміністратори Vsphere Infrastructure (VI) будуть мати можливість вказувати власні віртуальні можливості сховища SAN під час динамічного виділення томів. Тепер ви можете визначити вимоги до сховища, такі як продуктивність та доступність, у вигляді можливостей сховища під час динамічного виділення томів. Вимоги до можливостей сховища перетворюються в політику Virtual SAN, яка потім передається на рівень віртуального SAN при створенні постійного тому (віртуального диска). Віртуальний диск розподіляється по сховищу віртуального SAN для відповідності вимогам.
Детальнішу інформацію щодо використання політик сховища для управління постійними томами можна переглянути в Керуванні політикою на основі зберігання для динамічного виділення томів.
Є кілька прикладів для vSphere, які можна спробувати для керування постійним томом в Kubernetes для vSphere.
Ceph RBD (застарілий)
Примітка:
Kubernetes v1.28 [deprecated]
Цей внутрішній провайдер Ceph RBD застарів. Будь ласка, використовуйте CephFS RBD CSI driver.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/rbd # Цей провізор є застарілим
parameters:
monitors: 198.19.254.105:6789
adminId: kube
adminSecretName: ceph-secret
adminSecretNamespace: kube-system
pool: kube
userId: kube
userSecretName: ceph-secret-user
userSecretNamespace: default
fsType: ext4
imageFormat: "2"
imageFeatures: "layering"
monitors
: Монітори Ceph, розділені комою. Цей параметр є обовʼязковим.adminId
: Ідентифікатор клієнта Ceph, який може створювати образи в пулі. Типово — "admin".adminSecretName
: Імʼя секрету дляadminId
. Цей параметр є обовʼязковим. Наданий секрет повинен мати тип "kubernetes.io/rbd".adminSecretNamespace
: Простір імен дляadminSecretName
. Типово — "default".pool
: Ceph RBD pool. Типово — "rbd".userId
: Ідентифікатор клієнта Ceph, який використовується для зіставлення образу RBD. Типово — такий самий, як іadminId
.userSecretName
: Імʼя Ceph Secret дляuserId
для зіставлення образу RBD. Він повинен існувати в тому ж просторі імен, що і PVC. Цей параметр є обовʼязковим. Наданий секрет повинен мати тип "kubernetes.io/rbd", наприклад, створений таким чином:kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" \ --from-literal=key='QVFEQ1pMdFhPUnQrSmhBQUFYaERWNHJsZ3BsMmNjcDR6RFZST0E9PQ==' \ --namespace=kube-system
userSecretNamespace
: Простір імен дляuserSecretName
.fsType
: fsType, який підтримується Kubernetes. Типово:"ext4"
.imageFormat
: Формат образу Ceph RBD, "1" або "2". Типово — "2".imageFeatures
: Цей параметр є необовʼязковим і слід використовувати тільки в разі якщо ви встановилиimageFormat
на "2". Зараз підтримуються тільки функціїlayering
. Типово — "", і жодна функція не включена.
Azure Disk
У Kubernetes 1.31 не включено типу тому azureDisk
.
Внутрішній драйвер зберігання azureDisk
був застарілий у випуску Kubernetes v1.19 і потім був повністю вилучений у випуску v1.27.
Проєкт Kubernetes рекомендує використовувати замість цього сторонній драйвер зберігання Azure Disk.
Azure File (застаріло)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurefile
provisioner: kubernetes.io/azure-file
parameters:
skuName: Standard_LRS
location: eastus
storageAccount: azure_storage_account_name # значення для прикладу
skuName
: Рівень SKU облікового запису Azure Storage. Типово відсутній.location
: Місце розташування облікового запису Azure Storage. Типово відсутнє.storageAccount
: Назва облікового запису Azure Storage. Типово відсутня. Якщо обліковий запис зберігання не наданий, весь обліковий запис, повʼязаний із групою ресурсів, перевіряється на наявність збігуskuName
таlocation
. Якщо обліковий запис зберігання надано, він повинен перебувати в тій самій групі ресурсів, що й кластер, і значенняskuName
таlocation
ігноруються.secretNamespace
: простір імен секрету, що містить імʼя та ключ облікового запису Azure Storage. Типово такий самий, як у Pod.secretName
: імʼя секрету, що містить імʼя та ключ облікового запису Azure Storage. Типовоazure-storage-account-<accountName>-secret
.readOnly
: прапорець, що вказує, чи буде ресурс зберігання монтуватися лише для читання. Типовоfalse
, що означає монтування для читання/запису. Це значення впливає також на налаштуванняReadOnly
вVolumeMounts
.
Під час надання ресурсів зберігання, для монтованих облікових даних створюється секрет з імʼям secretName
. Якщо кластер активував як RBAC, так і Ролі контролера, додайте дозвіл create
ресурсу secret
для clusterrole контролера
system:controller:persistent-volume-binder
.
У контексті multi-tenancy настійно рекомендується явно встановлювати значення для secretNamespace
, інакше дані облікового запису для зберігання можуть бути прочитані іншими користувачами.
Portworx volume (застаріло)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: portworx-io-priority-high
provisioner: kubernetes.io/portworx-volume # Цей провізор є застарілим
parameters:
repl: "1"
snap_interval: "70"
priority_io: "high"
fs
: файлова система для створення:none/xfs/ext4
(типово:ext4
).block_size
: розмір блоку у кілобайтах (типово:32
).repl
: кількість синхронних реплік у формі коефіцієнта реплікації1..3
(типово:1
). Тут потрібен рядок, наприклад"1"
, а не1
.priority_io
: визначає, чи буде том створений з використанням зберігання високої чи низької пріоритетностіhigh/medium/low
(типово:low
).snap_interval
: інтервал годинника/часу у хвилинах для того, щоб запускати моментальні знімки. Моментальні знімки є інкрементальними на основі різниці з попереднім знімком, 0 вимикає знімки (типово:0
). Тут потрібен рядок, наприклад"70"
, а не70
.aggregation_level
: вказує кількість частин, на які розподілений том, 0 вказує на нерозподілений том (типово:0
). Тут потрібен рядок, наприклад"0"
, а не0
.ephemeral
: вказує, чи слід очищати том після відмонтовування, чи він повинен бути постійним. Використання випадкуemptyDir
може встановлювати для цього значенняtrue
, а випадок використанняпостійних томів
, таких як для баз даних, наприклад Cassandra, повинен встановлюватиfalse
,true/false
(типовоfalse
). Тут потрібен рядок, наприклад"true"
, а неtrue
.
Локальне сховище
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner # вказує на те, що цей StorageClass не підтримує автоматичне виділення ресурсів
volumeBindingMode: WaitForFirstConsumer
Локальні томи не підтримують динамічне впровадження в Kubernetes 1.31; однак все одно слід створити StorageClass, щоб відкласти звʼязування тому до моменту фактичного планування Podʼа на відповідний вузол. Це вказано параметром звʼязування тому WaitForFirstConsumer
.
Відкладення звʼязування тому дозволяє планувальнику враховувати всі обмеження планування Podʼа при виборі відповідного PersistenVolume для PersistenVolumeClaim.
6 - Класи атрибутів тома
Kubernetes v1.31 [beta]
(стандартно увімкнено: false)Ця сторінка передбачає, що ви знайомі з StorageClasses, томами та постійними томами в Kubernetes.
Клас VolumeAttributesClass надає адміністраторам можливість описати змінні "класи" сховищ, які вони пропонують. Різні класи можуть відповідати різним рівням якості обслуговування. Kubernetes сам по собі не виражає думки про те, що представляють ці класи.
Це бета-функція, її типово вимкнено.
Якщо ви хочете протестувати функцію, поки вона бета, вам потрібно ввімкнути функціональну можливість VolumeAttributesClass
для kube-controller-manager, kube-scheduler та kube-apiserver. Використовуйте аргумент командного рядка --feature-gates
:
--feature-gates="...,VolumeAttributesClass=true"
Вам також потрібно буде увімкнути API групу storage.k8s.io/v1beta1
через kube-apiserver
runtime-config. Для цього використовуйте наступний аргумент командного рядка:
--runtime-config=storage.k8s.io/v1beta1=true
Ви також можете використовувати VolumeAttributesClass лише зі сховищем, підтримуваним Container Storage Interface, і лише там, де відповідний драйвер CSI реалізує API ModifyVolume
.
API VolumeAttributesClass
Кожен клас VolumeAttributesClass містить driverName
та parameters
, які використовуються, коли потрібно динамічно створити або змінити PersistentVolume (PV), що належить до цього класу.
Назва обʼєкта VolumeAttributesClass має значення, і вона використовується користувачами для запиту конкретного класу. Адміністратори встановлюють імʼя та інші параметри класу при створенні обʼєктів VolumeAttributesClass. Хоча імʼя обʼєкта VolumeAttributesClass в PersistentVolumeClaim
може змінюватися, параметри в наявному класі є незмінними.
apiVersion: storage.k8s.io/v1beta1
kind: VolumeAttributesClass
metadata:
name: silver
driverName: pd.csi.storage.gke.io
parameters:
provisioned-iops: "3000"
provisioned-throughput: "50"
Постачальник
Кожен клас VolumeAttributesClass має постачальника, який визначає, який втулок тому використовується для надання PV. Поле driverName
повинно бути вказане.
Підтримка функції для VolumeAttributesClass реалізована у kubernetes-csi/external-provisioner.
Ви не обмежені вказанням kubernetes-csi/external-provisioner. Ви також можете використовувати та вказувати зовнішні постачальники, які є незалежними програмами та відповідають специфікації, визначеною Kubernetes. Автори зовнішніх постачальників мають повну свободу в тому, де знаходиться їх код, як постачальник надається, як його потрібно запускати, який втулок тому він використовує та інше.
Модифікатор розміру
Кожен клас VolumeAttributesClass має модифікатор розміру, який визначає, який втулок тому використовується для модифікації PV. Поле driverName
повинно бути вказане.
Підтримка функції модифікації розміру тому для VolumeAttributesClass реалізована у kubernetes-csi/external-resizer.
Наприклад, наявний запит PersistentVolumeClaim використовує клас VolumeAttributesClass з іменем silver:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pv-claim
spec:
…
volumeAttributesClassName: silver
…
В кластері доступний новий клас VolumeAttributesClass з імʼям gold:
apiVersion: storage.k8s.io/v1beta1
kind: VolumeAttributesClass
metadata:
name: gold
driverName: pd.csi.storage.gke.io
parameters:
iops: "4000"
throughput: "60"
Користувач може оновити PVC за допомогою нового класу VolumeAttributesClass gold та застосувати зміни:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pv-claim
spec:
…
volumeAttributesClassName: gold
…
Параметри
Класи VolumeAttributesClass мають параметри, які описують томи, які до них належать. Різні параметри можуть бути прийняті залежно від обраного провайдера або модифікатора розміру. Наприклад, значення 4000
для параметра iops
, та параметр throughput
є специфічними для GCE PD. Якщо параметр опущено, використовуються стандартні значення під час створення тому. Якщо користувач застосовує PVC із використанням іншого VolumeAttributesClass з пропущеними параметрами, стандартні значення може використовуватися залежно від реалізації драйвера CSI. Будь ласка, звертайтесь до відповідної документації драйвера CSI для отримання деталей.
Може бути визначено не більше 512 параметрів для класу VolumeAttributesClass. Загальна довжина обʼєкта параметрів, включаючи ключі та значення, не може перевищувати 256 КіБ.
7 - Динамічне впровадження томів
Динамічне впровадження томів дозволяє створювати томи сховища при потребі. Без динамічного впровадження адміністратори кластера повинні вручну звертатися до свого хмарного або постачальника сховища, щоб створити нові томи сховища, а потім створювати обʼєкти PersistentVolume
, щоб мати їх в Kubernetes. Функція динамічного впровадження томів усуває необхідність для адміністраторів кластера попередньо впровадження сховища. Замість цього воно автоматично впроваджує сховище, коли користувачі створюють обʼєкти PersistentVolumeClaim
.
Причини
Реалізація динамічного впровадження томів базується на API-обʼєкті StorageClass
з групи API storage.k8s.io
. Адміністратор кластера може визначити стільки обʼєктів StorageClass
, скільки потрібно, кожен з них вказуючи провайдера тому (також відомий як provisioner) для впровадження тому та набір параметрів, які слід передати цьому провайдеру. Адміністратор кластера може визначити та надавати кілька варіантів сховища (з того ж або різних систем сховищ) в межах кластера, кожен зі своїм набором параметрів. Цей дизайн також забезпечує те, що кінцеві користувачі не повинні турбуватися про складнощі та нюанси впровадження сховища, але все ще мають можливість вибрати з різних варіантів сховища.
Додаткову інформацію про класи сховища можна знайти тут.
Увімкнення динамічного впровадження
Для увімкнення динамічного впровадження адміністратор кластера повинен передбачити один або декілька обʼєктів StorageClass
для користувачів. Обʼєкти StorageClass
визначають, який провайдер повинен використовуватися та які параметри повинні йому передаватися під час виклику динамічного впровадження. Імʼя обʼєкта StorageClass
повинно бути дійсним імʼям DNS-піддомену.
Наступний маніфест створює клас сховища "slow", який надає стандартні диски, схожі на постійні диски.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: slow
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
Наступний маніфест створює клас сховища "fast", який надає диски, схожі на SSD.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd
Використання динамічного впровадження
Користувачі можуть запитувати динамічно впроваджене сховище, включаючи клас сховища у свій PersistentVolumeClaim
. До версії Kubernetes v1.6 це робилося за допомогою анотації volume.beta.kubernetes.io/storage-class
. Однак ця анотація застаріла з версії v1.9. Тепер користувачі можуть і повинні використовувати поле storageClassName
обʼєкта PersistentVolumeClaim
. Значення цього поля повинно відповідати імені StorageClass
, налаштованому адміністратором (див. нижче).
Наприклад, щоб вибрати клас сховища "fast", користувач створює наступний PersistentVolumeClaim
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: claim1
spec:
accessModes:
- ReadWriteOnce
storageClassName: fast
resources:
requests:
storage: 30Gi
Цей запит призводить до автоматичного впровадження тому, схожого на SSD. Після видалення заявки том знищується.
Стандартна поведінка
Динамічне впровадження може бути увімкнено в кластері так, що всі заявки будуть динамічно надані, якщо не вказано жоден клас сховища. Адміністратор кластера може увімкнути цю поведінку шляхом:
- Визначення одного обʼєкта
StorageClass
як типового; - Переконайтеся, що контролер дозволів
DefaultStorageClass
увімкнений на API-сервері.
Адміністратор може визначити певний StorageClass
як типовий, додавши анотацію storageclass.kubernetes.io/is-default-class
до нього. Коли в кластері існує типовий StorageClass
, і користувач створює PersistentVolumeClaim
із невказаним storageClassName
, контролер DefaultStorageClass
автоматично додає поле storageClassName
, що вказує на типовий клас сховища.
Зверніть увагу, що якщо ви встановите анотацію storageclass.kubernetes.io/is-default-class
в true для більше одного StorageClass у вашому кластері, а потім створите PersistentVolumeClaim
із не встановленим storageClassName
, Kubernetes використовує найновіший створений типовий StorageClass.
Врахування топології
У кластерах з кількома зонами можуть розташовуватися Podʼи в різних зонах одного регіону. Томи сховища в одній зоні повинні надаватися в ті зони, де заплановані Podʼи. Це можна здійснити, встановивши режим звʼязування тому.
8 - Знімки томів
У Kubernetes VolumeSnapshot представляє знімок тому в системі зберігання. Цей документ передбачає, що ви вже знайомі з постійними томами Kubernetes — persistent volumes.
Вступ
Так само як ресурси API PersistentVolume
та PersistentVolumeClaim
використовуються для створення томів для користувачів та адміністраторів, API-ресурси VolumeSnapshotContent
та VolumeSnapshot
надаються для створення знімків томів для користувачів та адміністраторів.
VolumeSnapshotContent
— це знімок, зроблений з тому в кластері, який був створений адміністратором. Це ресурс в кластері, так само як PersistentVolume
— це ресурс кластера.
VolumeSnapshot
— це запит на знімок тому від користувача. Він схожий на PersistentVolumeClaim
.
VolumeSnapshotClass
дозволяє вам вказати різні атрибути, що належать до VolumeSnapshot
. Ці атрибути можуть відрізнятися серед знімків, зроблених з того ж тому в системі зберігання, і тому не можуть бути виражені, використовуючи той самий StorageClass
PersistentVolumeClaim
.
Знімки томів надають користувачам Kubernetes стандартизований спосіб копіювання вмісту тому в певний момент часу без створення цілком нового тому. Ця функціональність, наприклад, дозволяє адміністраторам баз даних робити резервні копії баз даних перед внесенням змін або видаленням.
Користувачі повинні знати про наступне при використанні цієї функції:
- API-обʼєкти
VolumeSnapshot
,VolumeSnapshotContent
таVolumeSnapshotClass
є CRDs, а не частиною основного API. - Підтримка
VolumeSnapshot
доступна лише для драйверів CSI. - В рамках процесу розгортання
VolumeSnapshot
команда Kubernetes надає контролер знімків для розгортання в панелі управління та допоміжний контейнер csi-snapshotter, який розгортається разом із драйвером CSI. Контролер знімків відстежує обʼєктиVolumeSnapshot
таVolumeSnapshotContent
та відповідає за створення та видалення обʼєктаVolumeSnapshotContent
. Допоміжний контейнер (sidecar) csi-snapshotter відстежує обʼєктиVolumeSnapshotContent
та виконує операціїCreateSnapshot
таDeleteSnapshot
для точки доступу CSI. - Також існує сервер перевірки вебзапитів, який надає затвердження обʼєктів знімків. Його слід встановити дистрибутивами Kubernetes разом із контролером знімків та CRDs, а не драйверами CSI. Він повинен бути встановлений в усіх кластерах Kubernetes, в яких увімкнено функцію створення знімків.
- Драйвери CSI можуть або не втілювати функціональність знімка тому. Драйвери CSI, які надали підтримку знімків тому, скоріш за все, використовуватимуть csi-snapshotter. Див. Документацію драйвера CSI для отримання деталей.
- Встановлення CRDs та контролера знімків є обовʼязком дистрибутиву Kubernetes.
Життєвий цикл знімка тому та змісту знімка тому
VolumeSnapshotContents
— це ресурси в кластері. VolumeSnapshots
– це запити на отримання цих ресурсів. Взаємодія між VolumeSnapshotContents
та VolumeSnapshots
відповідає життєвому циклу:
Впровадження знімків томів
Існує два способи впровадження знімків: статичне попереднє впровадження або динамічне попереднє впровадження.
Статичне
Адміністратор кластера створює кілька VolumeSnapshotContents
. Вони містять деталі реального знімка тому на системі зберігання, який доступний для використання користувачами кластера. Вони існують в API Kubernetes і доступні для використання.
Динамічне
Замість використання попередньо наявного знімку, можна запросити динамічне створення знімка з PersistentVolumeClaim. VolumeSnapshotClass вказує параметри, специфічні для постачальника зберігання, які слід використовувати при створенні знімка.
Звʼязування
Контролер знімків відповідає за звʼязування обʼєкта VolumeSnapshot
з відповідним обʼєктом VolumeSnapshotContent
, як у випадку попереднього впровадження, так і у випадку динамічного провадження. Звʼязування є зіставлення один до одного.
У випадку попереднього впровадження, обʼєкт VolumeSnapshot
залишається незвʼязаним до тих пір, доки не буде створено запитаний обʼєкт VolumeSnapshotContent
.
Persistent Volume Claim як захист джерела знімка
Метою цього захисту є забезпечення того, що обʼєкти API PersistentVolumeClaim використовуються і не видаляються з системи, поки відбувається створення знімка з нього (оскільки це може призвести до втрати даних).
Під час створення знімка з PersistentVolumeClaim
, цей PersistentVolumeClaim
знаходиться в стані використання. Якщо видалити обʼєкт API PersistentVolumeClaim
, який активно використовується як джерело знімка, то обʼєкт PersistentVolumeClaim
не видаляється негайно. Замість цього видалення обʼєкта PersistentVolumeClaim
відкладається до готовності або анулювання знімка.
Видалення
Видалення спровоковане видаленням обʼєкта VolumeSnapshot
, і буде дотримано DeletionPolicy
. Якщо DeletionPolicy
— це Delete
, тоді підлеглий знімок сховища буде видалено разом з обʼєктом VolumeSnapshotContent
. Якщо DeletionPolicy
— це Retain
, то як сховища, так і VolumeSnapshotContent
залишаться.
VolumeSnapshots
Кожен том VolumeSnapshot
містить специфікацію та стан.
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: new-snapshot-test
spec:
volumeSnapshotClassName: csi-hostpath-snapclass
source:
persistentVolumeClaimName: pvc-test
persistentVolumeClaimName
— це назва обʼєкта PersistentVolumeClaim
, який є джерелом даних для знімка. Це поле є обовʼязковим для динамічного створення знімка.
Обʼєкт знімка тому може запитати певний клас, вказавши назву VolumeSnapshotClass за допомогою атрибута volumeSnapshotClassName
. Якщо нічого не встановлено, то використовується типовий клас, якщо він доступний.
Для знімків, що були створені наперед, вам потрібно вказати volumeSnapshotContentName
як джерело для знімка, як показано в наступному прикладі. Поле volumeSnapshotContentName
як джерело є обовʼязковим для наперед створених знімків.
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: test-snapshot
spec:
source:
volumeSnapshotContentName: test-content
Вміст знімків томів
Кожен обʼєкт VolumeSnapshotContent
містить специфікацію та стан. При динамічному створенні знімків загальний контролер створює обʼєкти VolumeSnapshotContent
. Ось приклад:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
name: snapcontent-72d9a349-aacd-42d2-a240-d775650d2455
spec:
deletionPolicy: Delete
driver: hostpath.csi.k8s.io
source:
volumeHandle: ee0cfb94-f8d4-11e9-b2d8-0242ac110002
sourceVolumeMode: Filesystem
volumeSnapshotClassName: csi-hostpath-snapclass
volumeSnapshotRef:
name: new-snapshot-test
namespace: default
uid: 72d9a349-aacd-42d2-a240-d775650d2455
volumeHandle
– це унікальний ідентифікатор тому, створеного на сховищі та поверненого драйвером CSI під час створення тому. Це поле обовʼязкове для динамічного створення знімка. Воно вказує джерело тому для знімка.
Для наперед створених знімків ви (як адміністратор кластера) відповідаєте за створення обʼєкта VolumeSnapshotContent
наступним чином.
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
name: new-snapshot-content-test
spec:
deletionPolicy: Delete
driver: hostpath.csi.k8s.io
source:
snapshotHandle: 7bdd0de3-aaeb-11e8-9aae-0242ac110002
sourceVolumeMode: Filesystem
volumeSnapshotRef:
name: new-snapshot-test
namespace: default
snapshotHandle
— це унікальний ідентифікатор знімка тому, створеного в сховищі. Це поле є обовʼязковим для наперед створених знімків. Воно вказує ідентифікатор CSI знімка у сховищі, який представляє цей VolumeSnapshotContent
.
sourceVolumeMode
— це режим тому, з якого був зроблений знімок. Значення поля sourceVolumeMode
може бути або Filesystem
, або Block
. Якщо режим джерела тому не вказано, Kubernetes розглядає знімок так, ніби режим джерела тому невідомий.
volumeSnapshotRef
— це посилання на відповідний VolumeSnapshot
. Зверніть увагу, що коли VolumeSnapshotContent
створюється як наперед створений знімок, то VolumeSnapshot
, на який посилається volumeSnapshotRef
, може ще не існувати.
Зміна режиму тому знімка
Якщо API VolumeSnapshots
, встановлене на вашому кластері, підтримує поле sourceVolumeMode
, то API має можливість запобігати несанкціонованим користувачам зміни режиму тому.
Щоб перевірити, чи має ваш кластер цю функціональність, виконайте наступну команду:
kubectl get crd volumesnapshotcontent -o yaml
Якщо ви хочете дозволити користувачам створювати PersistentVolumeClaim
з наявного VolumeSnapshot
, але з іншим режимом тому, ніж у джерела, слід додати анотацію snapshot.storage.kubernetes.io/allow-volume-mode-change: "true"
до VolumeSnapshotContent
, який відповідає VolumeSnapshot
.
Для наперед створених знімків spec.sourceVolumeMode
повинно бути заповнено адміністратором кластера.
Приклад ресурсу VolumeSnapshotContent
із включеною цією функцією виглядатиме так:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
name: new-snapshot-content-test
annotations:
- snapshot.storage.kubernetes.io/allow-volume-mode-change: "true"
spec:
deletionPolicy: Delete
driver: hostpath.csi.k8s.io
source:
snapshotHandle: 7bdd0de3-aaeb-11e8-9aae-0242ac110002
sourceVolumeMode: Filesystem
volumeSnapshotRef:
name: new-snapshot-test
namespace: default
Створення томів зі знімків
Ви можете створити новий том, наперед заповнений даними зі знімка, використовуючи поле dataSource в обʼєкті PersistentVolumeClaim
.
Докладніше дивіться в Знімок тому та відновлення тому зі знімка.
9 - Класи знімків томів
У цьому документі описано концепцію VolumeSnapshotClass в Kubernetes. Рекомендується мати відомості про знімки томів та класи сховищ.
Вступ
Так само як StorageClass надає можливість адміністраторам описувати "класи" сховищ, які вони пропонують при виділенні тому, VolumeSnapshotClass надає можливість описувати "класи" сховищ при виділенні знімка тому.
Ресурс VolumeSnapshotClass
Кожен VolumeSnapshotClass містить поля driver
, deletionPolicy
та parameters
, які використовуються, коли потрібно динамічно виділити том для VolumeSnapshot, який належить до цього класу.
Назва обʼєкта VolumeSnapshotClass має значення і вказує, як користувачі можуть запитувати певний клас. Адміністратори встановлюють назву та інші параметри класу при створенні обʼєктів VolumeSnapshotClass, і їх не можна оновлювати після створення.
Примітка:
Встановлення CRDs є відповідальністю розподілу Kubernetes. Без наявних необхідних CRDs створення VolumeSnapshotClass закінчується невдачею.apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-hostpath-snapclass
driver: hostpath.csi.k8s.io
deletionPolicy: Delete
parameters:
Адміністратори можуть вказати типовий VolumeSnapshotClass для тих VolumeSnapshots, які не вимагають конкретний клас для привʼязки, додавши анотацію snapshot.storage.kubernetes.io/is-default-class: "true"
:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-hostpath-snapclass
annotations:
snapshot.storage.kubernetes.io/is-default-class: "true"
driver: hostpath.csi.k8s.io
deletionPolicy: Delete
parameters:
Driver
Класи знімків томів мають власника, який визначає, який CSI втулок тому використовується для виділення VolumeSnapshots. Це поле обовʼязкове.
DeletionPolicy
Класи знімків томів мають DeletionPolicy. Вона дозволяє налаштувати, що відбудеться з VolumeSnapshotContent, коли буде видалено обʼєкт VolumeSnapshot, з яким він повʼязаний. DeletionPolicy класу знімків томів може бути або Retain
, або Delete
. Це поле обовʼязкове.
Якщо DeletionPolicy має значення Delete
, тоді разом з обʼєктом VolumeSnapshotContent буде видалено знімок тому у сховищі. Якщо DeletionPolicy має значення Retain
, то знімок тому та VolumeSnapshotContent залишаються.
Параметри
Класи знімків томів мають параметри, які описують знімки томів, що належать до класу знімків томів. Різні параметри можуть бути прийняті залежно від driver
.
10 - Клонування CSI-томів
У цьому документі описано концепцію клонування наявних томів CSI в Kubernetes. Рекомендується мати уявлення про томи.
Вступ
Функція клонування томів CSI додає підтримку вказання наявних PVC у полі dataSource
для позначення бажання користувача клонувати Том.
Клон визначається як дублікат наявного тому Kubernetes, який можна використовувати як будь-який стандартний том. Єдина відмінність полягає в тому, що після підготовки, а не створення "нового" порожнього тому, пристрій, що відповідає за підтримку томів, створює точний дублікат вказаного тому.
Реалізація клонування, з погляду API Kubernetes, додає можливість вказати наявний PVC як джерело даних під час створення нового PVC. Джерело PVC має бути повʼязане та доступне (не у використанні).
Користувачі повинні знати наступне при використанні цієї функції:
- Підтримка клонування (
VolumePVCDataSource
) доступна лише для драйверів CSI. - Підтримка клонування доступна лише для динамічних постачальників.
- Драйвери CSI можуть чи не можуть реалізувати функціонал клонування томів.
- Ви можете клонувати тільки PVC, коли вони існують у тому ж просторі імен, що і PVC призначення (джерело та призначення повинні бути в одному просторі імен).
- Клонування підтримується з різним Storage Class.
- Призначений том може мати той самий або інший клас сховища, ніж джерело.
- Можна використовувати типовий клас сховища, і вказування storageClassName можна пропустити в специфікації.
- Клонування може бути виконане лише між двома томами, які використовують одне і те саме налаштування VolumeMode (якщо ви запитуєте том в блоковому режимі, то джерело ТАКОЖ повинно бути в блоковому режимі).
Впровадження
Клони забезпечуються так само як і інші PVC, за винятком додавання dataSource, яке посилається на поточний PVC у тому ж самому просторі імен.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: clone-of-pvc-1
namespace: myns
spec:
accessModes:
- ReadWriteOnce
storageClassName: cloning
resources:
requests:
storage: 5Gi
dataSource:
kind: PersistentVolumeClaim
name: pvc-1
Примітка:
Ви повинні вказати значення місткості дляspec.resources.requests.storage
, і значення, яке ви вказуєте, повинно бути таким самим або більшим, ніж місткість вихідного тому.Результатом є новий PVC з імʼям clone-of-pvc-1
, який має точно такий самий зміст, як і вказане джерело pvc-1
.
Використання
При доступності нового PVC клонований PVC використовується так само як і інші PVC. Також на цьому етапі очікується, що новий створений PVC є незалежним обʼєктом. Його можна використовувати, клонувати, створювати знімки чи видаляти незалежно та без врахування вихідного джерела PVC. Це також означає, що джерело ніяк не повʼязане з новим створеним клоном, його також можна модифікувати чи видалити, не впливаючи на новий клон.
11 - Обсяг сховища
Обсяг сховища обмежений і може відрізнятися залежно від вузла, на якому працює Pod: мережеве сховище, можливо, не буде доступним для всіх вузлів, або зберігання буде локальним для вузла з початку.
Kubernetes v1.24 [stable]
Ця сторінка описує, як Kubernetes відстежує обсяг сховища та як планувальник використовує цю інформацію для планування Podʼів на вузлах, які мають доступ до достатнього обсягу сховища для томів, що залишились пропущеними. Без відстеження обсягу сховища планувальник може вибрати вузол, у якого немає достатнього обсягу для виділення тому, і буде потрібно кілька повторних спроб планування.
Перш ніж ви розпочнете
Kubernetes v1.31 включає підтримку API на рівні кластера для відстеження обсягу сховища. Для використання цього ви також повинні використовувати драйвер CSI, який підтримує відстеження обсягу. Консультуйтесь з документацією драйверів CSI, які ви використовуєте, щоб дізнатися, чи ця підтримка доступна, і як її використовувати. Якщо ви не використовуєте Kubernetes v1.31, перевірте документацію для цієї версії Kubernetes.
API
Існують дві API-розширення для цієї функції:
- Обʼєкти CSIStorageCapacity: їх виробляє драйвер CSI в просторі імен, де встановлено драйвер. Кожен обʼєкт містить інформацію про обсяг для одного класу сховища і визначає, які вузли мають доступ до цього сховища.
- Поле
CSIDriverSpec.StorageCapacity
: якщо встановлено значенняtrue
, планувальник Kubernetes буде враховувати обсяг сховища для томів, які використовують драйвер CSI.
Планування
Інформація про обсяг сховища використовується планувальником Kubernetes у випадку, якщо:
- Pod використовує том, який ще не був створений,
- цей том використовує StorageClass, який посилається на драйвер CSI та використовує режим привʼязки тому
WaitForFirstConsumer
, і - обʼєкт
CSIDriver
для драйвера маєStorageCapacity
зі значеннямtrue
.
У цьому випадку планувальник розглядає тільки вузли для Podʼів, які мають достатньо вільного обсягу сховища. Ця перевірка є дуже спрощеною і порівнює тільки розмір тому з обсягом, вказаним в обʼєктах CSIStorageCapacity
з топологією, що включає вузол.
Для томів з режимом привʼязки Immediate
драйвер сховища вирішує де створити том, незалежно від Podʼів, які використовуватимуть том. Планувальник потім планує Podʼи на вузли, де том доступний після створення.
Для ефемерних томів CSI планування завжди відбувається без врахування обсягу сховища. Це ґрунтується на припущенні, що цей тип тому використовується лише спеціальними драйверами CSI, які є локальними для вузла та не потребують значних ресурсів там.
Перепланування
Коли вузол був обраний для Pod з томами WaitForFirstConsumer
, це рішення все ще є попереднім. Наступним кроком є те, що драйверу зберігання CSI буде запропоновано створити том з підказкою, що том повинен бути доступний на вибраному вузлі.
Оскільки Kubernetes може вибрати вузол на підставі застарілої інформації про обсяг, існує можливість, що том насправді не може бути створений. Вибір вузла скидається, і планувальник Kubernetes спробує знову знайти вузол для Podʼа.
Обмеження
Відстеження обсягу сховища збільшує ймовірність успішного планування з першої спроби, але не може гарантувати цього, оскільки планувальник повинен вирішувати на підставі можливо застарілої інформації. Зазвичай той самий механізм повторної спроби, що і для планування без будь-якої інформації про обсяг сховища, обробляє відмови в плануванні.
Одна ситуація, коли планування може назавжди зазнати відмови, це коли Pod використовує кілька томів: один том вже може бути створений в сегменті топології, в якому не залишилося достатньо обсягу для іншого тому. Потрібне ручне втручання для відновлення, наприклад, збільшення обсягу або видалення вже створеного тому.
Що далі
- Докладніша інформація щодо концепції дизайну доступна у Storage Capacity Constraints for Pod Scheduling KEP.
12 - Обмеження томів на вузлі
Ця сторінка описує максимальну кількість томів, які можна прикріпити до вузла для різних хмарних постачальників.
Хмарні постачальники, такі як Google, Amazon і Microsoft, зазвичай мають обмеження на те, скільки томів можна прикріпити до вузла. Важливо, щоб Kubernetes дотримувався цих обмежень. В іншому випадку Podʼи, заплановані на вузлі, можуть застрягти в очікуванні прикріплення томів.
Типові обмеження Kubernetes
У планувальнику Kubernetes є типові обмеження на кількість томів, які можна прикріпити до вузла:
Хмарний сервіс | Максимальна кількість томів на вузол |
---|---|
Amazon Elastic Block Store (EBS) | 39 |
Google Persistent Disk | 16 |
Microsoft Azure Disk Storage | 16 |
Власні обмеження
Ви можете змінити ці обмеження, встановивши значення змінної середовища KUBE_MAX_PD_VOLS
, а потім запустивши планувальник. Драйвери CSI можуть мати іншу процедуру, дивіться їх документацію щодо налаштування обмежень.
Будьте обережні, якщо ви встановлюєте ліміт, який перевищує стандартний ліміт. Зверніться до документації хмарного постачальника, щоб переконатися, що Nodes дійсно може підтримувати встановлений вами ліміт.
Обмеження застосовується до всього кластера, тому воно впливає на всі вузли.
Обмеження динамічних томів
Kubernetes v1.17 [stable]
Обмеження динамічних томів підтримуються для наступних типів.
- Amazon EBS
- Google Persistent Disk
- Azure Disk
- CSI
Для томів, керованих вбудованими втулками томів, Kubernetes автоматично визначає тип вузла і накладає відповідне максимальне обмеження кількості томів для вузла. Наприклад:
У Google Compute Engine, до вузла може бути приєднано до 127 томів, залежно від типу вузла.
Для дисків Amazon EBS на типах екземплярів M5,C5,R5,T3 та Z1D Kubernetes дозволяє приєднувати тільки 25 томів до вузла. Для інших типів інстансів на Amazon Elastic Compute Cloud (EC2), Kubernetes дозволяє приєднувати 39 томів до вузла.
На Azure до вузла може бути приєднано до 64 дисків, залежно від типу вузла. Докладніше див. Sizes for virtual machines in Azure.
Якщо драйвер сховища CSI рекламує максимальну кількість томів для вузла (використовуючи
NodeGetInfo
), kube-scheduler дотримується цього обмеження. Див. специфікації CSI для отримання додаткових деталей.Для томів, керованих вбудованими втулками, які були перенесені у драйвер CSI, максимальна кількість томів буде тією, яку повідомив драйвер CSI.
13 - Моніторинг справності томів
Kubernetes v1.21 [alpha]
Моніторинг справності томів CSI дозволяє драйверам CSI виявляти ненормальні умови тому у підлеглих систем збереження та повідомляти про них як події у PVCs або Podʼи.
Моніторинг справності томів
Моніторинг справності томів Kubernetes є частиною того, як Kubernetes реалізує Container Storage Interface (CSI). Функція моніторингу справності томів реалізована у двох компонентах: контролері зовнішнього монітора справності та kubelet.
Якщо драйвер CSI підтримує функцію моніторингу справності томів зі сторони контролера, подія буде повідомлена у відповідний PersistentVolumeClaim (PVC) при виявленні ненормальної умови тому CSI.
Зовнішній контролер монітора справності також слідкує за подіями відмови вузла. Ви можете увімкнути моніторинг відмови вузла, встановивши прапорець enable-node-watcher
в значення true. Коли зовнішній монітор справності виявляє подію відмови вузла, контролер повідомляє про подію PVC, щоб вказати, що Podʼи, які використовують цей PVC, розташовані на несправних вузлах.
Якщо драйвер CSI підтримує функцію моніторингу справності томів зі сторони вузла, подія буде повідомлена на кожному Pod, який використовує PVC, при виявленні ненормальної умови тому CSI. Крім того, інформація про справність томів викладена у вигляді метрик Kubelet VolumeStats. Додано нову метрику kubelet_volume_stats_health_status_abnormal. Ця метрика має дві мітки: namespace
та persistentvolumeclaim
. Лічильник приймає значення 1 або 0. 1 вказує на те, що том є несправним, 0 вказує на те, що том — справний. Докладніше див. у KEP.
Примітка:
Вам потрібно увімкнути функціональну можливістьCSIVolumeHealth
для використання цієї функції зі сторони вузла.Що далі
Див. документацію драйвера CSI, щоб дізнатися, які драйвери CSI реалізували цю функцію.
14 - Зберігання у Windows
Ця сторінка надає огляд зберігання, специфічного для операційної системи Windows.
Постійне зберігання
У Windows є багатошаровий файловий драйвер для монтування контейнерних шарів і створення копії файлової системи на основі NTFS. Всі шляхи файлів у контейнері вирішуються лише в межах контексту цього контейнера.
- З Docker точки монтування томів можуть націлюватися лише на каталог у контейнері, а не на окремий файл. Це обмеження не стосується containerd.
- Томи не можуть проєцювати файли або каталоги на файлову систему хосту.
- Файлові системи тільки-читання не підтримуються, оскільки завжди потрібен доступ для запису до реєстру Windows та бази даних SAM. Однак томи тільки-читання підтримуються.
- Маски користувача і дозволи для томів недоступні. Оскільки SAM не спільний між хостом і контейнером, немає зіставлення між ними. Всі дозволи вирішуються в межах контексту контейнера.
В результаті на вузлах Windows не підтримуються наступні можливості зберігання:
- Монтування томів за підкаталогами: у Windows контейнер може монтувати лише весь том
- Монтування томів за підкаталогами для секретів
- Проєцювання монтування хосту
- Коренева файлова система тільки-читання (зіставлені томи все ще підтримують
readOnly
) - Зіставлення блокового пристрою
- Памʼять як носій зберігання (наприклад,
emptyDir.medium
встановлено наMemory
) - Функції файлової системи, такі як uid/gid; дозволи Linux файлової системи для кожного користувача
- Встановлення дозволів секрета з DefaultMode (залежність від UID/GID)
- Підтримка зберігання/томів на основі NFS
- Розширення змонтованого тому (resizefs)
Томи Kubernetes дозволяють розгортання складних застосунків, які вимагають постійності даних та вимог до спільного використання томів Pod, розгорнутих у Kubernetes. Управління постійними томами, повʼязаними із конкретним сховищем або протоколом, включає дії, такі як надання/відміна надання/зміна розміру томів, приєднання/відʼєднання тому від/до вузла Kubernetes та монтування/відмонтування тому від/до окремих контейнерів у Podʼі, які повинні зберігати дані.
Компоненти управління томами постачаються як втулок томів Kubernetes. У Windows підтримуються наступні широкі класи втулків томів Kubernetes:
- Втулки FlexVolume
- Зауважте, що FlexVolume були застарілі з версії 1.23
- Втулки CSI
Вбудовані втулки томів
На вузлах Windows підтримуються наступні вбудовані втулки, які підтримують постійне зберігання: