Хранилище — это общая потребность приложений. Они нужны для хранения файлов журналов, файлов конфигурации, артефактов, мультимедиа и многого другого. Когда приложения запускаются на веб-сервере, они используют дисковое пространство на сервере для хранения этих файлов. Однако, когда они запускаются в контейнере, распределение дискового пространства не так просто. Есть несколько соображений при создании стратегии для контейнерных объемов:
- Файлы на диске в контейнере могут быть эфемерными.
- Контейнер перезапускается, теряя все файлы, которые у него есть.
- Файлы необходимы для совместного использования между контейнерами.
- Файлы могут быть необходимы по истечении срока службы стручков.
Одним из преимуществ использования Kubernetes для управления контейнерами является то, что он предоставляет несколько вариантов для удовлетворения различных потребностей в хранении.
тома
Том Kubernetes — это каталог на диске, поддерживаемый некоторыми носителями. Этот том доступен для всех контейнеров, работающих внутри контейнера. В спецификации Pod указывается, какой тип тома должен быть подготовлен и где его монтировать. Тип тома указывается путем выбора одного из множества типов томов, которые предоставляет Kubernetes. Вот некоторые из них:
- AWS EBS
- Azure Disk
- Ceph файловая система
- ConfigMap
- emptyDir
- местный
- NFS
- persistentVolumeClaim
- секрет
emptyDir
Этот тип тома создается, когда Pod запланирован на узле. Этот объем только для жизни стручка. Он удаляется, как только модуль завершается. Все контейнеры внутри Pod разделяют этот объем. Вариант использования для такого тома может заключаться в том, чтобы использовать его как временное пространство для внутренней работы приложений или использовать в качестве кэша для повышения производительности приложений. Смотрите ниже спецификации стручка:
YAML
1
apiVersion v1
2
kind Pod
3
metadata
4
name my-server
5
spec
6
containers
7
image nginx
8
name my-server
9
volumeMounts
10
mountPath /testcache
11
name cache-volume
12
volumes
13
name cache-volume
14
emptyDir
15
medium Memory
AWS EBS, Azure Disk и GCE Persistent Disk
AWS / AKS / GKE и другие облачные провайдеры предоставляют хранилище для использования их управляемыми сервисами Kubernetes. Рассмотрим следующий пример, в котором спецификация Pod использует диск Azure:
YAML
1
apiVersion v1
2
kind Pod
3
metadata
4
name azure-volume
5
spec
6
containers
7
image httpd
8
name azure-volume
9
volumeMounts
10
name azureVolume
11
mountPath /mnt/azure
12
volumes
13
name azure
14
azureDisk
15
diskName my-test.vhd
16
diskURI https //my.blob.com/vhd/my-test.vhd
В приведенной выше спецификации,
-
diskName
: Имя объекта блоба VHD -
diskURI
: URI двоичного объекта VHD
Постоянный объем
Все спецификации стручков, которые мы видели, упоминают тип тома, который будет использоваться этим стручком. Это тесно связывает вид объема со стручком. Тем не менее, иногда лучше не указывать явно тип тома, а просто предоставлять различные хранилища, и модули будут использовать хранилище, которое подходит им лучше всего. Это обрабатывается с помощью утверждения «Постоянный том» и «Постоянный том».
Постоянный том (PV) представляет собой хранилище, предоставленное вами. Это ресурс в кластере Kubernetes, и его время жизни больше, чем у блоков в кластере.
Заявка на постоянный объем (PVC) — это спецификация, которая запрашивает хранилище, которое будет использовать Pod.
Следовательно, PV — это ресурс хранения, а PVC — это запрос на этот ресурс.
- Во-первых, вы предоставляете PV данные о фактическом хранении.
- Затем вы создаете спецификацию PVC, в которой есть детали запроса на хранение.
- Цикл управления Kubernetes пытается связать PVC с любым совпадающим PV.
- Kubernetes тогда устанавливает связанный объем к Стручку.
- Когда пользователь больше не нуждается в томе, он может удалить PVC. В спецификации PV упоминается политика восстановления, которая сообщает кластеру, что делать после освобождения тома.
Спецификация PV выглядит следующим образом:
YAML
x
1
apiVersion v1
2
kind PersistentVolume
3
metadata
4
name my-pv
5
spec
6
capacity
7
storage 10Gi
8
volumeMode Filesystem
9
accessModes
10
ReadWriteOnce
11
persistentVolumeReclaimPolicy Recycle
12
storageClassName any-name
13
nfs
14
path /test
15
server10.0.0.0
16
-
capacity
: указывает размер тома. -
volumeMode
: использовать файловую систему для использования файловой системы или блока для блочного устройства. -
accessMode
: это может бытьReadWriteOnce
,ReadOnlyMany
илиReadWriteMany
-
reclaimPolicy
: Это может быть «Сохранить», «Восстановить» или «Удалить».
Примените вышеуказанную спецификацию PV:
xxxxxxxxxx
1
$ kubectl apply -f my-pv.yaml
Спецификация ПВХ выглядит следующим образом:
YAML
xxxxxxxxxx
1
apiVersion v1
2
kind PersistentVolumeClaim
3
metadata
4
name my-pvc
5
spec
6
accessModes
7
ReadWriteOnce
8
volumeMode Filesystem
9
resources
10
requests
11
storage 10Gi
12
storageClassName any-name
Примените вышеуказанную спецификацию ПВХ:
Оболочка
xxxxxxxxxx
1
$ kubectl apply -f my-pvc.yaml
Теперь мы можем использовать эту спецификацию Pod следующим образом:
YAML
xxxxxxxxxx
1
apiVersion v1
2
kind Pod
3
metadata
4
name pod-with-volume
5
spec
6
containers
7
image nginx
8
name pod-with-volume
9
volumeMounts
10
mountPath /data
11
name my-volume
12
volumes
13
name my-volume
14
persistentVolumeClaim
15
claimName my-pvc
моментальные снимки
Для включения моментальных снимков тома kubernetes предоставляет VolumeSnapshotContent
и VolumeSnapshot
ресурсы.
A VolumeSnapshotContent
- это моментальный снимок содержимого тома, а VolumeSnapshot
запрос на моментальный снимок. Так же, как ПВХ связан с PV, так и VolumeSnapshot
связан с VolumeSnapshotContent
. Вот примерная спецификация обоих:
YAML
xxxxxxxxxx
1
apiVersion snapshot.storage.k8s.io/v1beta1
2
kind VolumeSnapshot
3
metadata
4
name my-vol-snapshot
5
spec
6
source
7
volumeSnapshotContentName my-snapshot-content
YAML
xxxxxxxxxx
1
apiVersion snapshot.storage.k8s.io/v1beta1
2
kind VolumeSnapshotContent
3
metadata
4
name my-snapshot-content
5
spec
6
deletionPolicy Delete
7
driver hostpath.csi.k8s.io
8
source
9
snapshotHandle 8qgh0te3-nleb-63h8-g6ae-734rac76hu01
10
volumeSnapshotRef
11
name my-vol-snapshot
12
namespace default
Динамические тома
До сих пор мы создавали тома вручную, но в управляемой среде настоятельно рекомендуется иметь возможность создавать тома по требованию. Kubernetes предоставляет динамические тома, которые устраняют необходимость предварительной подготовки томов. Чтобы включить динамические тома, мы должны использовать ресурс Kubernetes, известный как StorageClass
. Этот объект указывает, какой поставщик хранилища должен использоваться, и связанные параметры. Например, чтобы использовать SSD-диск, предоставленный Google Kubernetes Engine, создайте следующее StorageClass
:
YAML
xxxxxxxxxx
1
apiVersion storage.k8s.io/v1
2
kind StorageClass
3
metadata
4
name my-class
5
provisioner kubernetes.io/gce-pd
6
parameters
7
type pd-ssd
Теперь создайте, PersistentVolumeClaim
который использует это StorageClass
YAML
xxxxxxxxxx
1
apiVersion v1
2
kind PersistentVolumeClaim
3
metadata
4
name my-pvc
5
spec
6
accessModes
7
ReadWriteOnce
8
storageClassName my-class
9
resources
10
requests
11
storage 30Gi
Это автоматически обеспечивает SSD как постоянный диск.
Резюме
- Kubernetes Volumes предлагает хранение, которое является постоянным и длится дольше, чем срок службы контейнера или даже контейнера.
- Чтобы отделить объемные типы со спецификацией pod, используйте PVC и PV.
- Для динамического предоставления томов используйте StorageClass.
В этом посте описаны все вышеперечисленные функции с почти реальными образцами Kubernetes, и они могут быть легко использованы в ваших проектах.