Ответ 1
Да, обычный блок может использовать постоянный том. Однако иногда у вас есть несколько контейнеров, которые логически образуют "группу". Примерами этого могут быть реплики базы данных, узлы ZooKeeper, узлы Kafka и т.д. Во всех этих случаях есть множество серверов, и они работают вместе и разговаривают друг с другом. Что особенно важно в них, так это то, что каждый человек в группе имеет личность. Например, для кластера базы данных один является мастером, а два являются последователями, и каждый из последователей связывается с мастером, позволяя ему знать, что он имеет и не синхронизировал. Таким образом, последователи знают, что "db-x-0" является мастером, и мастер знает, что "db-x-2" является последователем и имеет все данные до определенной точки, но все еще нуждается в данных, выходящих за рамки этого.
В таких ситуациях вам нужно несколько вещей, которые вы не можете легко получить из обычного контейнера:
- Предсказуемое имя: вы хотите запустить свои стручки, рассказывая им, где найти друг друга, чтобы они могли создать кластер, выбрать лидера и т.д., но вам нужно заранее знать их имена, чтобы сделать это. Обычные имена групп случайны, поэтому вы не можете их заранее знать.
- Устойчивый адрес/DNS-имя: вы хотите, чтобы все имена были доступны на шаге (1), чтобы оставаться неизменным. Если перезагрузится нормальный модуль (вы повторно развернете, хост, на котором он запускался, и т.д.) На другом хосте, он получит новое имя и новый IP-адрес.
- Постоянная ссылка между человеком в группе и их постоянным томом: если хост, на котором работает один из ваших основных мастеров базы данных, он будет перемещен на новый хост, но должен подключиться к тот же постоянный том, как там один и только один том, который содержит правильные данные для этого "индивидуального". Так, например, если вы перегруппируете свою группу из 3 узлов базы данных, вы хотите, чтобы один и тот же человек (по имени DNS и IP-адресу) получил тот же постоянный том, что мастер все еще является ведущим и все еще имеет одни и те же данные, replica1 получает его данные и т.д.
StatefulSets решают эти проблемы, потому что они предоставляют (цитирование из https://kubernetes.io/docs/concepts/abstractions/controllers/statefulsets/):
- Стабильные, уникальные сетевые идентификаторы.
- Стабильное, постоянное хранилище.
- Упорядоченное, изящное развертывание и масштабирование.
- Упорядоченное, изящное удаление и завершение.
Я действительно не говорил о (3) и (4), но это также может помочь с кластерами, так как вы можете сказать, что первый из них будет использоваться, чтобы стать мастером, а следующий - первым, и считать его хозяином, и др.
Как уже отмечалось, вы действительно можете некоторые использовать одни и те же преимущества, используя обычные контейнеры и сервисы, но гораздо больше работают. Например, если вам нужны 3 экземпляра базы данных, вы можете вручную создать 3 развертывания и 3 службы. Обратите внимание, что вы должны вручную создать 3 развертывания, поскольку у вас не может быть точка обслуживания для одного модуля в развертывании. Затем, чтобы увеличить масштаб, вы вручную создадите другое развертывание и другую службу. Это действительно работает, и это была довольно распространенная практика до того, как появился PetSet/PersistentSet. Обратите внимание, что в нем отсутствуют некоторые из перечисленных выше преимуществ (например, постоянное сопоставление томов и фиксированный порядок начала).