适用于Kubernetes的MongoDB Enterprise Operator入门
介绍
开源社区已经建立了许多在Kubernetes中部署MongoDB的实现。 但是,这些实施缺少关键的企业功能,例如-备份,自动化,警报和监视。 从MongoDB Ops Manager v4.0开始,MongoDB通过备份,自动化,警报和监视,正式支持在Kubernetes中管理和部署MongoDB。 感谢“ 用于Kubernetes的MongoDB企业运营商(测试版) ”集成了Kubernetes和MongoDB Ops Manager。
这是一个由多部分组成的系列文章, 精通MongoDB的众多文章之一-每天一个小贴士 ,专门为您创建,旨在通过学习“每天一个小贴士”来掌握MongoDB 。 在一些系列文章中,我想提供各种技巧来帮助您掌握Kubernetes中的MongoDB。 本文讨论了用于Kubernetes的MongoDB Enterprise Operator ,这是MongoDB Ops Manager v4.0的新功能-其应用程序,用例场景以及最后的动手实验练习。
掌握-Kubernetes中的MongoDB
MongoDB Enterprise Operator中的内容
用于Kubernetes的MongoDB企业操作员是MongoDB特定于应用程序的控制器,它扩展了Kubernetes API以代表Kubernetes用户创建,配置和管理MongoDB部署实例。 操作员可以通过访问Kubernetes API和MongoDB Ops Manager API来部署和管理MongoDB。 它通过触发一系列操作来实现所需的状态来自动执行常见任务。 例如,当您创建MongoDB Kubernetes资源MongoDbReplicaSet时 ,该运算符
- 为MongoDB副本集自动设置StatefulSet
- 在MongoDB Ops Manager项目中创建部署
- 配置Ops Manager进行备份,自动化,警报和监视(BAAM!)
- 将来还会有更多功能。
MongoDB企业运营商架构图
适用于Kubernetes的MongoDB企业运营商架构图
上图显示了该过程中涉及的各种组件,并说明了它们如何相互影响。 MongoDB企业运营商在Kubernetes集群中运行,并拦截创建MongoDB资源的请求。 收到请求后,它将触发一系列操作,如下所示
- 读取包含Ops Manager baseUri和projectId的ConfigMap
- 读取包含Ops Manager publicApiKey的机密
- 使用MongoDB容器映像配置MongoDB副本集所需的Pod
- 每个MongoDB容器映像都运行一个Ops Manager自动化代理
- Ops Manager自动化代理针对其配置状态联系Ops Manager
- Ops Manager给出每个代理的所需状态
- Ops Manager自动化代理致力于达到目标状态。
- 代理下载/安装mongod,监视和备份代理
动手练习
该实验练习可帮助您了解如何使用MongoDB Enterprise Operator for Kubernetes使用kubectl部署MongoDB副本集。
设置您的本地环境
我创建了一些帮助程序脚本以在Kubernetes中部署MongoDB。 首先,让我们开始从我的GitHub存储库下载源代码。设置您的本地环境
我创建了一些帮助程序脚本以在Kubernetes中部署MongoDB。 首先,让我们开始从我的GitHub存储库下载源代码
# Download the helper scripts from GitHub repo
wget -O k8-mongo.zip https://github.com/sarjarapu/k8-mongo/archive/master.zip
unzip k8-mongo.zip
cd k8-mongo-master
一个帮助脚本在Kubernetes中部署MongoDB
您还需要在您的环境中安装Kubernetes及以下工具集。 如果已经安装它们,则可以跳过下一步。
- Kubernetes(GKE或minikube)
- Kubectl
- Kubernetes-Helm
如果您开始使用Kubernetes,那么
install.sh
将在Mac OS上安装所有必需的依赖项。 但是,如果您有任何其他操作系统,请为您的操作系统手动安装所有依赖项。 # Install and configure the dependencies for Mac OS
# Dependencies: virtualbox, minikube, kubernetes-helm, bash-completion
sh install.sh
为MongoDB企业运营商安装头盔图表
下面的脚本将使用Kubernetes软件包管理器helm安装用于Kubernetes的MongoDB Enterprise Operator 。
# Download the helm chart from mongodb-enterprise-kubernetes GitHub repo
wget -O master.zip https://github.com/mongodb/mongodb-enterprise-kubernetes/archive/master.zip
unzip master.zip
# Initialize the helm and helm chart
helm init --upgrade
helm install mongodb-enterprise-kubernetes-master/helm_chart/ --name mongodb-enterprise
如果您的环境中没有头盔,则可以使用kubectl安装操作员。
# If helm is not available
# Install the enterprise operator via YAML
kubectl apply -f mongodb-enterprise-kubernetes-master/mongodb-enterprise.yaml
Ops Manager配置
从MongoDB Ops Manager v4.0 +开始,支持MongoDB Enterprise Operator 。 因此,请确保您的环境中已安装Ops Manager v4.0 。
注意:安装Ops Manager v4.0的说明超出了本文的范围。 您可以参考文档来安装Ops Manager或将MongoDB Cloud Manager用作替代解决方案。
Ops Manager启动并运行后,请按照以下说明进行操作,并为下一步提供方便的信息
- 记下Ops Manager基本URI
- 在Ops Manager中创建项目
- 记下项目ID
- 设置>项目设置>常规>项目ID
- 创建一个公共API**
- 帐户>公共API访问> API**
- 查找您的公共IP地址
- 将您的IP地址列入白名单
- 帐户>公共API访问> API白名单
- 使用感兴趣的MongoDB版本配置Version Manager部署>更多> Version Manager
记下Ops Manager项目ID并创建公共API**并将您的IP地址列入白名单
根据您的环境更新脚本
请编辑
templates/environment.sh
文件具有适合您的环境的值。 在开始创建副本集之前,必须更新属性的值。 所需的属性集如下所示 OM_PROJECT_ID= "<opsmanager_project_id>"
OM_USER_BASE64=$( echo "<opsmanager_userid>" | base64)
OM_API_KEY_BASE64=$( echo "<opsmanager_public_apikey>" | base64)
OM_URL= "<opsmanager_uri>"
K8_NAMESPACE= "<kubernetes_namespace>"
MONGODB_VERSION= "<mongodb_version>"
例如,如果要使用MongoDB Cloud Manager并创建MonogDB v3.6.5副本集,则必须更新文件中的属性
templates/environment.sh
如下所示。 OM_URL= "https://cloud.mongodb.com/"
K8_NAMESPACE= "mongodb-world"
MONGODB_VERSION= "3.6.5"
在Kubernetes中创建一个MongoDB副本集
为了方便起见,我提供了一个样本模板文件。 使用环境文件中定义的值,
templates/environment.sh
和模板文件 templates/generate-yaml-simple-replicaset.sh
,您可以轻松生成一个新的自定义YAML文件, samples/<kubernetes_namespace>-replicaset.yaml
。 您将需要通过kubectl运行上述YAML文件,以创建MongoDB副本集。 # create the YAML file using the template
sh templates/generate-yaml-simple-replicaset.sh
# create the replica set based on the generated YAML
source templates/environment.sh
kubectl apply -f samples/ ${K8_NAMESPACE} -replicaset.yaml
根据您的下载速度,在几秒钟到几分钟内为您下载/创建所需的资源/图像。 运行获取所有资源时,您会看到有3个Pod,在您提供的名称空间中为您创建了1个Statefulset(状态为3)和2个服务。
# display all the resources in the namespace
kubectl -n $K8_NAMESPACE get all
# NAME READY STATUS RESTARTS AGE
# pod/mongodb-world-replicaset-0 1/1 Running 0 4m
# pod/mongodb-world-replicaset-1 1/1 Running 0 4m
# pod/mongodb-world-replicaset-2 1/1 Running 0 4m
#
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) # AGE
# service/mongodb-world-replicaset-svc ClusterIP None <none> 27017/TCP # 4m
# service/mongodb-world-replicaset-svc-external NodePort 10.43.252.153 <none> # 27017:31750/TCP 4m
#
# NAME DESIRED CURRENT AGE
# statefulset.apps/mongodb-world-replicaset 3 3 4m
最后,如果您检查Ops Manager项目,则将看到创建了具有上述Pod的MongoDB部署,并且还打开了自动化和监视功能。
辅助脚本的详细信息
让我们尝试了解运行生成的YAML的幕后情况。 的
generate-yaml-simple-replicaset.sh
shell脚本会根据您在环境变量中定义的环境变量创建一个YAML文件。 templates/environment.sh
文件。 就我而言,它生成了一个名为 mongodb-world-replicaset.yaml
。 通过执行以下任务简化了整个过程 - 在Kubernetes中创建名称空间
- 使用Ops Manager项目ID baseUrl创建ConfigMap
- 使用Ops Manager用户名和公共Api**的base64编码值创建**
- 创建一个具有3个成员的MongoDbReplicaSet版本:3.6.5
# mongodb-world-replicaset.yaml contents
---
apiVersion: v1
kind: Namespace
metadata:
name: "mongodb-world"
---
apiVersion: v1
kind: ConfigMap
metadata:
name: "mongodb-world-project"
namespace: "mongodb-world"
data:
projectId: "59*************6fed"
baseUrl: "https://cloud.mongodb.com/"
---
apiVersion: v1
kind: Secret
metadata:
name: "mongodb-world-credentials"
namespace: "mongodb-world"
type: Opaque
data:
user: "c2************UK"
publicApiKey: "Nj******************zRiCg=="
---
apiVersion: mongodb.com/v1
kind: MongoDbReplicaSet
metadata:
name: "mongodb-world-replicaset"
namespace: "mongodb-world"
spec:
members: 3
version: "3.6.5"
project: "mongodb-world-project"
credentials: "mongodb-world-credentials"
persistent: false # For testing only
podSpec:
cpu: '0.25'
memory: 512 M
storage: 2 G
连接到MongoDB部署
在Kubernetes集群中与MongoDB部署的连接非常简单。 在此示例中,我将连接到第一个副本集成员的交互式终端,并使用mongo shell连接到localhost。
kubectl -n ${K8_NAMESPACE} exec -it ${K8_NAMESPACE} -replicaset-0 -- bin/bash
# aaa@qq.com:/$
/var/lib/mongodb-mms-automation/mongodb-linux-x86_64-3.6.5/bin/mongo
# MongoDB shell version v3.6.5
# connecting to: mongodb://mongodb-world-replicaset-0:27017/
# MongoDB server version: 3.6.5
# mongodb-world-replicaset:PRIMARY>
由于我在minikube上运行这些Pod,因此在笔记本电脑上可以解析Node IP地址10.128.0.7 。 因此,我可以使用节点端口从集群外部连接到MongoDB。 但是,您将需要使用Kubernetes入口以允许来自Kubernetes外部服务器的连接。
kubectl -n ${K8_NAMESPACE} describe pod/mongodb-world-replicaset-0 | grep 'Node:'
# Node: 10.128.0.7
kubectl -n ${K8_NAMESPACE} get services
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# mongodb-world-replicaset-svc ClusterIP None <none> 27017/TCP 41m
# mongodb-world-replicaset-svc-external NodePort 10.43.252.153 <none> 27017:31750/TCP 41m
mongo --host 10.128.0.7 --port 31750
# MongoDB shell version v3.6.5
# connecting to: mongodb://mongodb-world-replicaset-0:27017/
# MongoDB server version: 3.6.5
# mongodb-world-replicaset:PRIMARY>
删除MongoDB集群
以下命令将删除MongoDbReplicaSet 。 给定项目中的Ops Manager部署也应删除。 如果由于任何原因该项目仍然存在,则必须转到“部署”>“…”>“ 从Ops Manager中删除”以将其完全删除。
kubectl delete -f samples/ ${K8_NAMESPACE} -replicaset.yaml
检查企业操作员日志中的错误
有时您可能会注意到MongoDbReplicaSet创建没有成功。 要找出问题所在,您必须检查mongodb-enterprise-operator窗格上的日志。
# find the pod name for mongodb-enterprise-operator using selectors
K8_OPERATOR_POD_NAME=$(kubectl -n mongodb get pods --selector=app=mongodb-enterprise-operator --output=jsonpath= '{.items[0].metadata.name}' )
# display the mongodb-enterprise-operator logs from mongodb namespace
kubectl -n mongodb logs $K8_OPERATOR_POD_NAME
您可能会遇到的一些典型错误与
- 当前IP地址未添加到白名单
- 未检查MongoDB版本/ Ops Manager上的二进制文件不可用
如果您在日志中发现此类错误,则必须先对其进行修复,然后在重新创建副本集之前重新创建操作员窗格。 由于该操作员是一个部署,因此您只需删除该窗格,即可为您创建一个新的窗格。
# delete the existing pod after fixing the issue
kubectl -n mongodb delete pod $K8_OPERATOR_POD_NAME
sleep 5
# display all the resources in the namespace
kubectl -n ${K8_NAMESPACE} get all
重点和其他挑战
我非常肯定,如果您能做到这一点,您会感到非常兴奋。 在继续进行并在生产Kubernetes中部署您的第一个MongoDB部署之前,我希望您了解以下要点。
- 豆荚是短暂的。 因此,请确保您使用永久性磁盘
- 确保在不同节点之间配置Pods,以确保高可用性
- 明确地将wiredTigerCacheSizeGB设置为Pod内存的50%
- 使用亲和力,反亲和力来确保Pod的分布和资源的均匀共享
摘要
对部署副本集和群集的支持仅仅是开始。 将来的版本可能会添加更多功能
- 放大/缩小副本集中的成员数量
- 将副本集转换为分片集群
- 注入高级mongod配置等
用于Kubernetes的MongoDB企业运营商为您的开发人员带来了很多兴奋。 但是,我想强调一个重点。
MongoDB通过副本集提供数据库的冗余和高可用性。 尽管操作员简化了MongoDB副本集的部署,但在配置Pods时需要采取适当的措施,以使MongoDB在多个Kubernetes节点和/或数据中心中高度可用。 最重要的是,应该根据大小确定练习为Pod分配所需的硬件资源。
既然您了解了在Kubernetes中部署MongoDB的所有关键点,您可能会想:“如何调整我的部署的大小(找出需要多少硬件资源)?”。 好问题! 但这是另一天的话题。
希望您今天学到了一些新的知识,从而可以逐步扩展到“ 掌握MongoDB-每天一提示 ”的路径。
资源资源
- 介绍用于Kubernetes和OpenShift的MongoDB企业运营商-Robert Walters
- GitHub存储库:mongodb-enterprise-kubernetes
- Janakiram 撰写的Kubernetes网络研讨会
From: https://hackernoon.com/getting-started-with-mongodb-enterprise-operator-for-kubernetes-bb5d5205fe02
上一篇: pygame小游戏-碰撞