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

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 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集群的一些概念以及案例,希望能帮助到大家,谢谢大家的阅读,本文完!

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
26天前
|
Kubernetes 容器 Perl
【Azure K8S | AKS】在AKS中创建 StatefulSet 示例
【Azure K8S | AKS】在AKS中创建 StatefulSet 示例
|
17天前
|
存储 Kubernetes 负载均衡
CentOS 7.9二进制部署K8S 1.28.3+集群实战
本文详细介绍了在CentOS 7.9上通过二进制方式部署Kubernetes 1.28.3+集群的全过程,包括环境准备、组件安装、证书生成、高可用配置以及网络插件部署等关键步骤。
112 3
CentOS 7.9二进制部署K8S 1.28.3+集群实战
|
17天前
|
Kubernetes 负载均衡 前端开发
二进制部署Kubernetes 1.23.15版本高可用集群实战
使用二进制文件部署Kubernetes 1.23.15版本高可用集群的详细教程,涵盖了从环境准备到网络插件部署的完整流程。
37 2
二进制部署Kubernetes 1.23.15版本高可用集群实战
|
17天前
|
存储 Kubernetes 测试技术
k8s使用pvc,pv,sc关联ceph集群
文章介绍了如何在Kubernetes中使用PersistentVolumeClaim (PVC)、PersistentVolume (PV) 和StorageClass (SC) 来关联Ceph集群,包括创建Ceph镜像、配置访问密钥、删除默认存储类、编写和应用资源清单、创建资源以及进行访问测试的步骤。同时,还提供了如何使用RBD动态存储类来关联Ceph集群的指南。
35 7
|
17天前
|
存储 Kubernetes 数据安全/隐私保护
k8s对接ceph集群的分布式文件系统CephFS
文章介绍了如何在Kubernetes集群中使用CephFS作为持久化存储,包括通过secretFile和secretRef两种方式进行认证和配置。
25 5
|
17天前
|
Kubernetes 负载均衡 应用服务中间件
kubeadm快速构建K8S1.28.1高可用集群
关于如何使用kubeadm快速构建Kubernetes 1.28.1高可用集群的详细教程。
36 2
|
21天前
|
运维 Kubernetes Cloud Native
云原生之旅:Kubernetes 集群的搭建与实践Python 编程入门:从零基础到编写实用脚本
【8月更文挑战第30天】在数字化转型的大潮中,云原生技术以其弹性、可扩展性及高效运维能力成为企业IT架构升级的关键。本文将通过实际操作演示如何在本地环境搭建一个简易的Kubernetes集群,带你领略云原生的魅力所在。从集群规划到服务部署,每一步都是对云原生理念的深刻理解和应用。让我们共同探索,如何通过Kubernetes集群的搭建和运维,提升业务灵活性和创新能力。
|
17天前
|
Kubernetes Linux API
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
该博客文章详细介绍了在CentOS 7.6操作系统上使用kubeadm工具部署kubernetes 1.17.2版本的测试集群的过程,包括主机环境准备、安装Docker、配置kubelet、初始化集群、添加节点、部署网络插件以及配置k8s node节点管理api server服务器。
52 0
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
|
23天前
|
Kubernetes Cloud Native 应用服务中间件
云原生之旅:Kubernetes集群搭建与应用部署
【8月更文挑战第28天】在数字化浪潮中,云原生技术正成为企业IT架构转型的重要驱动力。本文将通过实践案例,引导读者理解云原生的核心概念,掌握Kubernetes集群的搭建方法,并学会如何部署和管理容器化应用。文章不仅提供详细的操作步骤和示例代码,还深入探讨了云原生技术背后的哲学及其对企业数字化转型的影响,旨在帮助读者构建起对云原生世界的全面认识,并激发对技术创新和应用实践的思考。
|
26天前
|
Kubernetes 应用服务中间件 API
【Ingress 秘籍】集群进出流量的总管:揭秘 Kubernetes 中 Ingress 的终极奥秘!
【8月更文挑战第25天】Ingress是Kubernetes中用于管理HTTP与HTTPS流量进入集群的核心功能。作为集群内外通信的桥梁,Ingress通过定义规则将外部请求导向内部服务。本文详细介绍了Ingress的基本概念、配置方法及其实现方式。通过使用不同的Ingress控制器(如Nginx、Traefik等),用户可以根据需要选择最适合的方案。文中还提供了示例代码展示如何创建服务、部署应用及配置Ingress规则。
53 6