栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

K8s系列之:使用StatefulSet搭建MongoDB集群

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

K8s系列之:使用StatefulSet搭建MongoDB集群

K8s系列之:使用StatefulSet搭建MongoDB集群

一、前提条件二、创建StatefulSet

1.首先创建一个StorageClass对象2.创建对应的Headless Service3.创建MongoDB StatefulSet4.查看MongoDB集群状态 三、StatefulSet常见应用场景

1.MongoDB集群的扩容2.自动故障恢复(MongoDB集群的高可用)

使用StatefulSet完成MongoDB集群的创建,为每个MongoDB实例在共享存储中(这里采用GlusterFS)申请一片存储空间,以实现一个无单点故障、高可用、可动态扩展的MongoDB集群。

一、前提条件

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

二、创建StatefulSet

为了完成MongoDB集群的搭建,需要创建如下三个资源对象:

一个StorageClass,用于Stateful自动为各个应用Pod申请PVC。一个Headless Service,用于维护MongoDB集群的状态。一个StatefulSet。 1.首先创建一个StorageClass对象

storageclass-fast.yaml文件内容如下:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://"

执行kubectl create命令创建该StorageClass:

kubectl create -f storageclass-fast.yaml
storageclass "fast" created
2.创建对应的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命令创建该StorageClass:

kubectl create -f mongo-headless-service.yaml
service "mongo" created
3.创建MongoDB StatefulSet

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

apiVersion: apps/v1beta1
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

主要配置说明如下:

(1)在该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集群的设置。

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

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

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

    kubectl create -f statefulset-mongo.yaml
    statefulset "mongo" created
    

    最终可以看到StatefulSet依次创建并启动了3个mongo Pod实例,名字依次为mongo-0、mongo-1、mongo-2:

    kubectl get pods -l role=mongo
    

    StatefulSet会用volumeClaimTemplates中的定义为每个Pod副本创建一个PVC实例,每个PVC的名称由StatefulSet定义中volumeClaimTemplates的名称和Pod副本的名字组合而成,查看系统中的pvc,可以验证这一点:

    kubectl get pvc
    

    下面是mongo-0这个Pod中的volumes设置,可以看到系统自动为其挂载了对应的PVC:

    kubectl get pod mongo-0 -o yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: mongo-0
    ......
      volumes:
      - name: mongo-persistent-storage
        persistentVolumeClaim:
          claimName: mongo-persistent-storage-mongo-0
    ......
    

    至此,一个由3个实例组成的MongoDB集群就创建完成了。每个实例都拥有稳定的名称和独立的存储空间。

    4.查看MongoDB集群状态

    登陆任意一个mongo Pod,在mongo命令行界面用rs.status()命令查看MongoDB集群的状态,可以看到mongo集群已通过sidecar完成创建。集群中包含3个节点,每个节点的名称都是StatefulSet设置的DNS域名格式的网络标识名称:

    mongo-0.mongo.default.svc.cluster.localmongo-1.mongo.default.svc.cluster.localmongo-2.mongo.default.svc.cluster.local

    可以看到3个mongo实例各自的角色(PRIMARY或SECONDARY)也都进行了正确的设置。

    kubectl exec -ti mongo-0 -- mongo
    
    rs.status()
    

    对于需要访问这个mongo集群的K8s集群内部客户端来说,可以通过Headless Service “mongo"获取到后端的所有Endpoints列表,并组合为数据库链接串,例如"mongodb://mongo-0.mongo,mongo-1.mongo,mongo-2.mongo:27017/dbname_?”

    三、StatefulSet常见应用场景

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

    1.MongoDB集群的扩容

    需要对mongo集群进行扩容,仅需要通过对StatefulSet进行scale操作,就能实现在mongo集群中自动添加新的mongo节点。

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

    kubectl scale --replicas=4 statefulset mongo
    statefulset "mongo" scaled
    

    等待一会看到第4个实例"mongo-3"创建成功

    kubectl get po -l role=mongo
    

    进入某个实例查看mongo集群的状态,可以看到第4个节点已经加入

    kubectl exec -ti mongo-0 -- mongo
    rs.status()
    

    同时,系统也为mongo-3分配了一个新的PVC用于保存数据。

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

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

    以mongo-0实例发生故障为例,StatefulSet将会自动重建mongo-0实例,并为其挂载之前分配的PVC “mongo-persistent-storage-mongo-0”。服务"mongo-0"在重新启动后,原数据库中的数据不会丢失,可继续使用。

    kubectl get po -l role=mongo
    
    kubectl get pod mongo-0 -o yaml
    

    进入某个实例查看mongo集群的状态,mongo-0在发生故障前在集群中的角色为PRIMARY,在其脱离集群后,mongo集群会自动选出一个SECONDARY节点提升为PRIMARY节点(mongo-2)。重启后的mongo-0则会成为一个新的SECONDARY节点。

    kubectl exec -ti mongo-0 -- mongo
    
    rs.status()
    

    K8s使用StatefulSet来搭建有状态的应用集群(MongoDB、Mysql等),同部署无状态的应用一样简便。K8s能够保证StatefulSet中各应用实例在创建和运行的过程中,都具有固定的身份标识和独立的后端存储。还支持在运行时对集群规模进行扩容、保障集群的高可用等非常重要的功能。

  • 转载请注明:文章转载自 www.mshxw.com
    本文地址:https://www.mshxw.com/it/733145.html
    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号