mongodb入门_适用于Kubernetes的MongoDB Enterprise Operator入门

mongodb入门

介绍

开源社区已经建立了许多在Kubernetes中部署MongoDB的实现。 但是,这些实施缺少关键的企业功能,例如-备份,自动化,警报和监视。 从MongoDB Ops Manager v4.0开始,MongoDB通过备份,自动化,警报和监视功能正式支持在Kubernetes中管理和部署MongoDB。 感谢“ 用于KubernetesMongoDB企业运营商(测试版) ”集成了Kubernetes和MongoDB Ops Manager。

这是一个由多部分组成的系列文章, 精通MongoDB的众多文章之一-每天一个小贴士 ,专门为您提供了通过学习“每天一个小贴士”来掌握MongoDB的知识。 在一些系列文章中,我想提供各种技巧来帮助您掌握Kubernetes中的MongoDB。 本文讨论了用于Kubernetes的MongoDB Enterprise Operator ,这是MongoDB Ops Manager v4.0的新功能-其应用程序,用例场景以及最后的动手实验练习。

掌握-Kubernetes中的MongoDB

MongoDB Enterprise Operator中的内容

用于KubernetesMongoDB企业操作员是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个状态状态为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脚本基于您在templates/environment.sh文件中定义的环境变量创建一个YAML文件。 就我而言,它生成了一个名为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
    # mongodb@mongodb-world-replicaset-0:/$
    /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部署之前,我希望您了解以下要点。

    • 豆荚是短暂的。 因此,请确保您使用永久性磁盘
    • 确保在不同节点上预配Pod,以确保高可用性
    • 明确地将wiredTigerCacheSizeGB设置为Pod内存的50%
    • 使用亲和力,反亲和力来确保Pod的分布和资源的均匀共享

    摘要

    对部署副本集和群集的支持仅仅是开始。 将来的版本可能会添加更多功能

    • 放大/缩小副本集中的成员数量
    • 将副本集转换为分片集群
    • 注入高级mongod配置等

    MongoDB Kubernetes企业运营商为您的开发人员带来了很多兴奋。 但是,我想强调一个重点。

    MongoDB通过副本集提供数据库的冗余和高可用性。 尽管操作员简化了MongoDB副本集的部署,但在配置Pods时需要采取适当的措施,以使MongoDB在多个Kubernetes节点和/或数据中心之间高度可用。 最重要的是,应该根据大小确定练习为Pod分配所需的硬件资源。

    既然您了解了在Kubernetes中部署MongoDB的所有关键点,您可能会想:“如何调整我的部署大小(找出需要多少硬件资源)?”。 好问题! 但这是另一天的话题。

    希望您今天学到了一些新的知识,从而可以逐步扩展到“ 掌握MongoDB-每天一个提示 ”的道路。

    资源资源

    1. 介绍用于Kubernetes和OpenShift的MongoDB企业运营商-Robert Walters
    2. GitHub存储库:mongodb-enterprise-kubernetes
    3. Janakiram 撰写的Kubernetes网络研讨会

    翻译自: https://hackernoon.com/getting-started-with-mongodb-enterprise-operator-for-kubernetes-bb5d5205fe02

    mongodb入门

    • 0
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值