#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