Контейнер Mongodb выходит из строя, если у вас есть настройка тома и более одного контейнера в рабочей нагрузке

#mongodb #kubernetes #docker-volume #rancher

Вопрос:

Я настроил рабочую нагрузку mongodb в Rancher (2.5.8)

Я настроил громкость: объем

Рабочая нагрузка начинается нормально, если у меня есть контейнеры, настроенные на масштабирование до 1. Итак, 1 контейнер запустится, и все в порядке.

Однако, если я настрою рабочую нагрузку на 2 или более контейнеров, один контейнер запустится нормально, но затем другие не запустятся.

Вот как выглядит моя рабочая нагрузка, если я настрою ее на масштабирование до 2. Один контейнер запущен и работает нормально, но второй (и третий, если у меня его масштаб до 3) выходят из строя. введите описание изображения здесь

Если я удалю том, то все 2 контейнера запустятся нормально, но тогда данные будут храниться только в каждом контейнере (и теряются всякий раз, когда я повторно развертываю).

Но если у меня установлен том, то данные действительно хранятся в томе (хосте), но затем могут запускаться только в одном контейнере.

Заранее благодарим вас за любые предложения

Джейсон

Комментарии:

1. Привет, вы можете поделиться журналами из контейнера, который выходит из строя? Я бы подумал, что это может пролить некоторый свет на CrashLoopBackOff проблему, с которой вы сталкиваетесь.

Ответ №1:

Опубликуйте этот вики-ответ сообщества, чтобы установить базовый уровень и, надеюсь, показать одну из возможных причин, по которой mongodb он не работает.

Не стесняйтесь редактировать/расширять.


Поскольку в этом вопросе отсутствует много информации, например, как он был создан, как mongodb был подготовлен, а также отсутствуют журналы из контейнера, фактическую проблему может быть трудно определить.

Предполагая, что Deployment он был создан со следующим манифестом:

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongo
spec:
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  replicas: 1 # THEN SCALE TO 3
  selector:
    matchLabels:
      app: mongo  
  template:
    metadata:
      labels:
        app: mongo
    spec:
      containers:
      - name: mongo
        image: mongo
        imagePullPolicy: "Always"
        ports:
        - containerPort: 27017
        volumeMounts:
        - mountPath: /data/db
          name: mongodb
      volumes:
      - name: mongodb
        persistentVolumeClaim:
          claimName: mongo-pvc
 

Часть настройки, на которую Volume ссылается is, может отличаться (например hostPath , может использоваться), но предпосылка этого была:

  • Если Pods физически они ссылаются на одно и то же data/db/mongod , оно перейдет в CrashLoopBackOff состояние.

Далее по этой теме:

  • $ kubectl get pods
 NAME                     READY   STATUS             RESTARTS   AGE
mongo-5d849bfd8f-8s26t   1/1     Running            0          45m
mongo-5d849bfd8f-l6dzb   0/1     CrashLoopBackOff   13         44m
mongo-5d849bfd8f-wgh6m   0/1     CrashLoopBackOff   13         44m
 
  • $ kubectl logs mongo-5d849bfd8f-l6dzb
 <-- REDACTED --> 
{"t":{"$date":"2021-06-05T12:43:58.025 00:00"},"s":"E",  "c":"STORAGE",  "id":20557,   "ctx":"initandlisten","msg":"DBException in initAndListen, terminating","attr":{"error":"DBPathInUse: Unable to lock the lock file: /data/db/mongod.lock (Resource temporarily unavailable). Another mongod instance is already running on the /data/db directory"}}
<-- REDACTED --> 
 

Ссылаясь на сайт O’Reilly о mongodb производственной настройке:

Укажите альтернативный каталог для использования в качестве каталога данных; по умолчанию используется /data/db/ (или, в Windows, datadb на двоичном томе MongoDB). Каждому процессу mongod на компьютере требуется свой собственный каталог данных, поэтому, если вы запускаете три экземпляра mongod на одной машине, вам понадобятся три отдельных каталога данных. При mongod запуске он создает mongod.lock файл в своем каталоге данных, что предотвращает mongod использование этого каталога любым другим процессом. Если вы попытаетесь запустить другой сервер MongoDB, используя тот же каталог данных, это выдаст ошибку:

 exception in initAndListen: DBPathInUse: Unable to lock the
     lock file:  data/db/mongod.lock (Resource temporarily unavailable).
     Another mongod instance is already running on the 
     data/db directory,
      terminating`
 

Oreilly.com: Библиотека: Просмотр: Mongodb окончательное: Глава 21


В качестве альтернативного подхода вы можете использовать другие средства mongodb , такие как, например: