如何将 Kubernetes 配置映射和机密设置为 mongodb 环境变量

时间:2021-05-10 11:29:20

标签: mongodb kubernetes

我正在尝试使用 env ConfigMapSecret 设置 mongo 的两个 MONGO_INITDB_ROOT_USERNAME 变量 - MONGO_INITDB_ROOT_PASSWORDkubernetes 如下:

当我不使用配置映射和密码时,即我对用户名和密码进行硬编码时,它可以工作,但是当我尝试用配置映射和密码替换它时,它说

<块引用>

'身份验证失败。'

我的用户名和密码是一样的,就是admin

这是这些 obects 的 yaml 定义,有人能帮我看看有什么问题吗?

apiVersion: v1
kind: ConfigMap
metadata:
  name: mongodb-username
data:
  username: admin
---
apiVersion: v1
kind: Secret
metadata:
  name: mongodb-password
data:
  password: YWRtaW4K  
type: Opaque
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongodbtest
spec:
  # serviceName: mongodbtest
  replicas: 1
  selector:
    matchLabels:
      app: mongodbtest
  template:
    metadata:
      labels:
        app: mongodbtest
        selector: mongodbtest
    spec:
      containers:
      - name: mongodbtest
        image: mongo:3       
        # env:
        #   - name: MONGO_INITDB_ROOT_USERNAME
        #     value: admin
        #   - name: MONGO_INITDB_ROOT_PASSWORD
        #     value: admin
        env:
          - name: MONGO_INITDB_ROOT_USERNAME
            valueFrom:
              configMapKeyRef:
                name: mongodb-username
                key: username
          - name: MONGO_INITDB_ROOT_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mongodb-password
                key: password

3 个答案:

答案 0 :(得分:1)

最后我在几个小时后找到了解决方案,这不是我在 kubernetes 方面所做的,而是在我进行 base64 编码时。

正确的编码方式是使用以下命令:

echo -n 'admin' | base64

这就是我的问题。

答案 1 :(得分:0)

apiVersion: v1
data:
  MONGO_INITDB_ROOT_USERNAME: root
  MONGO_INITDB_ROOT_PASSWORD : password
kind: ConfigMap
metadata:
  name: mongo-cred
  namespace: default

将其注入到部署中

envFrom:
        - configMapRef:
            name: mongo-cred

部署将类似于

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongodbtest
spec:
  # serviceName: mongodbtest
  replicas: 1
  selector:
    matchLabels:
      app: mongodbtest
  template:
    metadata:
      labels:
        app: mongodbtest
        selector: mongodbtest
    spec:
      containers:
      - name: mongodbtest
        image: mongo:3    
      envFrom:
        - configMapRef:
            name: mongo-cred 

如果您想秘密保存数据,最好的做法是使用加密 base64 存储数据和敏感数据。

envFrom:
            - secretRef:
                name: mongo-cred 

你可以用

创建秘密
apiVersion: v1
data:
  MONGO_INITDB_ROOT_USERNAME: YWRtaW4K #base 64 encoded
  MONGO_INITDB_ROOT_PASSWORD : YWRtaW4K
kind: secret
type: Opaque
metadata:
  name: mongo-cred
  namespace: default

答案 2 :(得分:0)

您的部署 yaml 没问题,只需将 spec.containers[0].env 更改为 spec.containers[0].envFrom

    spec:
      containers:
      - name: mongodbtest
        image: mongo:3       
        envFrom:
          - configMapRef:
              name: mongodb-username
          - secretRef:
              name: mongodb-password

这会将您的密钥和 configmap 的所有密钥作为部署中的环境变量。