Я хочу настроить службу в Pod, состоящую из 3 разных контейнеров. В этом контейнере есть процесс, который нужно записать в файл. Три контейнера записывают в этот файл одно и то же почти одновременно. Чтобы избежать одновременной записи, можно ли настроить эти 3 контейнера в модуле (реплика: 3) с 3 разными томами, на которых каждый контейнер будет писать?
Насколько я понимаю, это кажется довольно сложным.
Спасибо за помощь !
Как я уже упоминал в комментариях, это можно сделать с помощью StatefulSets
.
Согласно документации kubernetes о StatefulSets.:
Использование StatefulSets
StatefulSets полезны для приложений, которым требуется одно или несколько из следующего.
- Стабильные уникальные сетевые идентификаторы.
- Стабильное постоянное хранилище.
- Упорядоченное плавное развертывание и масштабирование.
- Упорядоченные автоматические скользящие обновления.
Вышеупомянутое «стабильное» является синонимом постоянства (повторного) планирования Pod. Если приложению не требуются стабильные идентификаторы или упорядоченное развертывание, удаление или масштабирование, вам следует развернуть свое приложение с помощью объекта рабочей нагрузки, который предоставляет набор реплик без состояния. Развертывание или ReplicaSet может быть лучше подходит для ваших нужд без гражданства.
Ограничения
- Хранилище для данного модуля должно быть предоставлено Поставщик PersistentVolume на основании запрошенного
storage class
, или предварительно подготовленные администратором.- Удаление и / или масштабирование StatefulSet вниз приведет к не удалить тома, связанные с StatefulSet. Это сделано для обеспечения безопасности данных, что обычно более ценно, чем автоматическая очистка всех связанных ресурсов StatefulSet.
- StatefulSets в настоящее время требует Безголовый сервис отвечать за сетевую идентичность модулей. Вы несете ответственность за создание этой Услуги.
- StatefulSet не предоставляет никаких гарантий прекращения работы подов при удалении StatefulSet. Чтобы добиться упорядоченного и плавного завершения работы подов в StatefulSet, можно уменьшить StatefulSet до 0 перед удалением.
- Когда используешь Постоянные обновления по умолчанию Политика управления пакетами (
OrderedReady
), можно попасть в неработающее состояние, требующее ручное вмешательство для ремонта.
Пример ниже демонстрирует компоненты StatefulSet.
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # by default is 1
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi
В приведенном выше примере:
nginx
, используется для управления сетевым доменом.web
, имеет спецификацию, указывающую, что 3 реплики контейнера nginx будут запущены в уникальных модулях.volumeClaimTemplates
обеспечит стабильное хранение, используя Постоянные тома предоставляется поставщиком PersistentVolume.Также с той же страницы документации:
Стабильное хранение
Kubernetes создает один PersistentVolume для каждого VolumeClaimTemplate. В приведенном выше примере nginx каждый Pod получит один PersistentVolume с StorageClass равным
my-storage-class
и 1 Гиб выделенного хранилища. Если StorageClass не указан, будет использоваться StorageClass по умолчанию. Когда Pod (повторно) запланирован на узел, егоvolumeMounts
смонтируйте PersistentVolumes, связанные с его утверждениями PersistentVolume. Обратите внимание, что PersistentVolumes, связанные с утверждениями PersistentVolume Pod'ов, не удаляются при удалении Pod'ов или StatefulSet. Это нужно делать вручную.