В k8s существуют разные варианты для подключения дисков, сегодня рассмотрим сторадж систему longhorn, под капотом работает с блочными дисками по протоколу (его реализацию в linux) iscsi. Позволяет автоматически реплецировать данные на другие тома. Более подробно в официальной документации.
Начнем с установки нужных пакетов на наши рабочие ноды, у меня их всего две. Во-первых хочется выделить отдельной дисковое пространство под хранение данных, я использовал Vagrant для создания VM, так выглядит картина по дискам.
Уже есть том ubuntu-vg, он создается автоматически при запуске VM через vagrant, при желании можно увеличить размер и так далее, но я использовал дефолт, все это описано в статья по развертыванию k8s кластера.
Создадим логический том на 15Гб, «накатим» туда файловую систему и смонтируем.
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.
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 и используется для обеспечения прозрачного шифрования дисков. Для начала проверим, что модуль доступен в ядре:
ls /lib/modules/$(uname -r)/kernel/drivers/md/dm-crypt.ko
Если вывод не пустой и видим файл, значит доступен. Теперь его нужно загрузить в ядро.
sudo modprobe dm_crypt
lsmod |grep dm_crypt
Добавим модуль в автозагрузку, чтобы не приходилось этого делать руками.
vi /etc/modules
dm_crypt
Также нужно запустить iscsid демона на каждой ноде.
sudo systemctl enable iscsid
sudo systemctl start iscsid
Запускаем проверку заново, ошибок больше быть не должно.
В случае, если нет каких-то пакетов их нужно просто поставить и запустить.
Утилита также поддерживает установку зависимостей с помощью
./longhornctl install preflight
Но я не проверял насколько корректно это отрабатывает.
Установить сам longhorn в кластер можно разными способами, я буду устанавливать через helm чарт, нужно будет включить создание ингресс для UI + переопределить дефолтный путь для хранения данных на тот, что мы выше специально выделили.
Добавляем helm chart, скачиваем его.
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 и изменим следующее:
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 и чтобы не создавалось это поле в спеке, добавил в манифест ингресса строчки:
tls:
- hosts:
- {{ .Values.ingress.host }}
{{- if .Values.ingress.tlsSecret }} ### My condition
secretName: {{ .Values.ingress.tlsSecret }}
{{- end }}
То есть, если в values будет указан tlsSecret, то в спецификации ингресса, мы создадим поле secretName.
Создаем namespace для longhorn:
kubectl create ns longhorn-system
Устанавливаем релиз:
helm --kubeconfig ~/local_k8s.conf install longhorn-system -n longhorn-system -f values.yaml .
Ждем пока все поднимется, у меня UI будет доступен по адресу https://longhorn.dev.local
Проверим работоспособность, создав тестовый pvc в namespace default на 1Gb и примонтируем его к тестовому поду с nginx.
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
kubectl apply -f files_test/pvc_test.yaml
kubectl get pvc
Проверим под:
kubectl exec -it nginx -- bash
df -h | grep data
Также подробную информацию о всех volume можно найти в UI.