Как прикрепить выпущенный PersistentVolume в Kubernetes - PullRequest
1 голос
/ 30 мая 2019

Вот моя общая цель:

  • Запустить MongoDB

  • Сохранять данные при сбоях / обновлениях модуля и т. Д.

Подход, который я выбрал:

  • K8S Поставщик: Digital Ocean

  • Узлы: 3

  • Создание PVC

  • Создание службы без головы

  • Создание StatefulSet

Вот тупая версия конфигурации:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: some-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: do-block-storage
---
apiVersion: v1
kind: Service
metadata:
  name: some-headless-service
  labels:
    app: my-app
spec:
  ports:
  - port: 27017
    name: my-app-database
  clusterIP: None
  selector:
    app: my-app
    tier: database
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-app-database
  labels:
    app: my-app
    tier: database
spec:
  serviceName: some-headless-service
  replicas: 1
  selector:
    matchLabels:
      app: my-app
      tier: database
  template:
    metadata:
      labels:
        app: my-app
        tier: database
    spec:
      containers:
      - name: my-app-database
        image: mongo:latest
        volumeMounts:
        - name: some-volume
          mountPath: /data
        ports:
        - containerPort: 27017
          name: my-app-database
      volumes:
      - name: some-volume
        persistentVolumeClaim:
          claimName: some-pvc

Это работает, как и ожидалось.Я могу развернуть реплики до 0:

kubectl scale —replicas=0 statefulset/my-app-database

Повернуть обратно:

kubectl scale —replicas=1 statefulset/my-app-database

И данные сохранятся..

Но однажды, когда я возился с масштабированием набора состояний вверх и вниз, я встретил эту ошибку:

Volume is already exclusively attached to one node and can't be attached to another

Будучи новичком в k8s, я удалил PVC и«Воссоздал» тот же:

kubectl delete pvc some-pvc
kubectl apply -f persistent-volume-claims/

statefulset возобновил работу с новым PV, и старый PV был удален, так как persistentVolumeReclaimPolicy был установлен в Delete по умолчанию.

Я установил этот новый PV persistentVolumeReclaimPolicy на Retain, чтобы гарантировать, что данные не будут автоматически удалены ... и я понял: я не уверен, как бы я восстановил этот PV.Ранее, чтобы избежать ошибки «присоединения тома», я удалил PVC, который просто создаст другой новый PV с моей настройкой, и теперь у меня остались данные в этом Released PV.

Мои основные вопросы:

  • Похоже ли это на общий подход к моей цели?

  • Стоит ли добавлять * 1076?* к динамически создаваемому PV, а затем воссоздание нового PVC с этим requestRef, как указано здесь: Можно ли связать PVC с конкретным PV?

  • Должен ли япытаться заставить этот свежий statefulset PVC на самом деле использовать тот старый PV?

  • Имеет ли смысл попытаться подключить старый PV к правильному узлу, и как мне это сделать?что?

1 Ответ

1 голос
/ 30 мая 2019

Если вы хотите использовать StatefulSet с масштабируемостью, ваше хранилище также должно это поддерживать, есть два способа справиться с этим:

  • Если do-block-storage класс хранения поддерживает ReadWriteMany, поместите все данные модуля в один том.

  • Каждый модуль использует разную громкость, добавьте volumeClaimTemplate к своему StatefulSet.spec, тогда k8s создаст PVC как some-pvc-{statefulset_name}-{idx} автоматически:

spec:
  volumeClaimTemplates:
  - metadata:
      name: some-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
      storageClassName: do-block-storage

Обновление:

StatefulSet реплик Необходимо развернуть с mongodb репликацией , тогда каждый модуль в StatefulSet будет иметь одинаковое хранилище данных.

Поэтому, когда контейнер запускает команду mongod, необходимо добавить параметр --replSet={name}. когда все загрузится, выполните команду rs.initiate(), чтобы сообщить mongodb, как обрабатывать репликацию данных. При увеличении или уменьшении StatefulSet выполните команду rs.add() или rs.remove(), чтобы сообщить, что члены mongodb изменились.

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