PersistentVolume 未在 Docker 桌面 (MacOS) 托管的 Kubernetes 集群中使用

PersistentVolume not utilized in Docker Desktop (MacOS) hosted Kubernetes cluster

我已经在 Docker 托管的 K8s 集群 中部署(使用 Helm)一些服务桌面MacOS)。其中一项“服务”是 MongoDB,我正在尝试为其设置 PersistedVolume,以便实际数据将保留在集群(重新)安装(或 MongoDB 吊舱更换)。一切本身都“有效”,但 MongoDB 容器进程不断设置其本地目录 /data/db,就好像在持久卷方面没有真正设置任何东西一样。我已经纠结了一段时间了,我想多一双眼睛可能会发现错误或遗漏的地方。

我部署了其他几个资源,例如一个基于 Micronaut 的小型后端服务,它公开了一个 API 以从 MongoDB 实例中读取。所有这些都很好。

这里是MongoDB涉及的描述符:

PersistentVolumeClaim:

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

好的!我让它工作了。看来我犯了两个错误。以下是 PersistentVolumeClaim 和 PersistentVolume 的更新描述符:

错误 #1: 未在 PersistentVolumeClaim 的规范中设置 storageClassName:

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