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

时间:2020-07-23 05:38:21

标签: mongodb kubernetes

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

但是当我停止Pod(或删除并应用mongodb.yaml)时,再次启动,那么我第一次创建示例文档的地方并没有列出相同的数据库,因此找不到该示例文档也是

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

这是我的配置

volume.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"

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

2 个答案:

答案 0 :(得分:3)

  1. 我没有看到与您的mongo-claim0 matching相匹配的mongo-pv PersistentVolumeClaim。无论如何,请将这些add添加到PVC中,以将PV回收策略从Retain更改为Delete

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

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

  2. 这些:

    kubectl port-forward service/mongo 27017:27017

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

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

    mongodb://username:password@mongo:27017/dbname_?
    

    mongodb://username:password@mongo.<K8s-namespace>.svc.cluster.local:27017/dbname_?
    

✌️<​​/ p>

答案 1 :(得分:1)

  1. 您正在使用主机路径卷,并且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_?”