我正在尝试在kubernetes上为mongodb创建用户名/密码。但是似乎MONGO_INITDB_ROOT_USERNAME / PASSWORD无法正常工作或无法正常工作,因为我无法使用以下凭据登录:
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: mongotest
spec:
revisionHistoryLimit: 3
selector:
matchLabels:
app: mongotest
replicas: 1
podManagementPolicy: Parallel
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: mongotest
spec:
hostname: mongotest
containers:
- name: mongotest
image: mongo
imagePullPolicy: Always
restartPolicy: Always
env:
- name: "MONGO_DATA_DIR"
value: "/data/db"
- name: "MONGO_LOG_DIR"
value: "/data/logs"
- name: MONGO_INITDB_ROOT_USERNAME
value: test
- name: MONGO_INITDB_ROOT_PASSWORD
value: test
- name: MONGO_INITDB_DATABASE
value: admin
lifecycle:
postStart:
exec:
command:
- /bin/sh
- -c
- >
mongo --eval 'db.auth('test', 'test');db = db.getSiblingDB("admin"); db.createUser({ user: "admin", pwd: "test", roles: [{ role: "root", db: "admin" }]});'
ports:
- name: port27017
containerPort: 27017
答案 0 :(得分:0)
从评论中收集所有信息: 身份验证失败的原因是由于用户名/密码无法识别。 删除生命周期部分的工作原理是,它会禁用身份验证,并且用户可以访问MongoDB并创建新用户。
如果您不提供这两个变量或不设置--auth 标记您自己的自定义用户设置,则MongoDB将不需要 身份验证。有关所描述功能的更多详细信息 在这里,请参阅官方文档中的部分 详细描述身份验证和授权。
遵循MongoDB documentation:
使用mongo命令行身份验证选项(-用户名, --password和--authenticationDatabase)连接到mongod或mongos实例时,或
首先连接到mongod或mongos实例,然后运行 对命令进行身份验证命令或db.auth()方法 身份验证数据库。
因此,在docker的情况下,您可以运行以下命令:
docker run -d --name some-mongo -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret mongo
在Kubernetes中,因为它具有不同的字符,所以您可以使容器在配置yaml中运行特定的命令:
例如:
containers:
- image: mongo
name: mongoadmin
command: ["mongo", "--auth"]
尽管最安全的方法是使用机密,但因为在环境变量中传递用户名和密码不是最佳实践。
您可以在官方documentation中找到有关机密的更多信息。在Docker Secrets第here章中,还有更多关于Docker的观点。