В 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 на самом главном узле.
- Установите сервер 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:
- Создайте файл 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:
Обновление…