如何在 Kubernetes 中使用持久卷部署 MongoDB?

mao*_*ets 4 mongodb kubernetes

我正在尝试使用基本身份验证将 MongoDB 设置为具有持久卷的 minikube 上的独立服务器。在设置配置时,我可以看到 Mongodb 服务和 pod 启动并运行。我还可以使用在 secrets 中设置的用户名/密码登录到 mongo shell。我还可以在 mongo shell 中成功插入示例文档。

但是,当我停止 pod(或删除并应用 mongodb.yaml)时,重新开始,然后我没有看到在我第一次创建示例文档的地方列出了相同的数据库,因此我也没有找到该示例文档。

  1. 我是否可以获得关于我是否没有正确设置卷以在 pod 生命周期之外将数据保存在 mongo 中的反馈?
  2. 如果用户名/密码是admin/admin,我如何从运行 minikube 的 Mac 从 MongoDB Compass 连接到 mongo?
  3. 如果用户名/密码是admin/admin,我如何从运行在同一集群上的另一个 node.js 应用程序连接到 mongo?

这是我的配置

卷.yaml

kind: PersistentVolume
apiVersion: v1
metadata:
 name: mongo-pv
 labels:
  type: local
spec:
 storageClassName: manual
 capacity:
  storage: 1Gi
 accessModes:
  - ReadWriteOnce
 hostPath:
  path: "/mnt/mongo_data"
Run Code Online (Sandbox Code Playgroud)

mongodb.yaml

apiVersion: v1
data:
  MONGO_INITDB_ROOT_USERNAME: YWRtaW4=
  MONGO_INITDB_ROOT_PASSWORD: YWRtaW4=
kind: Secret
metadata:
  name: mongodb-secrets
type: Opaque
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: mongo-claim0
  name: mongo-claim0
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: mongo
  name: mongo
spec:
  serviceName: mongo
  replicas: 1
  selector:
    matchLabels:
      app: mongo
  template:
    metadata:
      labels:
        app: mongo
    spec:
      containers:
      - env:
        - name: MONGO_INITDB_ROOT_USERNAME
          valueFrom:
            secretKeyRef:
              name: mongodb-secrets
              key: MONGO_INITDB_ROOT_USERNAME
        - name: MONGO_INITDB_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mongodb-secrets
              key: MONGO_INITDB_ROOT_PASSWORD
        image: mongo
        imagePullPolicy: ""
        name: mongo
        ports:
        - containerPort: 27017
        resources: {}
        volumeMounts:
        - mountPath: /data/db
          name: mongo-claim0
      restartPolicy: Always
      serviceAccountName: ""  
      volumes:
      - name: mongo-claim0
        persistentVolumeClaim:
          claimName: mongo-claim0
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: mongo
  name: mongo
spec:
  ports:
  - port: 27017
    targetPort: 27017
  clusterIP: None
  selector:
    app: mongo
Run Code Online (Sandbox Code Playgroud)

Ric*_*ico 5

  1. 我没有看到mongo-claim0PersistentVolumeClaim 与您的mongo-pv ?匹配。无论如何,添加这些?到您的 PVC 以将 PV 回收策略更改RetainDelete

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      labels:
        app: mongo-claim0
      name: mongo-claim0
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: manual 
      resources:
        requests:
          storage: 1Gi
    
    Run Code Online (Sandbox Code Playgroud)
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: manual
    provisioner: k8s.io/minikube-hostpath
    reclaimPolicy: Retain 
    volumeBindingMode: Immediate
    
    Run Code Online (Sandbox Code Playgroud)

    注意:官方不支持本地卷。

  2. 这些:

    kubectl port-forward service/mongo 27017:27017.

    minikube service mongo --url 也可以工作,但会给你一个随机的本地端口。

  3. 由于您有一个副本,因此您可以使用:

    mongodb://username:password@mongo:27017/dbname_?
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    mongodb://username:password@mongo.<K8s-namespace>.svc.cluster.local:27017/dbname_?
    
    Run Code Online (Sandbox Code Playgroud)

??


Tar*_*sla 4

  1. 您正在使用 hostpath 卷,hostPath 类型卷指的是您的 Pod 计划运行的节点(VM/机器)上的目录。因此您需要至少在该节点上创建此目录。您无法找到目录的可能原因是您的 Pod 被调度在不同的节点上。为了确保您的 Pod 一致地调度在该特定节点上,您需要在 PodTemplate 中设置spec.nodeSelector 。

  2. 目前您的服务是无头的,只能从集群访问。使用公开您的服务

kubectl 公开 sts mongo --type=NodePort --port=xxx

然后做

minikube 服务 mongo --url

使用输出从 Compass 连接到 mongodb,因为这将为您提供要连接的 IP 和端口

  1. 要在同一集群中的 Nodejs 应用程序中使用它,请使用连接字符串:

“mongodb://mongo-0.mongo:27017/dbname_?”