XSKY星辰天合
作者XSKY星辰天合·2022-01-21 11:57
技术支持·XSKY星辰天合

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

字数 9661阅读 1008评论 0赞 1

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

前言

目前容器应用已经开始流行起来,特别是在金融行业,很多创新企业已经在生产系统中使用。很多容器应用都是有状态的,比如很多分布式数据库,进入生产系统也就意味这些容器应用也需要高级别的容灾支持。 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 集群中

1 # kubectl get sc iscsi-sc -oyaml > sc.yaml
2 # kubectl get pv pvname -oyaml > pv.yaml
3 # kubectl get configmaps csi-iscsi-vid-pvname -oyaml > pv-configmaps.yaml
4 # kubectl get pvc pvcname -oyaml > pvc.yaml
5 # kubectl get pod podname -oyaml > pod.yaml
6 # 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 。

1 # kubectl create -f sc.yaml
2 # kubectl create -f pv.yaml
3 # kubectl create -f configmaps.yaml
4 # kubectl create -f pvc.yaml
5 # 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 的开放性,利用现成的开源组件,实现容器层面和管理面的双活。目前,星辰天合的同城容器双活数据中心方案已经在多个客户生产环境中部署,帮助企业全面向微服务化转型,提供系统的敏捷性,更好应对业务变化带来的挑战。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

X社区推广