Я пытаюсь использовать Kubernetes для управления сценарием, в котором мне нужно запустить несколько экземпляров приложения (то есть несколько модулей). Это мои требования:
- Когда мне нужно расширить свое приложение, я хочу развернуть один модуль Pod на определенном узле (не случайном).
- Когда мне нужно уменьшить свое приложение, я хочу удалить конкретный Pod из определенного узла (не случайный).
- Когда развертывается новый Pod, я хочу, чтобы он монтировал определенный PersistentVolume (не случайный), который я подготовил вручную.
- После удаления модуля, я хочу, чтобы его PersistentVolume мог повторно использоваться другим модулем.
До сих пор я использовал это наивное решение для выполнения всего вышеперечисленного: каждый раз, когда мне нужно было создать новый экземпляр моего приложения, я создавал одно новое развертывание (с ровно одной репликой) и одно PersistentVolumeClaim. Например, если мне нужно пять экземпляров приложения, мне нужно пять развертываний. Однако это решение не очень масштабируемо и не использует весь потенциал Kubernetes.
Я думаю, что было бы намного разумнее использовать один единый шаблон для всех модулей, но я не уверен, должен ли я использовать Deployment или Statefulset.
Я экспериментировал с Labels и Node Affinity и обнаружил, что могу удовлетворить требование 1, но не могу удовлетворить требование 2 таким образом. Чтобы удовлетворить требование 2, можно ли было бы удалить конкретный Pod, написав свой собственный планировщик?
Я не понимаю, как Kubernetes решает связать определенный PersistentVolume с конкретным PersistentVolumeClaim. Есть ли планировщик громкости? Можно ли как-то его настроить? Таким образом, каждый раз, когда создается новый Pod, я смогу привязать его к определенному объему.