Запуск рабочих нагрузок Stateful внутри Kubernetes отличается от управления службами без сохранения состояния. Причина в том, что контейнеры и стручки могут быть созданы и уничтожены в любое время. Если какой -либо из узлов кластера уходит вниз или появится новый узел, Kubernetes необходимо перенести стручки.
Если вы запустили рабочую нагрузку Stateful или базу данных так же, как вы запускаете службу без сохранения состояния, все ваши данные исчезли бы в первый раз, когда ваши стручки перезагружаются.
Поэтому вам нужно хранить данные за пределами контейнера. Хранение данных снаружи гарантирует, что с ним ничего не происходит, когда контейнер перезагружается.
Тома Абстракция в Kubernetes решает проблему хранения данных вне задачи контейнеров. Том живет до тех пор, пока живет капсул. Если какой -либо из контейнеров в стручке перезапускается, том сохраняет данные. Однако, как только вы удалите стручок, объем также удаляется.
Том — это просто папка, которая может иметь или не иметь никаких данных в нем. Папка доступна для всех контейнеров в стручке. Как создается эта папка, и хранилище поддержки определяется типом громкости.
Самым основным типом тома является пустой каталог ( EmptyDir
). Когда вы создаете громкость с emptydir
Тип, Kubernetes создает его, когда он назначает стручок на узел. Объем существует до тех пор, пока стручка работает. Как следует из названия, он изначально пуст, но контейнеры могут писать и читать из тома. Как только вы удалите стручок, Kubernetes также удаляет громкость.
Есть две части для использования объемов. Первый — это определение громкости. Вы можете определить объемы в спецификации POD, указав имя тома и тип ( EmptyDir
в нашем случае). Вторая часть монтажа тома внутри контейнеров, используя volumeMounts
ключ. В каждом стручке вы можете использовать несколько разных объемов одновременно.
Внутри монтажа тома мы ссылаемся на том по имени (
Проверьте Начало работы с Kubernetes Чтобы настроить свой кластер и пройти через примеры в этом посте.
apiVersion: v1 kind: Pod metadata: name: empty-dir-pod spec: containers: - name: alpine image: alpine args: - sleep - "120" volumeMounts: - name: pod-storage mountPath: /data/ volumes: - name: pod-storage emptyDir: {}
Сохранить вышеупомянутый YAML в пусто-дир-под.yaml
и бежать kubectl Apply -f empty -dir.pod.yaml
Чтобы создать стручок.
Далее мы собираемся использовать kubectl Exec
команда, чтобы получить терминал внутри контейнера:
$ kubectl exec -it empty-dir-pod -- /bin/sh / # ls bin dev home media opt root sbin sys usr data etc lib mnt proc run srv tmp var
Если вы бежите ls
Внутри контейнера вы заметите данные
папка. данные
Папка установлена из Строительство POD
Том определяется в YAML.
Давайте создадим фиктивный файл внутри данные
Папка и подождите, пока контейнер перезапустит (через 2 минуты), чтобы доказать, что данные внутри данные
Папка остается рядом.
Изнутри контейнера создайте hello.txt
Файл под данные
папка:
echo "hello" >> data/hello.txt
Вы можете ввести Выход
Чтобы выйти из контейнера. Если вы подождите 2 минуты, контейнер автоматически перезагрузит. Чтобы посмотреть перезапуск контейнера, запустите kubectl Get po -w
Команда из отдельного окна терминала.
После перезапуска контейнера вы можете проверить, что файл данные/hello.txt
все еще в контейнере:
$ kubectl exec -it empty-dir-pod -- /bin/sh / # ls data/hello.txt data/hello.txt / # cat data/hello.txt hello / #
Kubernetes хранит данные на хосте под /var/lib/kubelet/pods
папка. Эта папка содержит список идентификаторов стручков, и внутри каждой из этих папок находится тома
. Например, вот как вы можете получить идентификатор POD:
$ kubectl get po empty-dir-pod -o yaml | grep uid uid: 683533c0-34e1-4888-9b5f-4745bb6edced
Вооружен идентификатором капсула, вы можете запустить minikube ssh
Чтобы получить терминал внутри хоста Minikube, используется для запуска Kubernetes. Оказавшись внутри хоста, вы можете найти hello.txt
В следующей папке:
$ sudo cat /var/lib/kubelet/pods/683533c0-34e1-4888-9b5f-4745bb6edced/volumes/kubernetes.io~empty-dir/pod-storage/hello.txt hello
Если вы используете Docker Desktop , вы можете запустить привилегированный контейнер и использовать nsenter
Запустите оболочку во всех именах пространства процесса с идентификатором 1:
$ docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh / #
Как только вы получите терминал, процесс будет одинаковым — перейдите к /var/lib/kubelet/pods
Папка и найдите hello.txt
Так же, как и если бы вы использовали Minikube.
Kubernetes поддерживает большое количество других типов томов. Некоторые из типов общие, такие как emtpydir
или Hostpath
(используется для монтажных папок из файловой системы узлов). Другие типы либо используются для Облачное хранилище (например, azurefile
, Awselasticblockstore
, или GcepersistentDisk
), сетевое хранилище ( cephfs
, ,
CSI
, Слокер
, …), или для монтажа ресурсов Kubernetes в стручках ( configmap
, Секрет
)
Наконец, другим конкретным типом объемов являются постоянные объемы и постоянные требования объема.
Отсутствие слова «устойчивое» при разговоре о других томах может вводить в заблуждение. Если вы используете какие-либо типы громкости хранилища облака ( Azurefile
или Awselasticblockstore
), данные все еще будут сохраняться. Постоянные претензии по объему и постоянное объем являются лишь способом абстрагировать, как Kubernetes обеспечивает хранилище.
Для полного и актуального списка всех типов томов, проверьте Kubernetes Docs Анкет
Оригинал: «https://dev.to/peterj/exploring-kubernetes-volumes-1nla»