Поиск по сайту:

Хранилище в Kubernetes


На этой странице

  1. Предварительные условия
  2. Что будем делать?
  3. Создайте модуль с установленным в нем томом разных типов.
    1. Том пути к хосту с типом: Каталог.
    2. Том пути к хосту с типом: DirectoryOrCreate.
    3. том пустого каталога

    Данные не могут храниться в модуле. Когда модуль удаляется или закрывается, данные в нем не остаются в системе. Чтобы обеспечить долгосрочное и временное хранилище для модулей в кластере, Kubernetes предоставляет различные типы механизмов хранения.

    В этой статье мы увидим примеры только 2 типов механизмов хранения.

    1. hostPath.
      Том hostPath монтирует файл или каталог из файловой системы хост-узлов в ваш модуль. Этот тип тома можно использовать, чтобы позволить поду указать, должен ли данный hostPath существовать до запуска пода или он должен быть создан. Этот тип тома не нужен большинству модулей. Тип DirectoryOrCreate создаст пустой каталог, если он не существует, с разрешением, установленным на 0755, а тип каталога помогает убедиться, что каталог существует по заданному пути до создания этого модуля.
    2. emptyDir.
      Том emptyDir сначала создается, когда модуль назначается узлу, и существует до тех пор, пока этот модуль работает на этом узле. По умолчанию тома emptyDir хранятся в том типе хранилища, который есть в нашей среде. Мы также можем установить для поля emptyDir.medium значение «Память», чтобы указать Kubernetes смонтировать файловую систему с поддержкой оперативной памяти

    Чтобы узнать о других механизмах хранения в Kubernetes, нажмите здесь.

    Предпосылки

    1. Кластер Kubernetes по крайней мере с 1 рабочим узлом.
      Если вы хотите научиться создавать кластер Kubernetes, нажмите здесь. Это руководство поможет вам создать кластер Kubernetes с 1 мастером и 2 узлами на экземплярах AWS Ubuntu 18.04 EC2.

    Что мы будем делать?

    1. Создайте модуль с установленными в нем томами разных типов.

    Создайте модуль с установленным в нем томом разных типов.

    Том пути к хосту с типом: каталог.

    Создайте файл определения объекта для монтирования существующего каталога в модуле.

    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 может помочь нам смонтировать каталог, который не существует на рабочем узле/хосте.