【问题标题】:Error when creating mongodb user in kubernetes environmentkubernetes环境下创建mongodb用户报错
【发布时间】:2020-05-19 18:29:27
【问题描述】:

我正在尝试创建一个 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用户?

【问题讨论】:

标签: mongodb kubernetes


【解决方案1】:

您的 yaml 文件中的一个资源引用了您的集群中不存在的 kind

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

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

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

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

作为参考,Bitnami provides a MongoDB Standalone or replica set helm chart 似乎在最新的 MongoDB 版本上并定期维护。还有this one,不过是在老版本的MongoDB上,好像没有受到太多关注。

【讨论】:

  • 所以我正在尝试使用 Bitnami 的掌舵图,但它不会为我创建副本。当我调用 helm install ...第一个副本卡在挂起状态。 pvc也是如此。我创建了本地 PersistentVolume 和 StorageClass 资源,但问题仍然存在。这是图表中的问题还是我错过了一些先决条件?
  • 您需要检查可以设置的舵图的值。最值得注意的是,它们有一个 values-production.yaml 文件,默认情况下将 K8s 有状态集启用为 MongoDB 副本集。它只是启用属性。我记得是否默认启用持久性,如果不只是将persistence.enabled 设置为true。如果启用,它会自动创建 PVC 和 PV,如果在云平台上运行,这也会创建物理磁盘。如果它没有启动,请查看 k8s 事件并检查 pod 状态、事件和日志。可能没有找到您的 PVC。
  • 这是一个示例命令,用于在已下载图表的位置安装图表。 helm install --name my-mongodb-install --namespace db -f mongodb-bitnami/values-production.yaml -f my-custom-overrides.yaml --set persistence.size="8Gi" --set mongodbRootPassword=changeit ./mongodb-bitnami
  • 只是一个警告,如果你打算从集群外部访问 MongoDB 服务器,你会遇到一些问题。可以通过使用 nginx-ingress 并启用 udp 流量在端口 27017 上进入集群。但是对于副本集,这真的很复杂,因为 MongoDB 集中每个节点的 DNS 名称是在安装时分配的,并且只能从内部解析集群。
  • 更新之前的评论:Bitnami的最新版本的MongoDB Helm图表变化很大,解决了外部访问问题。现在效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 2023-03-14
  • 1970-01-01
  • 2021-10-18
相关资源
最近更新 更多