使用Docker和Kubernetes将MongoDB作为微服务运行

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: MongoDB是NoSQL排名第一的数据库,Docker是最流行的容器引擎,Kubernetes是谷歌开源的容器编排工具!Kubernetes和Docker使MongoDB的开发运维部署变得更加简单和强大。

原文:Running MongoDB as a Microservice with Docker and Kubernetes
作者:Andrew Morgan
译者:徐雷
MongoDB是NoSQL排名第一的数据库,Docker是最流行的容器引擎,Kubernetes是谷歌开源的容器编排工具!Kubernetes和Docker使MongoDB的开发运维部署变得更加简单和强大。
image
1、Docker背景介绍
想快速安装MongoDB吗?现在只需要执行一个Docker命令,就能快速启动一个轻量级,独立的沙盒;
在多个不同的服务器环境中搭建集群,快速部署相同的应用?使用Docker容器会非常的简单,构建自己的Docker容器映像,让开发,测试,运营和支持团队启动相同的环境克隆。
Docker容器正在彻底改变整个软件生命周期:从最早的技术实验和概念证明到开发,测试,部署和支持。
Kubernetes工具可以管理多个Docker容器的创建,升级和高可用性。K8s业务流程还控制容器如何连接以从多个微服务容器构建复杂的应用程序。Docker容器和K8s编排已经成为DevOps团队的最爱,现在广泛融入到持续集成(CI)和持续交付(CD)工作流程中。
本文深入探讨了在Docker容器中运行和编排MongoDB所面临的额外挑战,并介绍这些挑战的解决办法。
**如果要Linux实战Docker安装Mongodb可以参考我写的文章。《Linux实战Docker容器安装MongoDB,阿里Docker镜像仓库加速》https://yq.aliyun.com/articles/691383
2、MongoDB容器的注意事项
使用Docker容器和K8S运行MongoDB额外注意事项:

  1. MongoDB数据库节点有状态信息。如果Docker容器发生故障并重新编排可能导致数据丢失,我们并不希望丢失数据(可以从副本集中的其他节点恢复,但需要时间)。为了解决可能的数据丢失问题,可以使用诸如Kubernetes中的Volume卷抽象之类的功能来将容器中临时性MongoDB数据目录映射到持久性位置,这样就可以容忍容器故障和重新编排,而不会丢失数据。
  2. 集群中的MongoDB数据库节点必须相互通信。副本集中的所有节点都必须知道所有节点的地址,但是当Kubernetes重新编排容器时,可能会使用不同的IP地址重新启动。例如,Kubernetes Pod中的所有容器共享一个IP地址,该地址在重新编排pod时会发生变化。使用Kubernetes,可以通过将Kubernetes服务与每个MongoDB节点相关联来处理,该节点使用Kubernetes DNS服务为通过重新安排保持不变的服务提供主机名。
  3. 每个MongoDB节点运行后(每个节点都在自己的容器中),必须初始化副本集并添加每个节点。这可能需要编排工具之外的代码。具体而言,必须使用目标副本集群中的主MongoDB节点执行rs.initiate和rs.add命令。
  4. 如果K8s编排框架提供容器的自动重新调度(如Kubernetes那样),那么这可以提高MongoDB的弹性,因为可以自动重新创建失败的副本集成员,从而在没有人为干预的情况下恢复正常状态。
  5. 应该注意的是,虽然K8S可能会监视容器的状态,但它不太可能监视容器内运行的应用程序或备份数据。这意味着我们需要再使用强大的监控和备份解决方案非常重要,例如MongoDB企业高级版和MongoDB专业版附带的MongoDB Cloud Manager。考虑创建自己的镜像,其中包含首选的MongoDB版本和MongoDB自动化代理。

3、使用Docker和Kubernetes实现MongoDB Replica Set副本集群
如上所述,当使用诸如Kubernetes之类的编排工具部署时,MongoDB等分布式数据库需要特别小心。本节将进一步详细介绍这一点。
我们首先在单个Kubernetes集群中创建整个MongoDB副本集群(通常位于单个数据中心内 -- 显然不提供地理冗余)。实际上,很少需要更改配置来支持跨多个中心的集群架构,这些步骤将在后面介绍。

Replica Set副本集群的每个成员将作为单独的pod运行,其中一个服务公开外部IP地址和端口。这个“固定”的IP地址很重要,因为外部应用程序和其他副本集成员可以依赖它,在重新编排pod时保持地址不变。

下图说明了其中一个pod以及关联的Replication Controller和服务。
image

图1: MongoDB Replica Set副本集群成员配置为Kubernetes Pod并作为服务公开
配置Kubernetes Pod步骤如下:

  1. 开始创建名为mongo-node1的容器。 mongo-node1包含一个名为mongo的镜像,这是一个托管在Docker Hub上的公开可用的MongoDB容器镜像。容器公开集群中的端口27107。
  2. Kubernetes volumes卷用于将/data/db目录映射到名为mongo-persistent-storage1的持久存储元素;然后映射到在Google Cloud中创建的名为mongodb-disk1的磁盘。这是MongoDB存储数据的位置,以便在容器重新调度时保持不变。
  3. pod内的容器实例,标签mongo-node,实例名称rod。
  4. 名为mongo-rc1的复制控制器,目的是确保mongo-node1 pod的单个实例始终在运行。
  5. 名为mongo-svc-a的LoadBalancer服务向外界公开IP地址以及27017的端口,该端口映射到容器中的相同端口号。该服务使用与pod标签匹配的选择器来识别正确的pod。该外部IP地址和端口将由应用程序和副本集成员之间的通信使用。每个容器也有本地IP地址,但这些容器在移动或重新启动容器时会发生更改,因此不会用于Replica Set副本集群。

下图显示了Replica Set副本集群的第二个成员的配置。
image
图2:第二个MongoDB副本集群成员配置为Kubernetes Pod
只有这些配置不一样,其他90%的配置是相同的:

  1. 磁盘和卷名称必须唯一,因此使用名称:mongodb-disk2和mongo-persistent-storage2
  2. Pod标签:jane和name:mongo-node2,以便新服务可以将它与图1中rod的Pod区分开来。
  3. 复制控制器名为mongo-rc2
  4. 该服务名为mongo-svc-b,并获取唯一的外部IP地址(在此示例中,Kubernetes已分配104.1.4.5)
    第三个副本集成员的配置遵循相同的模式,下图是完整的Replica Set副本集群:

image
图3:配置为Kubernetes服务的完整副本集群成员
请注意,即使在三个或更多节点的Kubernetes集群上运行图3所示的配置,Kubernetes也可能(通常会)在同一主机上安排两个或更多MongoDB Replica Set副本集群成员。 这是因为Kubernetes将三个pod当作三个独立服务。
为了增加冗余(在区域内),可以创建额外的Headless Service服务。 该服务不向外界提供任何服务(甚至不具有IP地址),但它用于通知Kubernetes三个MongoDB pod构成的节点信息,Kubernetes可以尝试在不同节点上编排这些pod实例。
image
图4:Headless service无头服务,以避免MongoDB副本集成员的共同定位
可以在“启用微服务:容器和编排说明”白皮书中找到K8s编排和启动MongoDB Replica Set副本集群所需的实际配置文件和命令。特别是,将三个MongoDB实例组合成一个功能强大的HA集群需要一些特殊步骤,这些副本集在本文中有所描述。

4、多个可用区MongoDB Replica Set副本集群
上面创建的副本集存在当机风险,因为一切都在同一个GCE集群中运行,本质上在同一可用区中。如果发生可用区脱机的重大事故,则整个MongoDB副本集将不可用。如果需要做地理空间的分布式冗余,可以在三个不同的可用区域或区域中运行三个窗格。

创建三个可用区域的分布式副本集群,并不需要太多的配置修改--只需要创建三个集群。每个群集都需要自己的Kubernetes YAML文件,该文件为集群中的单个节点定义pod,Replication Controller和服务。
image
图5:在多个可用区域上运行的副本集
5、扩展阅读
要了解有关Docker容器和K8s编排的更多信息 - 包括所涉及的技术及其提供的业务优势 - 请阅读“启用微服务:容器和编排说明”白皮书。https://www.mongodb.com/collateral/microservices-containers-and-orchestration-explained,这个白皮书还提供了在Google容器引擎中的Docker和Kubernetes上启动并运行本文中描述的副本集群的完整说明。
6、参考资料

  1. 原文地址:https://www.mongodb.com/blog/post/running-mongodb-as-a-microservice-with-docker-and-kubernetes

      作者:Andrew Morgan,MongoDB的首席产品营销经理。 博客(clusterdb.com)@andrewmorgan
  2. 《Linux实战Docker容器安装MongoDB,阿里Docker镜像仓库加速》https://yq.aliyun.com/articles/691383

      译者:徐雷,MongoDB中文社区联席主席、核心专家组成员,阿里云栖课堂Java讲师,阿里云大学MongoDB讲师,《MongoDB实战》第2版译者。

    阿里巴巴Java群超过3800人

直播地址:Java技术进阶群
进群方式:钉钉扫码入群
image
阿里巴巴MongoDB群
image

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1天前
|
Kubernetes 监控 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【5月更文挑战第4天】在现代软件开发中,微服务架构已成为实现可扩展、灵活且独立部署服务的流行解决方案。本文将探讨如何利用Docker容器化技术和Kubernetes容器编排平台来构建一个高效的微服务系统。我们将分析Docker和Kubernetes的核心优势,并指导读者如何通过这些工具优化微服务部署、管理和扩展过程。文章还将涉及监控和日志管理策略,以确保系统的健壮性和可靠性。
|
4天前
|
Linux Docker 容器
【微服务系列笔记】Docker
docker是一种容器技术,它主要是用来解决软件跨环境迁移的问题和同一环境下依赖冲突问题。 Docker可以运行在Mac, Windows, linux等操作系统上,常用于适用于构建和部署分布式应用、微服务架构。
26 0
【微服务系列笔记】Docker
|
4天前
|
NoSQL 网络协议 MongoDB
docker安装mongodb(单点)图文详解
该文档提供了一个快速搭建MongoDB环境的指南,适用于开发和学习,但不适用于生产。主要步骤包括:1) 使用Docker创建数据卷`mongo_data_db`和`mongo_data_configdb`。2) 拉取`mongo`镜像并运行名为`mymongo`的容器,映射端口并挂载数据卷。3) 初始化管理员账号,创建具有`root`权限的用户`admin`,密码为`adminpwd`。4) 防火墙开放端口27017。最后,提到了使用第三方客户端进行连接。
|
6天前
|
Kubernetes 监控 Docker
|
6天前
|
Java Docker 微服务
|
6天前
|
运维 Kubernetes 负载均衡
构建高效自动化运维体系:基于Docker和Kubernetes的实践指南
【4月更文挑战第28天】随着云计算和微服务架构的普及,自动化运维已成为提升系统稳定性、效率及快速响应市场变化的关键。本文将探讨如何利用容器化技术Docker和容器编排工具Kubernetes来构建一个高效、可扩展的自动化运维体系。我们将分析该技术栈的优势,并通过一系列实践案例,展示如何优化现有的运维流程,实现资源的最大化利用和风险的有效控制。
|
7天前
|
Java Maven Docker
基于docker容器化部署微服务
基于docker容器化部署微服务
5 0
|
1天前
|
监控 Java 持续交付
构建高效微服务架构:后端开发者的终极指南
【5月更文挑战第4天】在当今快速迭代和竞争激烈的软件市场中,微服务架构已成为企业追求敏捷性、可扩展性和技术多样性的关键策略。本文深入探讨了如何构建和维护高效的微服务系统,从基本概念到高级实践,为后端开发者提供一套综合指南,以支持他们在这一变革性架构风格中扮演关键角色。
|
1天前
|
负载均衡 API 数据库
构建高效微服务架构的五大关键技术
【5月更文挑战第4天】 随着云计算和容器化技术的成熟,微服务架构已成为软件开发的主流模式。本文将详细探讨实现高效微服务架构的五个关键技术点:服务拆分策略、API网关设计、服务发现与注册、熔断机制以及分布式事务管理。这些技术点是确保微服务系统可扩展性、灵活性及稳定性的基石,对于后端开发者而言,掌握它们至关重要。文章将提供具体的实施建议和最佳实践,帮助读者构建和维护高性能的微服务系统。
|
2天前
|
JavaScript Java 持续交付
构建高效微服务架构:后端开发的新范式
【5月更文挑战第3天】 在现代软件开发的浪潮中,微服务架构以其灵活性、可扩展性和技术多样性而受到重视。本文深入探讨了如何构建一个高效的微服务系统,包括关键的设计原则、技术选型、以及实现细节。我们将通过分析微服务的核心概念,提供一套实用的步骤和最佳实践,以指导开发者构建出既健壮又易于维护的分布式系统。文章将重点讨论如何在保证系统性能和稳定性的前提下,实现服务的解耦与独立部署,从而推动后端开发工作流的优化和创新。