Хранилище в Kubernetes
На этой странице
- Предварительные условия
- Что будем делать?
- Создайте модуль с установленным в нем томом разных типов.
- Том пути к хосту с типом: Каталог.
- Том пути к хосту с типом: DirectoryOrCreate.
- том пустого каталога
Данные не могут храниться в модуле. Когда модуль удаляется или закрывается, данные в нем не остаются в системе. Чтобы обеспечить долгосрочное и временное хранилище для модулей в кластере, Kubernetes предоставляет различные типы механизмов хранения.
В этой статье мы увидим примеры только 2 типов механизмов хранения.
- hostPath.
Том hostPath монтирует файл или каталог из файловой системы хост-узлов в ваш модуль. Этот тип тома можно использовать, чтобы позволить поду указать, должен ли данный hostPath существовать до запуска пода или он должен быть создан. Этот тип тома не нужен большинству модулей. Тип DirectoryOrCreate создаст пустой каталог, если он не существует, с разрешением, установленным на 0755, а тип каталога помогает убедиться, что каталог существует по заданному пути до создания этого модуля. - emptyDir.
Том emptyDir сначала создается, когда модуль назначается узлу, и существует до тех пор, пока этот модуль работает на этом узле. По умолчанию тома emptyDir хранятся в том типе хранилища, который есть в нашей среде. Мы также можем установить для поля emptyDir.medium значение «Память», чтобы указать Kubernetes смонтировать файловую систему с поддержкой оперативной памяти
Чтобы узнать о других механизмах хранения в Kubernetes, нажмите здесь.
Предпосылки
- Кластер Kubernetes по крайней мере с 1 рабочим узлом.
Если вы хотите научиться создавать кластер Kubernetes, нажмите здесь. Это руководство поможет вам создать кластер Kubernetes с 1 мастером и 2 узлами на экземплярах AWS Ubuntu 18.04 EC2.
Что мы будем делать?
- Создайте модуль с установленными в нем томами разных типов.
Создайте модуль с установленным в нем томом разных типов.
Том пути к хосту с типом: каталог.
Создайте файл определения объекта для монтирования существующего каталога в модуле.
vim volume-hostpath-1.yml
apiVersion: v1 kind: Pod metadata: name: volume-hostpath-example-1 spec: containers: - image: nginx name: my-container volumeMounts: - mountPath: /opt/mounted-here name: my-volume-1 volumes: - name: my-volume-1 hostPath: path: /dir type: Directory
Получите список модулей и создайте модуль, который будет монтироваться \/opt/mounted-here\ внутри модуля на \/dir\ с хоста.
kubectl get pods
kubectl create -f volume-hostpath-1.yml
kubectl get pods
kubectl describe pod volume-hostpath-example-1
Теперь, если вы опишете модуль, вы увидите, что создание модуля не удалось. Установка не удалась, так как каталог \/dir\ не существует на хосте. Чтобы смонтировать том в модуле с \типом: Каталог\, каталог хоста должен существовать.
Теперь давайте создадим каталог \/dir\ на хосте, то есть на рабочем узле.
sudo mkdir /dir
Создав каталог на рабочих узлах, мы можем удалить ранее созданный модуль и попытаться воссоздать новый модуль.
kubectl delete -f volume-hostpath-1.yml
kubectl create -f volume-hostpath-1.yml
kubectl get pods
kubectl describe pod volume-hostpath-example-1
На этот раз вы можете видеть, что модуль был успешно создан, и под томами можно увидеть смонтированный путь \/dir\.
Теперь давайте войдем в модуль и создадим файл.
kubectl get pods
kubectl exec -it volume-hostpath-example-1 /bin/bash
touch /opt/mounted-here/new-file
Файл, который мы создали в модуле, теперь можно увидеть с рабочего узла в смонтированном каталоге \/dir\
ll /dir/ #Execute this command on the worker node
На этот раз давайте удалим созданный нами модуль и посмотрим, существует ли файл в каталоге хоста \/dir\ или нет.
exit
kubectl get pods
kubectl delete pod volume-hostpath-example-1
Перечислите файлы в \/dir\ на рабочем узле.
ll /dir/ #Execute this command on the worker node
Мы видим, что даже после удаления модуля файл все еще существует в \/dir\ на рабочем узле. Это означает, что данные сохраняются даже после удаления или закрытия модуля.
В этом примере мы заметили, что каталог хоста, который необходимо смонтировать в порту, должен существовать.
Том пути хоста с типом: DirectoryOrCreate.
Чтобы убедиться, что каталог хоста доступен перед монтированием, мы можем использовать \type: DirectoryOrCreate\ вместо \type: Directory\ в томе hostpath.
Создайте новый файл с типом \type: DirectoryOrCreate\.
vim volume-hostpath-2.yml
apiVersion: v1 kind: Pod metadata: name: volume-hostpath-example-2 spec: containers: - image: nginx name: my-container volumeMounts: - mountPath: /opt/mounted-here name: my-volume-2 volumes: - name: my-volume-2 hostPath: # directory location on host path: /mount-this type: DirectoryOrCreate
Получите список существующих модулей и создайте новый модуль с файлом, созданным в указанном выше состоянии.
kubectl get pods
kubectl create -f volume-hostpath-2.yml
kubectl get pods
kubectl describe pod volume-hostpath-example-2
Когда мы описываем pod, видно, что pod успешно создан. А каталог \/mount-this\, которого нет на хосте/рабочем узле, был создан на хосте при его монтировании в томе.
Перейдите к рабочим узлам и проверьте, был ли создан каталог или нет.
ll /mount-this/ #Execute this command on the worker node
Теперь создайте новый файл на рабочих узлах в каталоге \/mount-this\, который смонтирован в модуле.
sudo touch /mount-this/created-on-host #Execute this command on the worker node
Давайте войдем в модуль и проверим каталог \/opt/mounted-here/\, чтобы узнать, существует ли в модуле файл \/mount-this/created-on-host\, который мы создали на рабочем узле.
kubectl get pods
kubectl exec -it volume-hostpath-example-2 /bin/bash
ls -l /opt/mounted-here/
Теперь удалите модуль и проверьте, существует ли файл на рабочем узле по адресу \/mount-this/\
exit
kubectl get pods
kubectl delete pod volume-hostpath-example-2
Выполните следующую команду, чтобы получить список файлов на рабочем узле в \/mount-this/\
sudo ls -lt /mount-this/ #Execute this command on the worker node
В этом примере мы увидели, что даже если каталог хоста не существует, он создается на хост-компьютере до того, как он будет смонтирован в поде.
том пустого каталога
Создайте файл определения объекта, используя следующее.
vim volume-emptydir.yml
apiVersion: v1 kind: Pod metadata: name: volume-emptydir-example spec: containers: - image: nginx name: my-container volumeMounts: - mountPath: /opt/this name: my-volume-3 volumes: - name: my-volume-3 emptyDir: {}
Получите список модулей и создайте новый модуль для подключения тома с типом \emptyDir\.
kubectl get pods
kubectl create -f volume-emptydir.yml #Create an object using the file
kubectl get pods
kubectl describe pod volume-emptydir-example #Get details of the specified pod
На приведенном выше снимке экрана видно, что модуль создан и том доступен.
Теперь войдите в модуль и создайте каталог по пути монтирования \/opt/this\. На этот раз у нас нет тома от хоста.
kubectl exec -it volume-emptydir-example /bin/bash #Login into the Pod
Теперь мы можем удалить модуль, если он больше не нужен.
kubectl get pods #Get a list of Pods
kubectl delete pod volume-emptydir-example #Delete the specified pod
Заключение
В этой статье мы рассмотрели шаги и примеры файлов для создания модулей с томом типа hostPath и emptyDir. Мы видели, как \type:DirectoryOrCreate\ под типом тома hostPath может помочь нам смонтировать каталог, который не существует на рабочем узле/хосте.