Постоянный объем не используется в кластере Kubernetes, размещенном на рабочем столе Docker (macOS)

#mongodb #macos #kubernetes #docker-desktop #persistent-volumes

Вопрос:

Я развернул (с помощью Helm) некоторые службы в кластере K8s, размещенном на Docker Desktop (macOS). Одной из «служб» является MongoDB, для которой я пытаюсь настроить постоянный объем, чтобы фактические данные сохранялись в локальном каталоге macOS между установками кластера (повторными) (или заменами модулей MongoDB). Все «работает» само по себе, но процесс контейнера MongoDB продолжает настраивать свой локальный каталог /данные/бд, как будто на самом деле ничего не настроено с точки зрения постоянных томов. Я уже некоторое время дергаю себя за волосы и подумал, что лишняя пара глаз может заметить, что не так или чего не хватает.

У меня развернуто несколько других ресурсов, например, небольшая серверная служба на базе Micronaut, которая предоставляет API для чтения из экземпляра MongoDB. Все это работает просто отлично.

Вот дескрипторы, используемые для MongoDB:

Настойчивое требование:

 apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: persons-mongodb-pvc
  namespace: fo
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
 

Развертывание:

 kind: Deployment
metadata:
  name: fo-persons-mongodb
  namespace: fo
  labels:
    app: fo-persons-mongodb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fo-persons-mongodb
  template:
    metadata:
      labels:
        app: fo-persons-mongodb
    spec:
      volumes:
        - name: fo-persons-mongodb-volume-pvc
          persistentVolumeClaim:
            claimName: persons-mongodb-pvc
      containers:
        - name: fo-persons-mongodb
          image: mongo
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 27017
          volumeMounts:
            - name: fo-persons-mongodb-volume-pvc
              mountPath: "/data/db"
 

Обслуживание:

 apiVersion: v1
kind: Service
metadata:
  name: fo-persons-mongodb
  namespace: fo
spec:
  type: ClusterIP
  selector:
    app: fo-persons-mongodb
  ports:
    - protocol: TCP
      port: 27017
      targetPort: 27017
 

Класс хранения:

 apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
 

Постоянный объем:

 apiVersion: v1
kind: PersistentVolume
metadata:
  name: fo-persons-mongodb-volume
  labels:
    type: local
spec:
  storageClassName: local-storage
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /Users/mike/kubernetes/fo/persons/mongodb
 

Ответ №1:

Хорошо! Я заставил его работать. Похоже, я совершил две ошибки. Ниже приведены обновленные дескрипторы для PersistentVolumeClaim и PersistentVolume:

Ошибка № 1: Не задано имя класса хранилища в спецификации PersistentVolumeClaim:

 apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: persons-mongodb-pvc
  namespace: fo
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: local-storage
 

Ошибка №2: Не задано сродство к узлу и не используется local.path вместо hostPath, как в PersistentVolume:

 apiVersion: v1
kind: PersistentVolume
metadata:
  name: fo-persons-mongodb-volume
  labels:
    type: local
spec:
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  local:
    path: /Users/mike/kubernetes/fo/persons/mongodb
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - docker-desktop