修改部署在kubernetes上的mongodb的密码



我无法更改部署在k8s上的MongoDB的现有用户的密码,除非我删除数据库,然后用新密码重新创建它。

如何在不删除数据库的情况下使用mongodb状态对象的yaml修改密码?

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongo-db-statefulset
namespace: development
spec:
serviceName: mongo-svc
replicas: 1
selector:
matchLabels:
component: mongo
template:
metadata:
labels:
component: mongo
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mongo
image: mongo:4.0.4
volumeMounts:
- mountPath: /data/db
name: volume 
ports:
- containerPort: 27017
env:
- name: MONGO_INITDB_ROOT_USERNAME
value: admin
- name: MONGO_INITDB_ROOT_PASSWORD
# from secrets
value: password
- name: MONGO_INITDB_DATABASE
value: admin
volumes:
- name: volume
persistentVolumeClaim:
claimName: database-persistent-volume-claim

如果我正确理解了你的问题:

  • 您将secret与您的密码作为环境变量,pod可以通过卷
  • 访问秘密数据。
  • 你更改了秘密密码,但是如果不重新启动,它不会被pod拾取。

根据文档:

环境变量在secret更新之后不会更新,所以如果容器已经在环境变量中使用了secret,那么除非容器重新启动,否则它不会看到secret更新。有第三方解决方案可以在秘密更改时触发重启。

这是一个已知问题。你可以在github上阅读更多关于它的内容。


所以在你改变了秘密密码后,你必须重新启动你的pod来更新这个值,你不必删除它。


正如文档中提到的,当秘密发生变化时,有第三方工具可以触发重启,其中之一是Reloader。

Reloader可以观察ConfigMap和Secret的变化,并在pod上与它们相关的DeploymentConfigs, DeploymentConfigs, Daemonsets和statfulsets进行滚动升级。


重新启动部署的快速方法是使用kubectl rollout restart,它执行一步一步的关闭并重新启动部署或statfulset中的每个容器。

如果您更改了secret中的密码并使用kubectl rollout restart新密码应该可以使用。

@kane的命令示例,我没有声望来添加评论:Kubectl -n namespace rollout restart deployment/name_of_deployment

编辑:我在secret中修改了密码,但是在kubectl rollout restart mongo之后不知何故使用了旧密码,不知道是怎么回事。Edit2:如果我连接到mongo pod,变量MONGO_INITDB_ROOT_PASSWORD显示新密码,但连接到mongo db只适用于旧密码编辑3:我最后做的是:1。保留新值的秘密,不确定它在这一点上是否重要。2. 登录到pod并运行这两个命令:db = db. getsiblingdb ('admin'),然后是db. changeuserpassword ("root", "NEWPASSWORD")只是为了测试这是持久的,我删除了部署并重新创建了它,新密码有效,旧密码不再有效

最新更新