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

Или

Или «я получу от этого 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, при минимальном изменении манифестов приложения, никак не меняя внутренние алгоритмы можно добиться кратного увеличения производительности разделяемого хранилища на любом исправном сетевом оборудовании. 

© Habrahabr.ru