Kubernetes несколько ПВХ с Statefulset для каждого модуля против одного ПВХ для всех модулей?
Я развернул кластер kubernetes с модулем состояния для mysql. для каждого контейнера у меня есть разные ПВХ.
например: если 3 под 3 5GB EBS PVC
ТАК Каким способом лучше использовать один ПВХ для всех контейнеров или использовать разные ПВХ для каждого модуля.
2 ответа
StatefulSet должен использовать volumeClaimTemplates, если вы хотите иметь выделенное хранилище для каждого модуля набора. На основе этого шаблона создается PersistentVolumeClaim для каждого модуля и настраивается том для привязки к этому заявлению. Сгенерированные имена PersistentVolumeClaims состоят из имени volumeClaimTemplate + имени pod + порядкового номера. Поэтому, если вы добавляете часть volumeClaimTemplate в свой YAML StatefulSet (и удаляете конкретные ссылки persistentVolumeClaim), вот что-то вроде этого:
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteOnce
Затем идите и создайте свой StatefulSet и после того, как изучите один из его модулей (kubectl get pods pod-name-0 yaml), вы увидите что-то вроде этого (часть томов вывода):
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-data-pod-name-0. | dynamically created claim based on the template
Таким образом, с помощью volumeClaimTemplates вам не нужно создавать отдельные PVC-ы самостоятельно, а затем в каждой отдельной ссылке StatefulSet указывать PVC-файл, который будет монтироваться в вашем контейнере в определенном mountPath(помните, что каждый модуль набора должен ссылаться на отдельный PVC, 1PVC-1PV): часть определения "контейнеров" вашего YAML Statefulset:
volumeMounts:
- name: mysql-data || references your PVC by -name(not PVC name itself)
mountPath: /var/lib/mysql
Поэтому стремление к тому, чтобы у каждого модуля набора было выделенное хранилище и не использовался volumeClaimTemplates, приводит к множеству проблем и усложняет управление и масштабирование.
ПВХ связывается с определенным PV. Для StatefulSet в большинстве мыслимых случаев вам нужен PV, к которому может обращаться только определенный модуль, чтобы данные не были повреждены при попытке записи из параллельного процесса / модуля (RWO, а не режим RWX).
Имея это в виду, вам нужно PVC для каждой реплики в StatefulSet. Создание PVC для реплик станет очень проблематичным, если сделать это вручную, поэтому правильный способ сделать это - использовать volumeClaimTemplates
это будет динамически создавать PVC для вас, когда вы масштабируете свой набор.