请参见下面的编辑以获取更多信息。
长话短说,我正试图让Unifi Controller在我的家庭Kubernetes集群上运行。这样做时,我需要分散MongoDB数据库的权限,因为在Kubernetes上将MongoDB实例与每个副本 bundle 在一起会导致数据库崩溃。到目前为止,这是我的项目:https://github.com/zimmertr/Kubernetes-Manifests/tree/unifi_mongodb_separation/Unifi_Controller
为此,我编写了以下脚本,该脚本在MongoDB container的供应时间运行:
mongo \
--username ubnt \
--password "{{ mongodb_password }}" \
--authenticationDatabase admin \
--eval 'db.getSiblingDB("unifi").createUser({user: "ubnt", pwd: "{{ mongodb_password }}", roles: [{role: "readWrite", db: "unifi"}]})'
mongo \
--username ubnt \
--password "{{ mongodb_password }}" \
--authenticationDatabase admin \
--eval 'db.getSiblingDB("unifi_stat").createUser({user: "ubnt", pwd: "{{ mongodb_password }}", roles: [{role: "readWrite", db: "unifi_stat"}]})'
然后,我已配置Unifi Controller ,以通过如下配置的卷安装的
system.properties
文件与数据库通信:# Inform IP Address
system_ip={{ load_balancer_ip }}
# Autobackup directory
autobackup.dir=/backups
# External MongoDB information
db.mongo.local=false
db.mongo.uri=mongodb://ubnt:{{ mongodb_password }}@unifi-controller-mongodb:27017/unifi
statdb.mongo.uri=mongodb://ubnt:{{ mongodb_password }}@unifi-controller-mongodb:27017/unifi_stat
unifi.db.name=unifi
这被配置为instructed by Ubiquiti.
所有这些都有效,当Kubernetes部署启动时,我在日志中看到Unifi Controller连接到MongoDB实例。此外,如果我手动连接到MongoDB数据库并运行
show collections
,则可以看到已经创建了许多新集合。但是,Unifi Controller在此处停止生成日志。如果我在容器的后台手动停止正在运行Unifi Controller的
jar
文件,然后重新启动它,则会生成以下堆栈跟踪:$> s6-setuidgid abc java -Xmx1024M -jar /usr/lib/unifi/lib/ace.jar start
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter INFO: destroy called
Exception in thread "launcher" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'Ò00000' defined in class com.ubnt.service.AppContext: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [com.ubnt.service.P.D com.ubnt.service.AppContext.Ò00000()] threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dbService' defined in class com.ubnt.service.AppContext: Invocation of init method failed; nested exception is com.mongodb.CommandFailureException: { "serverUsed" : "unifi-controller-mongodb:27017" , "ok" : 0.0 , "errmsg" : "not authorized on unifi to execute command { dropDatabase: 1 }" , "code" : 13 , "codeName" : "Unauthorized"}
这里的关键要素是
这就是我对MongoDB的理解结束的地方。我的问题开始了。我认为,Unifi Controller在连接到数据库并创建集合后不会继续启动或记录任何其他消息的原因是,它默默地无法对MongoDB数据库执行操作。为此,它没有必需的权限。
在配置MongoDB Docker容器时,我指定了
MONGO_INITDB_ROOT_USERNAME
和MONGO_INITDB_ROOT_PASSWORD
环境变量。我相信可以打开auth
模式。我可以通过为这些变量提供的用户名和密码连接到MongoDB的admin
身份验证数据库,从而重申了这一信念。但是,基于我上面发布的用于创建数据库并将角色
readWrite
分配给ubnt
用户的脚本,我很好奇我应该如何为ubnt
用户提供删除数据库所需的必要权限。如果我将readWrite
换成其他角色,例如root
和dbAdminAnyDatabase
,则命令将失败。我必须做什么才能使我的 super 用户删除
unifi
和unifi_stat
数据库?或者我必须更改我的连接字符串以防止这种情况发生?我有点数据库管理员菜鸟。继续编辑:
我已经将
ubnt
和unifi
上归属于unifi_stat
用户的角色更新为dbAdmin
而不是readWrite
。并进一步发展。#!/bin/bash
mongo \
--username ubnt \
--password "{{ mongodb_password }}" \
--authenticationDatabase admin \
--eval 'db.createUser({user: "ubnt", pwd: "{{ mongodb_password }}", roles: [{role: "dbAdmin", db: "unifi"}]})'
mongo \
--username ubnt \
--password "{{ mongodb_password }}" \
--authenticationDatabase admin \
--eval 'db.createUser({user: "ubnt", pwd: "{{ mongodb_password }}", roles: [{role: "dbAdmin", db: "unifi_stat"}]})'
但是,Unifi Controller 的行为仍然很奇怪。现在,它只是在日志文件中循环运行:
2019-02-10 22:33:45,449] <launcher> INFO system - ======================================================================
[2019-02-10 22:33:45,450] <launcher> INFO system - UniFi 5.6.40 (build atag_5.6.40_10370 - release) is started
[2019-02-10 22:33:45,450] <launcher> INFO system - ======================================================================
[2019-02-10 22:33:45,457] <launcher> INFO system - BASE dir:/usr/lib/unifi
[2019-02-10 22:33:45,464] <launcher> INFO system - Current System IP: 192.168.0.1
[2019-02-10 22:33:45,465] <launcher> INFO system - Hostname: unifi-controller-5bb95c7688-bzp4z
[2019-02-10 22:33:48,635] <launcher> INFO db - waiting for db connection...
[2019-02-10 22:33:49,173] <launcher> INFO db - Connecting to mongodb://ubnt:PASSWORD@unifi-controller-mongodb:27017/unifi
[2019-02-10 22:33:49,526] <launcher> DEBUG db - db connected (3.4.19@unifi-controller-mongodb:27017)
[2019-02-10 22:33:49,534] <launcher> INFO db - *** Factory Default *** Database exists. Drop it
[2019-02-10 22:33:52,391] <launcher> INFO db - waiting for db connection...
[2019-02-10 22:33:52,896] <launcher> DEBUG db - db connected (3.4.19@unifi-controller-mongodb:27017)
[2019-02-10 22:34:13,292] <launcher> INFO system - ======================================================================
[2019-02-10 22:34:13,295] <launcher> INFO system - UniFi 5.6.40 (build atag_5.6.40_10370 - release) is started
[2019-02-10 22:34:13,295] <launcher> INFO system - ======================================================================
[2019-02-10 22:34:13,303] <launcher> INFO system - BASE dir:/usr/lib/unifi
[2019-02-10 22:34:13,312] <launcher> INFO system - Current System IP: 192.168.0.1
[2019-02-10 22:34:13,313] <launcher> INFO system - Hostname: unifi-controller-5bb95c7688-bzp4z
[2019-02-10 22:34:16,781] <launcher> INFO db - waiting for db connection...
[2019-02-10 22:34:17,300] <launcher> INFO db - Connecting to mongodb://ubnt:PASSWORD@unifi-controller-mongodb:27017/unifi
[2019-02-10 22:34:17,640] <launcher> DEBUG db - db connected (3.4.19@unifi-controller-mongodb:27017)
[2019-02-10 22:34:17,656] <launcher> INFO db - *** Factory Default *** Database exists. Drop it
[2019-02-10 22:34:20,463] <launcher> INFO db - waiting for db connection...
[2019-02-10 22:34:20,969] <launcher> DEBUG db - db connected (3.4.19@unifi-controller-mongodb:27017)
所以我很茫然。不确定为什么要删除数据库吗? Unifi是否要在MongoDB实例上从头开始创建数据库?
unifi
和unifi_stat
数据库,则Unifi Controller无法连接到它们,并且日志停在那里。 ubnt
用户dbAdmin
赋予它们,那么Unifi似乎只是一遍又一遍地丢弃它们。如上所示。 ubnt
用户readWrite
赋予它们,那么Unifi只会连接到数据库,创建集合,然后默默地停顿,没有明显的原因。而且,如果我尝试手动执行上面提到的jar
文件,则它会留下描述缺少删除数据库所需权限的stacktrace。 如果有人可以提供一些文档,说明如何为Unifi Controller使用外部MongoDB数据库做准备,这对我将是非常有益的。我只能在论坛中找到帖子,一名员工讨论了如何配置 Controller 的system.properties以指向外部实例。
最佳答案
原来,这是MetalLB中的一个错误,该服务使我将裸机kubernetes服务暴露给我的网络。
https://github.com/google/metallb/issues/399
现在一切正常。但是,不幸的是,将MongoDB分散化并不能解决多个副本带来的问题。
但是我仍然认为容器中有些不对劲,因为它报告service unifi status
是unifi is not running
。尽管实际上它正在运行。