欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

适用于Kubernetes的MongoDB Enterprise Operator入门

程序员文章站 2024-03-19 11:29:52
...

介绍

开源社区已经建立了许多在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 Enterprise Operator入门

适用于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
    • 适用于Kubernetes的MongoDB Enterprise Operator入门

      适用于Kubernetes的MongoDB Enterprise Operator入门

      记下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部署,并且还打开了自动化和监视功能。

    适用于Kubernetes的MongoDB Enterprise Operator入门

    适用于Kubernetes的MongoDB Enterprise Operator入门

    辅助脚本的详细信息

    让我们尝试了解运行生成的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-每天一提示 ”的路径。

    资源资源

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

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