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

前言

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

1k8s平台开启快照、扩容、克隆、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三个服务,上一步中提到的参数。

2Secret配置与创建

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

3AccessPath创建

# 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创建节点

4StorageClass配置与创建

描述如何配置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协议时,需要把挂载的块设备标识为网络设备。

5PVC配置与创建

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

6POD配置与创建

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

7VolumeSnapshotClass配置与创建

此资源用于定义快照。

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配置过程

1NFS创建

使用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

3PVC配置与创建

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

4pod 配置与创建

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