#kubernetes #rancher #kubernetes-pvc
#kubernetes #ранчер #kubernetes-пвх
Вопрос:
Я пытаюсь использовать динамический поставщик локальных томов для k8s, принадлежащий Rancher, С несколькими экземплярами, каждый со своим собственным классом хранения, чтобы я мог предоставлять несколько типов локальных томов в зависимости от их производительности (например, ssd, hdd и т. Д.).
Базовая инфраструктура не является симметричной; некоторые узлы имеют только твердотельные накопители, некоторые только жесткие диски, некоторые из них оба.
Я знаю, что могу подсказать планировщику выбрать нужные узлы, предоставив правила привязки узлов для модулей.
Но есть ли лучший способ решить эту проблему только на уровне поставщика / класса хранения? Например, сделать класс хранения доступным только для подмножества узлов кластера.
Ответ №1:
Я знаю, что могу подсказать планировщику выбрать нужные узлы, предоставив правила привязки узлов для модулей.
При использовании Pod
локальных постоянных томов нет необходимости определять правила привязки узлов на уровне. Сходство с узлом может быть указано в PersistentVolume
определении.
Но есть ли лучший способ решить эту проблему только на уровне поставщика / класса хранения? Например, сделать класс хранения доступным только для подмножества узлов кластера.
Нет, его нельзя указать на StorageClass
уровне. Вы также не можете сделать a StorageClass
доступным только для подмножества узлов.
Но когда дело доходит до поставщика, я бы сказал, что да, это должно быть осуществимо, поскольку одной из основных задач поставщика хранилища является создание соответствующих PersistentVolume
объектов в ответ на PersistentVolumeClaim
созданные пользователем. Вы можете прочитать об этом здесь:
Динамическая подготовка томов позволяет создавать тома хранилища по требованию. Без динамической подготовки администраторам кластера приходится вручную обращаться к своему поставщику облака или хранилища для создания новых томов хранилища, а затем создавать объекты PersistentVolume для их представления в Kubernetes. Функция динамической подготовки устраняет необходимость в предварительной подготовке хранилища администраторами кластера. Вместо этого он автоматически резервирует хранилище, когда его запрашивают пользователи.
Итак, рассматривая весь процесс предоставления тома с самого начала, он выглядит следующим образом:
Пользователь создает только PersistenVolumeClaim
объект, в котором он указывает StorageClass
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 10Gi
storageClassName: local-storage ### 👈
и его можно использовать в Pod
определении:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim ### 👈
Таким образом, на практике в Pod
определении вам нужно только указать правильный PVC
. Здесь нет необходимости определять какие-либо правила привязки к узлу.
A Pod
ссылается на a PVC
, PVC
затем ссылается на a StorageClass
, StorageClass
ссылается на provisioner
то, что должно использоваться:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/my-fancy-provisioner ### 👈
volumeBindingMode: WaitForFirstConsumer
Итак, в конце концов, задача a provisioner
заключается в создании соответствующего PersistentVolume
объекта. Это может выглядеть следующим образом:
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /var/tmp/test
nodeAffinity: ### 👈
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- ssd-node ### 👈
Таким образом, a Pod
, который использует myclaim PVC
-> который ссылается на local-storage StorageClass
-> который выбирает правильное хранилище provisioner
, будет автоматически запланирован на узле, выбранном в PV
определении, созданном этим поставщиком.
Комментарии:
1. Я понимаю (надеюсь), что привязка к узлу уровня PV, введенная функцией локальных постоянных томов. Но это помогает только в том случае, если PV статически создается заранее, чтобы планировщик знал, на каком узле запланировать модуль. И это также помогает при перепланировании pod, когда определение PV уже доступно. Но в случае динамического поставщика, WaitForFirstConsumer, разве модуль не запланирован перед PV? Если это так, то узел уже был выбран. И если этот класс хранилища не может обеспечить этот узел, то это тупик. Что я здесь не так понимаю?