Рубрики
Uncategorized

Изучение объемов Kubernetes

Запуск рабочих нагрузок Stateful внутри Kubernetes отличается от управления службами без сохранения состояния. Причина … с меткой Kubernetes, новичков, DevOps.

Запуск рабочих нагрузок 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»