Назад | Перейти на главную страницу

Могу ли я установить 3 контейнера в модуле K8s, каждый из которых будет писать на своем собственном томе?

Я хочу настроить службу в 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, используется для управления сетевым доменом.
  • StatefulSet с именем 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. Это нужно делать вручную.