k8s教程(pod篇)-使用StatefulSet搭建MongoDB集群

01 引言

声明:本文为《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)》的读书笔记

本文以MongoDB为例,使用StatefulSet完成MongoDB集群的创建,为每个
MongoDB实例在共享存储(本例使用GlusterFS)中都申请一片存储空间
,以实现一个无单点故障、高可用、可动态扩展的MongoDB集群,部署架构如图下所示:

在这里插入图片描述

注意:在创建StatefulSet之前,需要确保在Kubernetes集群中管理员已经创建好共享存储,并能够与StorageClass对接,以实现动态存储供应的模式,本文的示例将使用GlusterFS作为共享存储。

02 部署StatefulSet

为了完成MongoDB集群的搭建,需要部署以下三个资源对象,分别为:

  • StorageClass:用于StatefulSet自动为各个应用Pod申请PVC;
  • Headless Service:用于设置MongoDB实例的域名;
  • StatefulSet

2.1 创建StorageClass对象

首先,创建一个StorageClass对象,storageclass-fast.yaml文件的内容如下:

apiVersion: storage.k8s.io/v1 
kind: Storageclass
metadata:
	name: fast
provisioner: kubernetes.io/glusterfs
parameters:
	resturl: "http://<heketi-rest-url>"

运行kubectl create命令创建该StorageClass:
在这里插入图片描述

2.2 创建Headless Service对象

接下来,创建对应的Headless Service,mongo-sidecar作为MongoDB集群的管理者,将使用此Headless Service来维护各个MongoDB实例之间的集群关系,以及集群规模变化时的自动更新。

mongo-headless-service.yaml文件的内容如下:

apiVersion: v1
kind: Service
metadata: 
	name: mongo
	labels:
		name: mongo
spec:
	ports:
	- port: 27017
	  targetPort: 27017
	clusterIP: None
	selector:
		role: mongo

运行kubectl create命令创建该Headless Service:
在这里插入图片描述

2.3 创建StatefulSet对象

最后,创建MongoDB StatefulSet,statefulset-mongo.yaml文件的内容如下:

apiversion: apps/v1
kind: StatefulSet
metadata:
	name: mongo
spec:
	serviceName: "mongo"
	replicas: 3
	template:
		metadata:
			labels:
				role: mongo
				environment: test
		spec:
			terminationGracePeriodSeconds: 10 
			containers:
			- name: mongo
			  image: mongo
	          command:
			  - mongod
			  - "--replSet"
			  - rs0
			  - "--smallfiles"
			  - "--noprealloc"
		      ports:
			  - containerPort: 27017
			  volumeMounts:
			  - name: mongo-persistent-storage 
 				mountPath: /data/db
			- name: mongo-sidecar
			  image: cvallance/mongo-k8s-sidecar
	          env:
              - name: MONGO SIDECAR POD LABELS
                value: "role=mongo,environment=test" 
              - name: KUBERNETES MONGO SERVICE NAME 
                value: "mongo"
	volumeClaimTemplates: 
	- metadata:
	  name: mongo-persistent-storage 
      annotations: 
      	volume.beta.kubernetes.io/storage-class:"fast"
	  spec:
		accessModes: ["ReadWriteOnce"]
		resources:
			requests:
				storage: 100Gi

对其中的主要配置说明如下:

① 在该StatefulSet的定义中包括两个容器:mongo和mongo-sidecar,mongo是主服务程序,mongo-sidecar是将多个mongo实例进行集群设置的工具, mongo–sidecar中的环境变量如下

  • MONGO_SIDECAR_POD_LABELS:设置为mongo容器的标签,用于sidecar查询它所要管理的MongoDB集群实例;
  • KUBERNETES_MONGO_SERVICE_NAME:它的值为mongo,表示sidecar将使用mongo这个服务名来完成MongoDB集群的设置。

replicas=3表示这个MongoDB集群由3个mongo实例组成

volumeClaimTemplates是StatefulSet最重要的存储设置,在 annotations段设置volume.beta.kubernetes.io/storage-class="fast"表示使用名为 fast的StorageClass自动为每个mongo Pod实例都分配后端存储。resources.requests.storage=100Gi表示为每个mongo实例都分配100GiB的磁盘空间。

使用kubectl create命令创建这个StatefulSet:

$ kubectl create -f statefulset-mongo.yaml
statefulset.apps/mongo created

最终可以看到StatefulSet依次创建并启动了3个mongo Pod实例,它们的名字依次为mongo-0、mongo-1、mongo-2:
在这里插入图片描述
StatefulSet会用volumeClaimTemplates中的定义为每个Pod副本都创建一个 PVC实例,每个PVC实例的名称都由StatefulSet定义中volumeClaimTemplates的名称和Pod副本的名称组合而成,查看系统中的PVC便可以验证这一点:
在这里插入图片描述
下面是mongo-0这个Pod中的Volume设置,可以看到系统自动为其挂载了对应的PVC:
在这里插入图片描述
至此,一个由3个实例组成的MongoDB集群就创建完成了,其中的每个实例都拥有稳定的名称(DNS域名格式) 和独立的存储空间

03 查看mongodb的集群状态

登录任意一个mongo Pod,在mongo命令行界面用rs.status()命令查看MongoDB集群的状态,可以看到mongo集群已通过sidecar完成了创建。

在集群中 包含3个节点,每个节点的名称都是StatefulSet设置的DNS域名格式的网络标识名称:

  • mongo-o.mongo.default.svc.cluster.local;
  • mongo-1.mongo.default.svc.cluster.local;
  • mongo-2.mongo.default.svc.cluster.local.

同时,可以看到3个mongo实例各自的角色(PRIMARY或SECONDARY)也都进行了正确的设置:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

04 StatefulSet的常见应用场景

下面对MongoDB集群常见的两种场景进行操作,说明StatefulSet对有状态应用的自动化管理功能

4.1 MongoDB集群的扩容

假设在系统运行过程中,3个mongo实例不足以满足业务的要求,这时就需要对mongo集群进行扩容。仅需要通过对StatefulSet进行scale操作,就能实现在 mongo集群中自动添加新的mongo节点。

使用kubectl scale命令将StatefulSet设置为4个实例:

kubectl scale --replicas=4 statefulset mongo 
statefulset.apps/mongo scaled

等待一会儿,看到第4个实例mong0-3创建成功:
在这里插入图片描述
同时,系统也为mongo-3分配了一个新的PVC用于保存数据,此处不再赘述。

4.2 自动故障恢复(MongoDB集群的高可用)

假设在系统运行过程中,某个mongo实例或其所在主机发生故障,则StatefulSet将会自动重建该mongo实例,并保证其身份(ID)和使用的数据(PVC)不变。

以mongo-0实例发生故障为例,StatefulSet将会自动重建mongo-0实例,并为其挂载之前分配的PVC“mongo-persistent-storage-mongo-0”。“mongo-0”服务在重新启动后,原数据库中的数据不会丢失,可继续使用。
在这里插入图片描述
从上面的例子中可以看出,Kubernetes使用StatefulSet来搭建有状态的应用集群(MongoDB、MySQL等),同部署无状态的应用一样简便。

Kubernetes能够保证StatefulSet中各应用实例在创建和运行的过程中,都具有固定的身份标识和独立的后端存储;还支持在运行时对集群规模进行扩容、保障集群的高可用等 非常重要的功能。

05 文末

本文主要讲解使用StatefulSet搭建MongoDB集群的一些概念以及案例,希望能帮助到大家,谢谢大家的阅读,本文完!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 要搭建MongoDB集群,可以按照以下步骤进行操作: 1. 安装MongoDB:在每个节点上都需要安装MongoDB数据库。 2. 配置MongoDB:在每个节点上创建一个MongoDB配置文件,并根据需要进行修改。 3. 启动MongoDB:在每个节点上启动MongoDB实例。 4. 设置复制集:在其中一个节点上执行rs.initiate(),然后将其他节点添加到复制集中。 5. 配置分片:在至少一个节点上启动mongos进程,并将分片添加到集群中。 6. 添加分片数据:将数据添加到分片集合中。 7. 测试集群:确保集群可以正常工作并处理负载。 以上是MongoDB集群的基本搭建步骤,具体的操作可以参考MongoDB的官方文档。 ### 回答2: 要搭建MongoDB集群,首先需要了解MongoDB集群架构。MongoDB集群通常由多个节点组成,其中一个节点被选为主节点,负责处理所有的写操作和部分读操作,其他节点被称为从节点,负责处理读操作。 搭建MongoDB集群的步骤如下: 1. 准备服务器:需要准备一台或多台服务器来作为MongoDB节点,确保每台服务器都能够访问互联网。 2. 安装MongoDB:在每台服务器上安装MongoDB软件,确保所有服务器的版本相同。 3. 配置主节点:选择其中一台服务器作为主节点,在主节点上进行配置。打开配置文件,设置`replication`以启用复制功能,并指定集群的名称和副本集的成员。保存配置文件并重启MongoDB服务。 4. 配置从节点:在其他服务器上进行配置。打开配置文件,设置`replication`以启用复制功能,并指定主节点的地址和端口号。保存配置文件并重启MongoDB服务。 5. 初始主节点:连接到主节点的MongoDB实例,并在Mongo Shell中执行`rs.initiate()`命令来初始主节点。 6. 添加从节点:连接到从节点的MongoDB实例,并在Mongo Shell中执行`rs.add()`命令来添加从节点到集群。 7. 验证集群状态:在Mongo Shell中执行`rs.status()`命令来验证集群的状态。如果所有节点都成功加入集群,即表示集群搭建成功。 8. 测试读写操作:使用各种读写操作测试集群的性能和可靠性,确保数据能够正确地在各个节点之间同步和访问。 通过以上步骤,我们就可以成功搭建MongoDB集群。值得注意的是,集群的规模和配置可能因应用需求而有所不同,需要根据实际情况进行调整和优。 ### 回答3: 搭建MongoDB集群是为了实现高可用性、水平扩展以及容错能力。下面是搭建MongoDB集群的步骤: 1. 安装MongoDB:首先,在每个待部署的节点上安装MongoDB,确保版本一致,并为每个节点配置正确的IP地址和端口号。 2. 启用验证和授权:为了增加安全性,可以在MongoDB集群中启用认证和授权机制。创建管理员用户,并给予合适的权限。 3. 配置副本集:MongoDB集群使用副本集来实现数据复制和高可用性。选择一个节点作为primary节点,其他节点作为secondary节点,每个副本集都有一个唯一的名称。在每个节点上启动MongoDB,并将其添加到副本集中。 4. 设置仲裁节点(可选):仲裁节点用于解决副本集中选举主节点时出现的平局情况。可以选择一个节点作为仲裁节点,将其添加到副本集中。 5. 配置分片集群(可选):如果需要进行水平扩展,可以将MongoDB集群配置为分片集群。定义一个或多个分片键,并将数据按照分片键进行划分,存储在不同的分片上。 6. 配置路由器节点(可选):在分片集群中,需要配置一个或多个路由器节点来接收客户端的请求,并将请求路由到正确的分片。 7. 测试集群:启动集群之后,可以使用MongoDB自带的客户端或第三方工具连接到集群,并执行一些简单的操作来验证集群的正常运行。查看节点状态,确保主节点和次节点处于正常状态,验证数据复制是否成功。 总结来说,搭建MongoDB集群的步骤包括安装MongoDB、启用认证和授权、配置副本集、设置仲裁节点、配置分片集群、配置路由器节点以及测试集群。这样就可以实现MongoDB集群的高可用性、水平扩展和容错能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值