Kubernetes部署MongoDB集群(五):打开用户数据库TLS通信加密和Auth授权
本文为系列第五部分,用生成的自签名证书打开userdb的TLS和AUTH,并且完成userdb的公网域名访问。
整个系列:
本文为系列第五部分,用生成的自签名证书打开userdb的TLS和AUTH,并且完成userdb的公网域名访问。
整个系列:
本文为系列第四部分,相对独立,先生成一个自签名CA证书,然后生成MongoDB各个server证书。
整个系列:
自签名证书不推荐在生产环境使用,虽然它可以保证通信过程中的加密,但不能避免中间人攻击。Public Key Infrastructure (PKI)相关的内容也不在本文的讨论范围,这里假设读者对PKI已有基本的认识。
本文为系列第三部分,使用第二部分创建好的userdb
可以从公网访问,方法是通过Kubernetes
Service暴露userdb pod到公网上。
整个系列:
官方文档是通过NodePort的方式暴露给公网,而我们这里是通过创建service的方式完成,好处是这种方式不必管理pod和node之间的端口映射,也不必担心pod被调度到不同node上之后IP的改变。不知道官方使用NodePort进行服务暴露是基于怎样的考虑。 # Connect to a MongoDB Database Resource from Outside Kubernetes
本文为系列第二部分,使用第一部分安装好的MongoDB Ops Manager创建用户数据库。
整个系列:
所谓的Application Database
是MongoDB Ops
Manager的后端DB,并不能用来存放用户数据,所以我们需要用Ops
Manager创建用户数据库。使用Ops
Manager创建的MongoDB叫做Deployment
,注意此Deployment
是MongoDB Deployment
,与kubernetes的Deployment
不是一码事。
简单起见,本文以创建一个3实例的MongoDB
userdb
为例,Sharding Cluster
由于组件复杂,server数量更多,配置比ReplicaSet
要麻烦些,但配置过程基本一致。可参考:
MongoDB Ops
Manager部署Sharded Cluster
MongoDB的入门配置门槛(单机)很低,但如果想达到生产环境的要求则有些技术含量。生产环境的配置要求包括Replica Set、Sharding、Scale up/down、数据备份、通信加密TLS和指标实时监控等。配置这些功能比较繁琐,有不少坑要踩。那么有没有好用的工具帮我们配置和管理呢?
MongoDB是个分布式系统,且需要动态的增加或删除节点,那么与kubernetes结合使用则是珠联璧合。结合之后就需要一套kubernetes工具对其进行管理,它就是MongoDB Enterprise Kubernetes Operator
,更进一步,可以使用MongoDB Ops Manager
完成上面所有生产环境的配置需求。
整个配置流程比较繁杂,为不使一篇万字长文吓到读者,写成了系列教程,力求每一块简明内聚:
阅读教程前提:有Kubernetes集群,了解deployment/service/statefulset含义,熟悉kubectl基本操作。
本文为系列第一部分,简介MongoDB Ops Manager Kubernetes的构成,以及如何安装MongoDB Ops Manager。
如果你按官方文档 Configure mongod and mongos for TLS/SSL 配置MongoDB证书,可能会遇到如下问题:
{"t":{"$date":"2020-11-30T08:02:19.406+00:00"},"s":"E", "c":"NETWORK", "id":23248, "ctx":"main","msg":"Cannot read certificate file","attr":{"keyFile":"/etc/ssl/testserver1.pem","error":"error:0200100D:system library:fopen:Permission denied"}}
{"t":{"$date":"2020-11-30T08:02:19.406+00:00"},"s":"F", "c":"CONTROL", "id":20574, "ctx":"main","msg":"Error during global initialization","attr":{"error":{"code":140,"codeName":"InvalidSSLConfiguration","errmsg":"Can not set up PEM key file."}}}
or
{"t":{"$date":"2020-11-30T08:01:14.545+00:00"},"s":"I", "c":"ACCESS", "id":20254, "ctx":"main","msg":"Read security file failed","attr":{"error":{"code":30,"codeName":"InvalidPath","errmsg":"permissions on / are too open"}}}
真难伺候,一会儿没权限读证书,一会儿权限太开放了,到底证书要什么权限?官方文档没加个tips解释这些细节,可能假设用户对PKI和证书这套东西非常熟悉。
运行mongod的用户是mongodb
,所以看起来证书权限需要是:能让用户mongodb
读此证书但不能修改。
When you setup TLS/SSL for MongoDB Configure mongod and mongos for TLS/SSL, you might encounter the following errors:
{"t":{"$date":"2020-11-30T08:02:19.406+00:00"},"s":"E", "c":"NETWORK", "id":23248, "ctx":"main","msg":"Cannot read certificate file","attr":{"keyFile":"/etc/ssl/testserver1.pem","error":"error:0200100D:system library:fopen:Permission denied"}}
{"t":{"$date":"2020-11-30T08:02:19.406+00:00"},"s":"F", "c":"CONTROL", "id":20574, "ctx":"main","msg":"Error during global initialization","attr":{"error":{"code":140,"codeName":"InvalidSSLConfiguration","errmsg":"Can not set up PEM key file."}}}
or
{"t":{"$date":"2020-11-30T08:01:14.545+00:00"},"s":"I", "c":"ACCESS", "id":20254, "ctx":"main","msg":"Read security file failed","attr":{"error":{"code":30,"codeName":"InvalidPath","errmsg":"permissions on / are too open"}}}
So what's the right ownership and permission for the certificate pem
file? The answer is: the pem file should have read access but no
write access for the user mongodb
.
对一个DBA来说监控mysql服务器的性能指标是非常重要的。我们可以通过mysqlbench中的Server
Status来轻松监测服务器最近一段时间的状态。但是这些指标具体代表了什么含义?比如,Selects per second
和Innodb reads per second
的区别是什么?如何评估服务器当前写入的性能?
下图展示了一个运行中的服务器性能状态:
Monitoring mysql server metrics is crucial for a DBA. Typically, we
can simply monitor the recent server status summary through mysqlbench.
But what's the meaning for these metrics? Some of them are
self-explained such as connections
and traffic
while others are not. For example, what's the difference between
Selects per second
and
Innodb reads per second
? How to measure the write
performance?
The following figure illustrates the serve status: