Сторадж система longhorn в kubernetes

5
(1)

В k8s существуют разные варианты для подключения дисков, сегодня рассмотрим сторадж систему longhorn, под капотом работает с блочными дисками по протоколу (его реализацию в linux) iscsi. Позволяет автоматически реплецировать данные на другие тома. Более подробно в официальной документации.

Начнем с установки нужных пакетов на наши рабочие ноды, у меня их всего две. Во-первых хочется выделить отдельной дисковое пространство под хранение данных, я использовал Vagrant для создания VM, так выглядит картина по дискам.

Уже есть том ubuntu-vg, он создается автоматически при запуске VM через vagrant, при желании можно увеличить размер и так далее, но я использовал дефолт, все это описано в статья по развертыванию k8s кластера.

Создадим логический том на 15Гб, «накатим» туда файловую систему и смонтируем.

Bash
lvcreate -L 15G -n longhorn-data ubuntu-vg
mkfs.ext4 /dev/ubuntu-vg/longhorn-data
mkdir /longhorn-data
mount /dev/ubuntu-vg/longhorn-data /longhorn-data/
cat /etc/mtab |tail -n1 >> /etc/fstab

Отлично, логический volume готов.

У longhorn есть утилита командной строки для проверки нод на наличие зависимостей, нужных longhorn. Давайте ее скачаем и воспользуемся ей. Скачивать следует на машину, откуда доступна работа с кластером через kubectl.

Bash
curl -sSfL -o longhornctl https://github.com/longhorn/cli/releases/download/v1.7.2-rc2/longhornctl-linux-amd64
chmod +x longhornctl
$ KUBECONFIG=/home/andrei/local_k8s.conf ./longhornctl check preflight

У меня вывод показал ошибку о том, что не загружен модуль ядра dm_crypt, он является частью подсистемы Device Mapper в ядре Linux и используется для обеспечения прозрачного шифрования дисков. Для начала проверим, что модуль доступен в ядре:

Bash
ls /lib/modules/$(uname -r)/kernel/drivers/md/dm-crypt.ko

Если вывод не пустой и видим файл, значит доступен. Теперь его нужно загрузить в ядро.

Bash
sudo modprobe dm_crypt
lsmod |grep dm_crypt

Добавим модуль в автозагрузку, чтобы не приходилось этого делать руками.

Bash
vi /etc/modules
dm_crypt

Также нужно запустить iscsid демона на каждой ноде.

Bash
sudo systemctl enable iscsid
sudo systemctl start iscsid

Запускаем проверку заново, ошибок больше быть не должно.

В случае, если нет каких-то пакетов их нужно просто поставить и запустить.

Утилита также поддерживает установку зависимостей с помощью

Bash
./longhornctl install preflight

Но я не проверял насколько корректно это отрабатывает.

Установить сам longhorn в кластер можно разными способами, я буду устанавливать через helm чарт, нужно будет включить создание ингресс для UI + переопределить дефолтный путь для хранения данных на тот, что мы выше специально выделили.

Добавляем helm chart, скачиваем его.

Bash
helm repo add longhorn https://charts.longhorn.io
helm search repo longhorn
helm pull longhorn/longhorn
tar xvf longhorn-1.7.2.tgz
rm -f longhorn-1.7.2.tgz

Далее откроем на редактирование values.yaml и изменим следующее:

Bash
defaultClassReplicaCount: 2
defaultDataPath: /longhorn-data
defaultReplicaCount: 2
longhornUI:
  # -- Replica count for Longhorn UI.
  replicas: 1
ingress:
  enabled: true
  ingressClassName: nginx
  host: longhorn.dev.local
  tls: true
  secureBackends: true
  #tlsSecret: longhorn.local-tls
  path: /
  pathType: ImplementationSpecific

defaultClassReplicaCount — по умолчанию 3, но я поставлю 2. В документации рекомендуется ставить 3 и более, если в кластере 3 и более ноды, у меня их всего две.

defaultDataPath — собственно путь, где будут храниться данные.

defaultReplicaCount — по сути тот же самый параметр что и defaultClassReplicaCount, но только применяется, когда мы создаем том без указания конкретного StorageClass, например в UI.

Также я установил 1 реплику для UI и включил создание ингресс.

Специфичный tlsSecret нам тут не нужен, поэтому я закоментировал строку tlsSecret: longhorn.local-tls и чтобы не создавалось это поле в спеке, добавил в манифест ингресса строчки:

Bash
tls:
- hosts:
  - {{ .Values.ingress.host }}
  {{- if .Values.ingress.tlsSecret }} ### My condition
  secretName: {{ .Values.ingress.tlsSecret }}
  {{- end }} 

То есть, если в values будет указан tlsSecret, то в спецификации ингресса, мы создадим поле secretName.

Создаем namespace для longhorn:

Bash
kubectl create ns longhorn-system

Устанавливаем релиз:

Bash
helm --kubeconfig ~/local_k8s.conf install longhorn-system -n longhorn-system -f values.yaml .

Ждем пока все поднимется, у меня UI будет доступен по адресу https://longhorn.dev.local

Проверим работоспособность, создав тестовый pvc в namespace default на 1Gb и примонтируем его к тестовому поду с nginx.

YAML
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-rwo
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    volumeMounts:
    - name: rwo-volume
      mountPath: /data
  volumes:
  - name: rwo-volume
    persistentVolumeClaim:
      claimName: test-rwo
YAML
kubectl apply -f files_test/pvc_test.yaml
kubectl get pvc

Проверим под:

YAML
kubectl exec -it nginx -- bash
df -h | grep data 

Также подробную информацию о всех volume можно найти в UI.

Насколько статья полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 5 / 5. Количество оценок: 1

Оценок пока нет. Поставьте оценку первым.

Оставить комментарий