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