Народный бондинг для облачного хранилища данных

—

от автора

Или "я получу от этого cisco все"

Или «я получу от этого cisco все»

Данная статья окажется полезной для организации сред разработки или тестирования в условиях ограниченного бюджета. Может пригодиться в продуктивной среде, пока нужная железка едет месяцами. Актуально при насыщенности сетевого интерфейса хранилища входящим трафиком от множества рабочих узлов kubernetes.

Собственно, некое хранилище с несколькими сетевыми интерфейсами:

nslookup qnap Server:         127.0.0.53 Address:        127.0.0.53#53  Non-authoritative answer: Name:   qnap.local Address: 192.168.1.250 Name:   qnap.local Address: 192.168.1.251 Name:   qnap.local Address: 192.168.1.252 Name:   qnap.local Address: 192.168.1.253 

На самом сервере может быть настроен честный бондинг или не настроен, для входящих соединений это не важно.

Намеренно абстрагируюсь от конкретных схем: у вас может быть простой сегмент локальной сети, или же может быть дополнительный резервный сегмент, даже несколько, не влияет на организацию нашего народного бондинга соединений из облака.

Поды и PVC

Поды в кластере kubernetes получают затребованные тома постоянного хранилища с помощью манифестов persistent volume claim (PVC). PVC могут быть сформированы контроллером statefulset из шаблонов:

apiVersion: apps/v1 kind: StatefulSet metadata:   name: userapp spec:   replicas: 8   selector:      matchLabels:        app: userapp   template:     metadata:       labels:         app: userapp     spec:       containers:       - name: userapp         image: busybox         imagePullPolicy: IfNotPresent         command: ["/bin/sh"]         args:           - "-c"           - "sleep 10000"         volumeMounts:         - name: userapp           mountPath: /home   volumeClaimTemplates:     - metadata:         name: userapp       spec:         accessModes: ["ReadWriteMany"]         storageClassName: userapp         resources:           requests:             storage: 30Gi

Или заранее размещены для deployment:

kind: PersistentVolumeClaim apiVersion: v1 metadata:   name: userapp-0 spec:   accessModes:   - ReadWriteMany   resources:     requests:       storage: 10Gi   storageClassName: userapp

Для осуществления автоматического выбора следующего тома с указанными сетевыми адресами из списка добавим класс хранилища:

apiVersion: storage.k8s.io/v1 kind: StorageClass metadata:   name: userapp provisioner: kubernetes.io/no-provisioner reclaimPolicy: Retain volumeBindingMode: WaitForFirstConsumer

Генерация постоянных томов может быть осуществлена статически, в виде манифестов:

--- apiVersion: v1 kind: PersistentVolume metadata:   name: userapp-shared-data-1 spec:   accessModes:   - ReadWriteMany   capacity:     storage: 300Gi   nfs:     path: /home/share     server: 192.168.1.250   persistentVolumeReclaimPolicy: Retain   storageClassName: userapp   volumeMode: Filesystem --- apiVersion: v1 kind: PersistentVolume metadata:   name: userapp-shared-data-2 spec:   accessModes:   - ReadWriteMany   capacity:     storage: 300Gi   nfs:     path: /home/share     server: 192.168.1.251   persistentVolumeReclaimPolicy: Retain   storageClassName: userapp   volumeMode: Filesystem  apiVersion: v1 kind: PersistentVolume metadata:   name: userapp-shared-data-3 spec:   accessModes:   - ReadWriteMany   capacity:     storage: 300Gi   nfs:     path: /home/share     server: 192.168.1.252   persistentVolumeReclaimPolicy: Retain   storageClassName: userapp   volumeMode: Filesystem --- apiVersion: v1 kind: PersistentVolume metadata:   name: userapp-shared-data-0 spec:   accessModes:   - ReadWriteMany   capacity:     storage: 300Gi   nfs:     path: /home/share     server: 192.168.1.253   persistentVolumeReclaimPolicy: Retain   storageClassName: userapp   volumeMode: Filesystem

Следует создать достаточное количество постоянных томов заранее. PVC можно переиспользовать бесконечно без дополнительных контроллеров. PVC, сгенерированные из шаблонов statefulset также остаются вне зависимости от scale down, перезапуска подов и дополнительные контроллеры для переиспользования не требуются.

Динамическое создание постоянных томов осуществляется настройкой api-server admission controller. Отработка изменений, удаления PVC обеспечивается добавлением соответствующего io provisioner в кластер.

Поды могут обращаться к некоторым папкам как одновременно, так и изолированно, добавляя в примонтированный путь уникальные данные проекта, пользователя.

Выводы

Таким образом, путем добавления storage class и набора PV, при минимальном изменении манифестов приложения, никак не меняя внутренние алгоритмы можно добиться кратного увеличения производительности разделяемого хранилища на любом исправном сетевом оборудовании. 


ссылка на оригинал статьи https://habr.com/ru/articles/791332/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *