Том уже привязан исключительно к одному узлу и не может быть присоединен к другому

У меня есть довольно простой стручок Kubernetes. Я хочу набор с сохранением состояния и хочу следующий процесс:

  1. Я хочу загрузить initcontainer и распаковать архив из s3 в том, подключенный к initcontainer
  2. Я хочу смонтировать этот том в мой основной контейнер для использования

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: app
  namespace: test
  labels:
    name: app
spec:
  serviceName: app
  replicas: 1
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      initContainers:
      - name: preparing
        image: alpine:3.8
        imagePullPolicy: IfNotPresent
        command:
          - "sh"
          - "-c"
          - |
            echo "Downloading data"
            wget https://s3.amazonaws.com/.........
            tar -xvzf xxxx-........ -C /root/
        volumeMounts:
        - name: node-volume
          mountPath: /root/data/

      containers:
      - name: main-container
        image: ecr.us-west-2.amazonaws.com/image/:latest
        imagePullPolicy: Always

        volumeMounts:
        - name: node-volume
          mountPath: /root/data/

  volumeClaimTemplates:
  - metadata:
      name: node-volume
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: gp2-b
      resources:
        requests:
          storage: 80Gi

Я продолжаю получать следующую ошибку:

Сначала я запускаю это, и я вижу, как текут логи моего архива, загружаемого initcontainer. Примерно на полпути он завершается и выдает следующую ошибку:

Multi-Attach error for volume "pvc-faedc8" Volume is 
already exclusively attached to one node and can't be 
attached to another

5 ответов

Решение

Похоже, у вас есть свисающий PVC и / или PV, который подключен к одному из ваших узлов. Вы можете SSH в узел и запустить df или же mount Проверять.

Если вы посмотрите на это, то PVCs в StatefulSet всегда сопоставляются с именами их стручков, поэтому возможно, что у вас все еще есть свисающий стручок (?)

Вы можете попробовать удалить PVC и соответствующий PV:

$ kubectl -n test-node delete pvc pvc-faedc8
$ kubectl -n test-node delete pv <pv-name>

Вот ЕДИНСТВЕННОЕ решение, которое сработало для меня:

  1. Масштабируйте свое приложение до0
      kubectl -n NAMESPACE scale deployment/stateful NAME --replicas 0

или

      kubectl -n NAMESPACE edit deployment/stateful NAME

И вручную редактироватьreplicas: 0


Удалить всеvolumeattachment:

      kubectl -n NAMESPACE delete volumeattachment --all

Верните реплики.

Вот и все

У меня была та же проблема прямо сейчас, и проблема заключалась в том, что узел, на котором обычно работает модуль, был отключен, и его заменил другой (который по какой-то причине не работал должным образом). Несколько раз уже был сценарий «узел не работает», и он никогда не вызывал никаких проблем. Не удалось восстановить и запустить StatefulSet и Deployment без резервного копирования узла.

У меня была аналогичная ошибка:

       The volume pvc-2885ea01-f4fb-11eb-9528-00505698bd8b 
   cannot be attached to the node node1 since it is already attached to the node node2*

Я использую longhorn в качестве поставщика и менеджера хранилища. Поэтому я просто отсоединил этот pv в ошибке и перезапустил набор с отслеживанием состояния. На этот раз он автоматически смог правильно подключиться к pv.

Я добавлю ответ, который предотвратит повторение этого.

Короткий ответ

Режимы доступа: Переключение с на .


Чуть подробнее

Вы используете StatefulSet, в котором каждая реплика имеет свое собственное состояние с уникальным постоянным томом (PVC), созданным для каждого модуля. Каждый PVC относится к постоянному тому, для которого вы выбрали режим доступа. .

Что, как вы можете видеть отсюда:

ReadWriteOnce
том может быть смонтирован для чтения и записи одним узлом. Режим доступа ReadWriteOnce по-прежнему позволяет нескольким модулям получать доступ к тому, когда модули работают на одном узле.

Таким образом, в случае K8S Scheduler (из-за приоритетов или расчетов ресурсов или из-за автомасштабирования кластера, который решил переместить модуль на другой узел) - вы получите сообщение об ошибке, что том уже привязан исключительно к одному узлу и не может быть присоединен к другому узлу.

Пожалуйста, рассмотрите возможность использованиягде том может быть смонтирован для чтения и записи многими узлами.

Другие вопросы по тегам