百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

容器同城双活数据中心最佳实践

toyiye 2024-06-21 12:08 24 浏览 0 评论


摘要:本文给出了容器双活数据中心的配置举例和案例参考,有状态容器应用进入生产系统再无后顾之忧

前言

目前容器应用已经开始流行起来,特别是在金融行业,很多创新企业已经在生产系统中使用。很多容器应用都是有状态的,比如很多分布式数据库,进入生产系统也就意味这些容器应用也需要高级别的容灾支持。XSKY星辰天合作为国内率先支持CSI(容器存储接口)标准的专业SDS厂商,在容器存储方面有很多成功的案例。而且,星辰天合采用延展集群配合各个版本的Kubernetes(K8s)容器编排软件,帮助用户实现实现容器双活数据中心,助力容器应用支撑核心业务。

延展集群

星辰天合延展集群功能为跨地域的业务双活方案提供存储支撑。 延展集群需要与业务紧密配合实现业务高可用,本文以对接K8s虚拟化场景为例介绍业务高可用解决方案及其配置方法。

出于对关键业务容灾,避免业务宕机,保障业务持续可用的目的考虑,很多企业开始兴建双活数据中心,特别是金融行业。XEDP可跨同城数据中心部署存储延展集群,实现数据中心级故障域,存储多副本数据镜像在两个数据中心,保证任何一个数据中心内所有存储节点故障,业务零切换、数据零丢失。

用户搭建XEDP延展集群在双活数据中心,除了需保证存储池跨两站点创建保证业务数据对象多副本,同时需要在两个数据中心平均分配MON角色,并在第三站点部署一个MON仲裁节点。所有站点之间通过高速、低延迟网络连接。每个站点被配置作为一个单独的故障域,MON最小支持配置是1(数据中心A MON数量)+1(数据中心B MON数量)+1(仲裁节点MON数量)(3节点)。当出现数据中心故障(如地域性灾害)时,仍将有超过50%的MON组件可用,从而保障XEDP分布式存储集群的持续可用。XEDP分布式存储的这种特性,使得延展集群成为实现企业数据双活数据中心最简便,且切实可行的方案。

XEDP分布式存储系统支持将集群内的存储节点放置在不同的数据中心中,确保一个数据对象的多个副本保存在不同地理位置的存储节点上,实现多副本数据高可用。从管理面到底层存储,可运行在二层或三层网络之上,支持不同子网间的部署通信,降低用户网络配置的复杂度。

容器对接

k8s集群如何在SDS延展集群之上配置与使用?

k8s与XSKY SDS之间通过CSI来实现对接。CSI 官方认证:https://kubernetes-csi.github.io/docs/drivers.html

XSKY CSI Driver分为Block Driver与 NFS driver。管理使用XMS API对接。IO面,Block Driver使用iSCSI协议与k8s node节点通信;NFS driver使用NFS协议与k8s node节点通信。Block volume支持VIP与多路径方式进行卷挂载。

延展集群中,目前建议CSI iSCSI Driver使用多路径进行对接。

通过在访问路径中添加多个数据中心的多个网关节点来保证多路径链路冗余。当灾难发生,多路径的冗余可以保障数据访问的正常。

CSI iSCSI Driver配置过程

1、k8s平台开启快照、扩容、克隆、raw功能

k8s默认未开启快照、扩容、克隆、raw功能,需要配置kube-apiserver.yaml、kube-controller-manager.yaml、10-kubeadm.conf 中的参数开启功能。如果k8s新版本功能GA,就不再需要配置。

版本说明见k8s官网:https://kubernetes-csi.github.io/docs/drivers.html

添加如下参数:

BlockVolume:开启raw卷功能

CSIBlockVolume:开启raw卷功能

VolumeSnapshotDataSource:开启快照功能

ExpandCSIVolumes:开启扩容功能

ExpandInUsePersistentVolumes:开启在线扩容功能

VolumePVCDataSource:开启克隆功能(k8s 1.15.0+版本支持)

使用rancher对接时,需要在rancher管理界面配置kube-apiserver、kube-controller、kubelet三个服务,上一步中提到的参数。

2、Secret配置与创建

此功能用于保存SDS管理用户的用户名与密码,提供给CSI Driver使用。

3、AccessPath创建

# vi cr-ap.yaml
apiVersion: "sds.xsky.com/v1"
kind: AccessPath
metadata:
name: my-ap #kubernete显示的资源名称
spec:
name: myap #SDS存储上AccessPath名称
type: Kubernetes #accesspath类型,默认为Kubernetes
cluster_info:
xmsServers: 10.252.90.39 #SDS集群管理节点IP地址,可配置多个,逗号隔开
secret_name: test-secret #SDS集群secret
secret_namespace: default #secret所属命名空间
gateway: vm39,vm40,vm41 #配置块网关hostname
vip_group: #配置vip
preempt: false #optional #vip是否回切
vips: #如不需要vip,请配置为vips: [],并使用#号注释下面三行
- vip: 10.252.90.100 #vip ip
mask: 24 #vip子网
default_gateway: vm39 #vip创建节点

4、StorageClass配置与创建

描述如何配置StorageClass,及参数解释、定义一个后端存储。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: my-sc # StorageClass的名称
parameters:
accessPaths: my-ap # 上一步中创建的AccessPath名称
fsType: ext4 # 文件系统格式。支持xfs,ext4,ext3
pool: poolB # 存储池名称
xmsServers: 10.252.3.179,10.252.3.180,10.252.3.181 # SDS管理节点管理IP,建议配置3个,以逗号隔开,csi iscsi driver顺序使用ip访问
csi.storage.k8s.io/provisioner-secret-name: test-secret # secret名称
csi.storage.k8s.io/provisioner-secret-namespace: default # secret命名空间
provisioner: iscsi.csi.xsky.com # 默认为iscsi.csi.xsky.com
reclaimPolicy: Delete
allowVolumeExpansion: true # 是否允许卷扩容。true为允许,false为不允许
mountOptions:
- _netdev # 添加mount参数,使用iscsi协议时,需要把挂载的块设备标识为网络设备。

5、PVC配置与创建

PVC资源,依赖storageclass,用于定义及自动创建一个后端卷。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc #name:pvc名称
namespace: default #此pvc安装在哪个命名空间
spec:
volumeMode: Filesystem #Filesystem:以文件系统挂载,文件系统格式在strogeclass定义
#Block:以裸卷方式挂载
storageClassName: my-sc
accessModes:
- ReadOnlyMany #ReadWriteOnce:只允许本节点挂载
#ReadOnlyMany:允许多节点以只读方式挂载,pod中挂载卷需要配置成只读。
#ReadWriteMany:允许多节点以读写方式挂载(iscsi不支持,NFS支持)
resources:
requests:
storage: 20Gi

6、POD配置与创建

Pod是k8s基本资源,Pod中可以跑一个或多个容器,也可以挂载本地或后端存储卷。

apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: web-server
image: nginx
volumeMounts: #挂载文件系统,定义pvc格式化成文件系统形式挂载到pod内(对应PVC中的volumeMode: Filesystem)
- name: pvc-1 #关联volumes的名称
mountPath: /var/lib/www/html #指定容器中挂载点
readOnly: false #readOnly:卷是否只读。true为只读,false为读写,在下面卷上定义也可以

# volumeDevices: #挂载裸设备,定义pvc以裸设备形式挂载到pod内(对应PVC中的volumeMode: Block)
# - devicePath: /dev/xda #绑定到容器盘符
# name: nginx-storage-block #关联卷的名称

volumes: #定义卷信息,指定为pvc卷
- name: pvc-1
persistentVolumeClaim:
claimName: my-pvc #指定PVC
readOnly: false

7、VolumeSnapshotClass配置与创建

此资源用于定义快照。

apiVersion: snapshot.storage.k8s.io/v1alpha1
kind: VolumeSnapshotClass
metadata:
name: csi-hostpath-snapclass # VolumeSnapshotClass名称
parameters:
flatten: "true" # restore时是否断链,true为断链,false为不断链
use: "true" # 是否允许restore,true为允许,false为不允许
snapshotter: iscsi.csi.xsky.com
deletionPolicy: Delete # Retain:保留后端快照 Delete:删除后端快照


CSI NFS Driver配置过程

1、NFS创建

使用chrome浏览器登录SDS dashboard,分别创建文件客户端&客户端组、文件网关组、文件系统,添加NFS共享 。

2、StorageClass 配置与创建

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-nfs-sc
provisioner: com.nfs.csi.xsky
parameters:
xmsServers: 10.252.3.179,10.252.3.180,10.252.3.181 # SDS管理节点管理IP,建议配置3个,以逗号隔开
user: admin # SDS管理节点用户名
password: admin # SDS管理节点密码
shares: 192.168.120.123:/sdsfs/k8s-nfs/ # NFS共享地址,配置多个以逗号隔开
clientGroupName: "k8s-cluster" # 客户端名称,删除此字段或者字段值为空表示公开共享
reclaimPolicy: Delete # 删除策略
mountOptions:
- vers=3 # vers:支持v3,v4。默认使用v3

3、PVC配置与创建

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-nfs-pvc # PVC名称
spec:
accessModes:
- ReadWriteOnce # 访问模式
# ReadWriteOnce:只允许单节点挂载
# ReadOnlyMany:允许多节点以只读方式挂载,pod中挂载卷需要配置成只读。
# ReadWriteMany:允许多节点以读写方式挂载(iscsi不支持,NFS支持)
resources:
requests:
storage: 5Gi
storageClassName: csi-nfs-sc

4、pod 配置与创建

apiVersion: v1
kind: Pod
metadata:
name: csi-nfs-demopod
spec:
containers:
- name: web-server
image: nginx
volumeMounts:
- name: mypvc # 本配置文件定义的卷名称
mountPath: /var/lib/www/html # 挂载到容器中的目录
volumes:
- name: mypvc # 本配置文件定义的卷名称
persistentVolumeClaim:
claimName: csi-nfs-pvc # pvc名称
readOnly: false # true为只读,false为读写

容灾恢复

当XSKY的延展集群用于K8s容器集群容灾,如何进行pvc恢复?

在K8s这端需要使用到双活运维工具,负载均衡组件之间也通过HA部署方式保证其高可用,如使用Keepalive,或者统一采用 pacemaker+corosync 组件保证容器的高可用和稳定性,主要目的是同步两个集群之间的计算端相关文件。整个k8s集群容灾需要拷贝所有k8s资源,存储则可以通过XSKY延展集群来实现。

步骤如下:

主Kubernetes集群与备Kubernetes集群部署同一套XSKY CSI Driver,部署方法参考最佳实践手册。

NFS 对接,网关组需要添加两个中心网关节点。VIP运行在主中心节点。

iSCSI对接,AP需要关联两个中心网关节点。

使用双活运维工具备份主k8s集群中的sc,pv,pvc,pod,configmaps,secret相关的配置信息到备K8s集群中

# kubectl get sc iscsi-sc -oyaml > sc.yaml
# kubectl get pv pvname -oyaml > pv.yaml
# kubectl get configmaps csi-iscsi-vid-pvname -oyaml > pv-configmaps.yaml
# kubectl get pvc pvcname -oyaml > pvc.yaml
# kubectl get pod podname -oyaml > pod.yaml
# kubectl get secret secretname -oyaml > secret.yaml #iscsi对接需要用到拷贝secret

修改pv.yaml,注释掉uid与claimRef,persistentVolumeReclaimPolicy修改为Retain。

# vim nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
pv.kubernetes.io/provisioned-by: com.nfs.csi.xsky
creationTimestamp: "2020-05-12T09:41:07Z"
finalizers:
- kubernetes.io/pv-protection
- external-attacher/com-nfs-csi-xsky
name: pvc-a5ff70ef-9434-11ea-a29c-fa8f374b5500
resourceVersion: "64802021"
selfLink: /api/v1/persistentvolumes/pvc-a5ff70ef-9434-11ea-a29c-fa8f374b5500
#uid: b455608e-9434-11ea-a29c-fa8f374b5500
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 5Gi
#claimRef:
# apiVersion: v1
# kind: PersistentVolumeClaim
# name: csi-nfs-pvc
# namespace: default
# resourceVersion: "64801647"
# uid: a5ff70ef-9434-11ea-a29c-fa8f374b5500
csi:
driver: com.nfs.csi.xsky
fsType: ext4
volumeAttributes:
password: admin
shares: 192.168.120.250:/sdsfs/csi-fs-1/
storage.kubernetes.io/csiProvisionerIdentity: 1589276173990-8081-com.nfs.csi.xsky
user: admin
volumeInfo: '{"id":0,"name":"pvc-a5ff70ef-9434-11ea-a29c-fa8f374b5500","sc":{"id":0
,"name":"","xmsServers":"10.252.90.60,10.252.90.101","user":"admin","password":"admin","client_group_name":"","shares":["192.168.120.250:/sdsfs/csi-fs-1/"]},"size":5368709120,"shares":null,"folder_id":11,"quota_tree_id":6,"gateway_group_id":2,"full_share_path":"192.168.120.250:/sdsfs/csi-fs-1/pvc-a5ff70ef-9434-11ea-a29c-fa8f374b5500","share_id":0,"client_group_id":0}' xmsServers: 10.252.90.60,10.252.90.101
volumeHandle: csi-nfs-vid-pvc-a5ff70ef-9434-11ea-a29c-fa8f374b5500
mountOptions:
- vers=3
persistentVolumeReclaimPolicy: Retain
storageClassName: csi-nfs-sc
volumeMode: Filesystem
status:
phase: Bound

备k8s集群恢复sc,pv,pvc,pod。

# kubectl create -f sc.yaml
# kubectl create -f pv.yaml
# kubectl create -f configmaps.yaml
# kubectl create -f pvc.yaml
# kubectl create -f pod.yaml

到此,pvc,pod恢复完成。

成功案例——容器持久化存储双活数据中心方案

马上消费金融

解决方案:

提供一套XSKY延展集群部署方案,共12节点,满足马上消费金融存储基础架构部署要求,同时可以配合上层容器、MySQL数据库实现业务平台层高可用建设。

两中心使用两个延展池,每个k8s集群使用本地为主pg pool。

使用csi iscsi driver动态对接k8s,提供块存储卷。

访问路径关联两中心块网关,实现机房容灾。

块网关配置VIP权重,优先机房内节点切换。

优点:

提供块存储卷,较好读写性能。

动态供应块存储卷,提供卷扩容、快照、clone、raw高级功能。

访问路径VIP切换约10秒。

写在后面

XSKY星辰天合的容器双活解决方案,IO面通过独有的延展集群技术,保证两个数据中心的一致性,并且引入仲裁机制,保障故障的可靠切换。在管理面,星辰天合通过和Kubernetes开源社区和各个容器平台厂商合作,利用K8s的开放性,利用现成的开源组件,实现容器层面和管理面的双活。目前,星辰天合的同城容器双活数据中心方案已经在多个客户生产环境中部署,帮助企业全面向微服务化转型,提供系统的敏捷性,更好应对业务变化带来的挑战。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码