Дисковые тома Kubernetes AKS утверждают, что диск имеет несколько узлов

Как я могу подключить 100 ГБ постоянного тома к каждому узлу в кластере AKS Kubernetes?

Мы используем Kubernetes в Azure, используя AKS.

У нас есть сценарий, в котором нам нужно присоединить постоянные тома к каждому узлу в нашем кластере AKS. Мы запускаем 1 Docker-контейнер на каждом узле в кластере.

Причиной динамического подключения томов является увеличение доступного IOPS и доступного объема хранилища, необходимого каждому контейнеру Docker для выполнения своей работы.

Программа, работающая внутри каждого контейнера Docker, работает с очень большими файлами входных данных (10 ГБ) и записывает еще большие выходные файлы (50 ГБ).

Мы могли бы смонтировать общие файловые ресурсы Azure, но Azure File Shares ограничен 60 МБ / с, что слишком медленно для нас, чтобы перемещаться по этим необработанным данным. Когда программа, запущенная в образе Docker, завершит свою работу, она переместит выходной файл (50 ГБ) в хранилище BLOB-объектов. Сумма всех выходных файлов может превышать 1 ТБ из всех контейнеров.

Я думал, что если мы сможем подключить постоянный том к каждому узлу, мы сможем увеличить доступное дисковое пространство, а также количество операций ввода-вывода в секунду, не прибегая к конфигурации виртуальной машины с высоким vCPU/RAM (т. Е. DS14_v2). Наша программа более интенсивно использует ввод-вывод по сравнению с процессором.

Все образы Docker, запущенные в модуле Pod, точно такие же, где они читают сообщение из очереди, в котором указывается конкретный входной файл для работы.

Я следовал за документами, чтобы создать StorageClass, Persistent Volume Claims и Persistent Volume и запустить его для 1 POD. https://docs.microsoft.com/en-us/azure/aks/azure-disks-dynamic-pv

Однако, когда я создаю Deployment and Scale количество модулей от 1 до 2, я получаю сообщение об ошибке (в производственном процессе мы масштабируемся до необходимого количества узлов ~100)

Ошибка Multi-Attach для тома "pvc-784496e4-869d-11e8-8984-0a58ac1f1e06" Том уже используется модулем pv-deploy-67fd8b7b95-fjn2n

Я понимаю, что диск Azure можно подключить только к одному узлу (ReadWriteOnce), однако я не уверен, как создать несколько дисков и прикрепить их к каждому узлу во время загрузки кластера Kubernetes и начала нашей работы.

Постоянное требование объема:

apiVersion: v1
kind: PersistentVolumeClaim
    metadata:
    name: azure-managed-disk
spec:
    accessModes:
    - ReadWriteOnce
    storageClassName: managed-premium
    resources:
    requests:
    storage: 100Gi

Это мое развертывание:

apiVersion: apps/v1
kind: Deployment
    metadata:
    name: pv-deployment
    labels:
    app: nginx
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
        app: nginx
    spec:
      containers:
        - name: myfrontend
        image: nginx
        volumeMounts:
        - name: volume
        mountPath: /mnt/azure
        resources: 
          limits:
            cpu: ".7"
            memory: "2.5G"
          requests:
            cpu: ".7"
            memory: "2.5G"      
         volumes:
         - name: volume
         persistentVolumeClaim:
          claimName: azure-managed-disk

Если бы я знал, что собираюсь масштабироваться до 100 узлов, нужно ли мне создавать файлы.yaml с 100 развертываниями и указывать в каждом развертывании, чтобы использовать определенную заявку тома?

Например, в моем заявлении о том, что у меня есть Azure-Claim-01, Azure-Claim-02 и т. Д., И в каждом Развертывании я должен был предъявить претензию к каждому названному Volume Claim.

volumes:
    - name: volume
      persistentVolumeClaim:
        claimName: azure-claim-01

Я не могу понять, как я могу сделать все это динамически?

Можете ли вы порекомендовать лучший способ достижения желаемого результата?

1 ответ

Вы должны использовать StatefulSetа также volumeClaimTemplates конфигурация, как показано ниже:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 4
  updateStrategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: k8s.gcr.io/nginx-slim:0.8
          ports:
           - containerPort: 80
          volumeMounts:
            - name: persistent-storage
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: persistent-storage
      annotations:
        volume.beta.kubernetes.io/storage-class: hdd
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 2Gi
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: hdd
provisioner: kubernetes.io/azure-disk
parameters:
  skuname: Standard_LRS
  kind: managed
  cachingMode: ReadOnly

Вы получите постоянный том для каждого узла:

kubectl get pv

NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                              STORAGECLASS   REASON
  AGE
pvc-0e651011-7647-11e9-bbf5-c6ab19063099   2Gi        RWO            Delete           Bound     default/persistent-storage-web-0   hdd
  51m
pvc-17181607-7648-11e9-bbf5-c6ab19063099   2Gi        RWO            Delete           Bound     default/persistent-storage-web-1   hdd
  49m
pvc-4d488893-7648-11e9-bbf5-c6ab19063099   2Gi        RWO            Delete           Bound     default/persistent-storage-web-2   hdd
  48m
pvc-6aff2a4d-7648-11e9-bbf5-c6ab19063099   2Gi        RWO            Delete           Bound     default/persistent-storage-web-3   hdd
  47m

И каждый узел создаст выделенное постоянное утверждение тома:

kubectl get pvc

NAME                       STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistent-storage-web-0   Bound     pvc-0e651011-7647-11e9-bbf5-c6ab19063099   2Gi        RWO            hdd            55m
persistent-storage-web-1   Bound     pvc-17181607-7648-11e9-bbf5-c6ab19063099   2Gi        RWO            hdd            48m
persistent-storage-web-2   Bound     pvc-4d488893-7648-11e9-bbf5-c6ab19063099   2Gi        RWO            hdd            46m
persistent-storage-web-3   Bound     pvc-6aff2a4d-7648-11e9-bbf5-c6ab19063099   2Gi        RWO            hdd            45m

Я хотел бы рассмотреть возможность использования DaemonSet. Это позволит вашим модулям работать только на каждом узле, поэтому ReadWriteOnce вступит в силу. Ограничением будет то, что вы не можете масштабировать свое приложение больше, чем количество имеющихся у вас узлов.

Другие вопросы по тегам