首页 > 解决方案 > kubernetes环境下创建mongodb用户报错

问题描述

我正在尝试创建一个 mongodb 用户以及一个有状态集。这是我的 .yaml 文件:

apiVersion: v1
kind: Service
metadata:
 name: mongo
 labels:
  name: mongo
spec:
 type: NodePort
 ports:
  - port: 27017
    targetPort: 27017
 selector:
  name: mongo
---
apiVersion: v1
kind: Secret
metadata:
  name: admin-secret
  # corresponds to user.spec.passwordSecretKeyRef.name
type: Opaque
stringData:
  password: pass1
  # corresponds to user.spec.passwordSecretKeyRef.key
---
apiVersion: mongodb.com/v1
kind: MongoDBUser
metadata:
  name: admin
spec:
  passwordSecretKeyRef:
    name: admin-secret
    # Match to metadata.name of the User Secret
    key: password
  username: admin
  db: "admin" #
  mongodbResourceRef:
    name: mongo
    # Match to MongoDB resource using authenticaiton
  roles:
    - db: "admin"
      name: "clusterAdmin"
    - db: "admin"
      name: "userAdminAnyDatabase"
    - db: "admin"
      name: "readWrite"
    - db: "admin"
      name: "userAdminAnyDatabase"
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongo
spec:
  serviceName: "mongo"
  replicas: 2
  selector:
    matchLabels:
      name: mongo
  template:
    metadata:
      labels:
        name: mongo
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      # - envFrom:
      #   - secretRef:
      #       name: mongo-secret
      - image: mongo
        name: mongodb
        command:
          - mongod
          - "--replSet"
          - rs0
          - "--bind_ip" 
          - 0.0.0.0
        ports:
        - containerPort: 27017

之前我使用秘密创建了一个 mongo 用户:

...
spec:
  containers:
  - envFrom:
    - secretRef:
      name: mongo-secret
...

但是一旦我将 spec.template.spec.containers.command 添加到 StatefulSet,这种方法就不再有效。然后我添加了 Secret 和 MongoDBUser 但我开始收到此错误:

unable to recognize "mongo.yaml": no matches for kind "MongoDBUser" in version "mongodb.com/v1"

在kubernetes中创建具有少量副本的StatefulSet时如何自动创建mongodb用户?

标签: mongodbkubernetes

解决方案


您的 yaml 文件中的资源之一是指kind集群中不存在的资源。

您可以通过运行命令来检查这一点kubectl api-resources | grep mongo -i

具体来说,它是 kind 的资源MongoDBUser。此 API 资源类型是MongoDB Enterprise Kubernetes Operator的一部分。

您还没有说明您是否在集群中使用它,但您收到的错误表明未安装操作员的 CRD,因此无法使用。

MongoDB Kubernetes Operator 是 Kubernetes 的付费企业包。如果您无法从 MongoDB 访问此企业包,您也可以自己安装社区版,方法是自己设置所有资源或使用Helm将其安装为包。使用 Helm 可以显着更轻松地管理资源,尤其是在配置、升级、重新安装或卸载方面。现有的 Helm 图表是开源的,还允许将 MongDB 作为独立实例、副本集或分片集群运行。

作为参考,Bitnami提供了一个 MongoDB Standalone 或副本集 helm chart,它似乎在最新的 MongoDB 版本上并且定期维护。也有这个,但它是在旧版本的 MongoDB 上,似乎没有受到太多关注。


推荐阅读