В Kubernetes контейнеры могут иметь короткий жизненный цикл, часто создаваться и уничтожаться. Когда контейнер завершается, все данные, сохраненные в контейнере, также удаляются. Это может быть проблематично, когда требуется постоянство данных.

Чтобы решить эту проблему, Kubernetes представил концепцию томов.

В этом первом посте мы познакомим вас с основами томов Kubernetes, включая простые типы томов, такие как EmptyDir, HostPath и NFS.

Что такое Объемы?

Тома — это общие каталоги в поде, к которым могут обращаться несколько контейнеров. Они определяются внутри модуля, а затем монтируются в определенные файловые каталоги в каждом контейнере.

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

Типы томов

Kubernetes поддерживает различные типы томов, в том числе:

  • EmptyDir: временный том, который создается, когда модуль назначается узлу, и удаляется при удалении модуля.
  • HostPath: том, который монтирует файл или каталог из файловой системы хост-узла в модуль.
  • NFS: сетевая файловая система, позволяющая модулю монтировать общий сетевой диск как том.
  • ConfigMap: Volume, который используется для предоставления данных конфигурации Pod.
  • Секрет: том, который используется для хранения конфиденциальных данных, таких как пароли или токены.

Давайте начнем!

Введение в EmptyDir

EmptyDir — это базовый тип Volume в Kubernetes, предоставляющий пустой каталог для временного хранения.

Он создается, когда модуль назначается узлу, и к нему могут получить доступ все контейнеры в модуле.

Тома EmptyDir полезны для сценариев, когда контейнеру необходимо записывать временные данные в течение всего срока службы пода, и данные не нужно сохранять при перезапусках пода.

Тома EmptyDir также можно использовать для обмена данными между контейнерами в поде. Это полезно, когда нескольким контейнерам необходимо получить доступ к общему фрагменту данных или взаимодействовать друг с другом. Том EmptyDir монтируется по одному и тому же пути в каждом контейнере, и любые изменения, сделанные одним контейнером, видны всем другим контейнерам, которые совместно используют этот том.

Как использовать EmptyDir в Kubernetes?

Чтобы использовать том EmptyDir, вам необходимо определить его в спецификации пода. Вот пример YAML-определения пода, содержащего том EmptyDir:

apiVersion: v1
kind: Pod
metadata:
  name: multicontainer-pod
spec:
  containers:
  - name: producer
    image: busybox
    command: ["sh", "-c", "while true; do echo $(hostname) $(date) >> /var/log/index.html; sleep 10; done"]
    volumeMounts:
    - name: webcontent
      mountPath: /var/log
  - name: consumer
    image: nginx
    ports:
      - containerPort: 80
    volumeMounts:
    - name: webcontent
      mountPath: /usr/share/nginx/html
  volumes:
  - name: webcontent
    emptyDir: {}

В этом примере первый контейнер, producer, использует образ BusyBox и запускает команду, которая записывает имя хоста и дату в файл журнала, расположенный по адресу /var/log/index.html, каждые 10 секунд. Он также монтирует том webcontent EmptyDir в каталоге /var/log для записи файла журнала.

Второй контейнер, consumer, использует образ Nginx и предоставляет порт 80 для обслуживания веб-контента. Он монтирует том webcontent EmptyDir в /usr/share/nginx/html для чтения файла журнала, созданного контейнером producer.

Создайте под:

$ kubectl apply -f multicontainer-pod.yaml

Проверьте журналы контейнера производителя, чтобы убедиться, что он записывает данные журнала в общий том:

$ kubectl logs multicontainer-pod -c producer

Перенаправьте контейнер Nginx на локальный порт:

$ kubectl port-forward multicontainer-pod 8080:80

Убедитесь, что данные журнала, записанные контейнером производителя, отображаются на веб-странице:

$ curl http://localhost:8080

Таким образом, в этом примере контейнер producer является средством записи, а контейнер consumer является средством чтения одного и того же тома EmptyDir. producer записывает данные журнала в общий том, а consumer читает их для отображения на веб-сервере Nginx.

В целом тома EmptyDir обеспечивают простой и эффективный способ обмена данными между контейнерами в поде или хранения временных данных в течение всего срока службы пода.

Введение в HostPath

Хотя EmptyDir — это базовый тип тома, который можно использовать для временного хранения, он не подходит для хранения данных, которые должны сохраняться после удаления модуля. Вот тут-то и пригодятся HostPath томов.

HostPath — это тип тома Kubernetes, который монтирует каталог или файл из файловой системы хост-узла в ваш под. Это позволяет вашим контейнерам считывать и записывать данные в смонтированный каталог на узле хоста, гарантируя, что данные сохранятся даже после удаления модуля.

Как использовать HostPath в Kubernetes?

Чтобы использовать HostPath в Kubernetes, вам сначала нужно указать том в файле YAML вашего пода. Например, чтобы подключить каталог на хост-узле к вашему поду, вы можете использовать следующую конфигурацию:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    volumeMounts:
    - name: my-volume
      mountPath: /my-directory
  volumes:
  - name: my-volume
    hostPath:
      path: /host/directory

В этом примере мы создаем под с одним контейнером, который монтирует каталог /host/directory на хост-узле в файловую систему контейнера по пути /my-directory.

Когда использовать HostPath в Kubernetes

Хотя HostPath является полезным типом тома для хранения данных, важно использовать его с осторожностью. Поскольку данные хранятся в файловой системе хост-узла, к ним могут получить доступ другие процессы на том же узле, что потенциально может поставить под угрозу безопасность вашего приложения.

Кроме того, поскольку Pod может быть запланирован на любом узле в кластере, нет гарантии, что те же данные будут доступны, если Pod переназначен на другой узел.

Поэтому рекомендуется использовать тома HostPath только в случае крайней необходимости и гарантировать, что монтируемый каталог защищен и доступен только для соответствующих процессов.

Введение в NFS

В предыдущем разделе мы обсуждали, как HostPath может предоставить простое решение для сохранения данных в Kubernetes. Однако, если узел выходит из строя и необходимо перепланировать модуль на другом узле, HostPath может не подойти.

В таких случаях можно использовать сетевые системы хранения, такие как NFS и CIFS. NFS (сетевая файловая система) — это популярная сетевая система хранения, которую можно использовать для предоставления общего хранилища модулям в кластере Kubernetes.

Настройка NFS-сервера

Чтобы начать работу с NFS, нам нужно настроить сервер NFS. В этом примере мы настроим сервер NFS на самом главном узле.

  1. Установите сервер NFS на главном узле:
sudo apt-get update
sudo apt-get install -y nfs-kernel-server

2. Создайте общий каталог:

sudo mkdir /mnt/nfs_share
sudo chmod -R 777 /mnt/nfs_share

3. Добавьте следующую строку в файл /etc/exports, чтобы сделать каталог доступным для всех узлов в кластере:

/mnt/nfs_share *(rw,sync,no_subtree_check)

4. Перезапустите NFS-сервер:

sudo systemctl restart nfs-kernel-server

Настройка тома NFS в Kubernetes

После настройки сервера NFS мы можем создать том NFS и использовать его в наших модулях Kubernetes. Вот пример того, как настроить том NFS:

  1. Создайте файл YAML volume-nfs.yaml со следующим содержимым:
apiVersion: v1
kind: Pod
metadata:
  name: nfs-pod
spec:
  containers:
  - name: nfs-container
    image: busybox
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo $(hostname) $(date) >> /mnt/data/out.txt; sleep 10; done"]
    volumeMounts:
    - name: nfs-volume
      mountPath: /mnt/data
  volumes:
  - name: nfs-volume
    nfs:
      server: <nfs-server-ip>
      path: /mnt/nfs_share

Замените <nfs-server-ip> на IP-адрес вашего сервера NFS.

2. Создайте модуль:

kubectl apply -f volume-nfs.yaml

3. Проверьте содержимое общего каталога сервера NFS:

ls /mnt/nfs_share

Вы должны увидеть новый файл с именем out.txt, который содержит журналы, сгенерированные модулем.

До сих пор мы узнали, как настроить сервер NFS и использовать его для предоставления общего хранилища модулям в кластере Kubernetes. NFS — это мощный инструмент, который может помочь нам преодолеть некоторые ограничения HostPath и предоставить более надежное решение для сохранения данных.

В следующем посте мы обсудим более продвинутые типы томов, такие как PersistentVolume (PV), PersistentVolumeClaim (PVC), ConfigMap и Secret.

Подробнее о руководстве для начинающих по Kubernetes:

  1. Понимание Kubernetes — руководство для начинающих

Обновление…