使用 resilio 实现多集群的 k8s pod 数据双向非实时同步

用户头像
东风微鸣
关注
发布于: 2020 年 11 月 30 日
使用resilio实现多集群的k8s pod数据双向非实时同步

概述



背景



有持久化的数据的应用, 部署在2套K8S集群上做双中心双活, 存储也是2套. (存储不提供存储level的双向同步方案.)



需要在2套K8S的pod上做数据的双向非实时同步.



由于"丰富的精验", 就想到了使用BT resilio来实现. 还真可以.



简单来说, 就是这样的:



有个报表类的应用, 定期或用户查询会生成一些EXCEL表格. 这个EXCEL表格放在持久化存储上(NFS上), 然后用户就能下载到.所以表格需要2边同步.



Resilio



Resilio 我就不做详细介绍了. 感兴趣的可以百度一下.



简单说就是利用P2P Bittorrent 技术实现的一个同步盘.





可行性验证



环境概述



  1. A, B 2个K8S集群



部署 Resilio



Resilio Deployment YAML如下: (部署的租户为test)



直接在A B集群上通过kubectl apply -f ...部署:

kind: Deployment
apiVersion: apps/v1
metadata:
name: resilio
namespace: test
labels:
app: resilio
spec:
replicas: 1
selector:
matchLabels:
app: resilio
template:
metadata:
labels:
app: resilio
spec:
volumes:
- name: resilio-1
emptyDir: {}
- name: resilio-config
configMap:
name: resilio-config
defaultMode: 420
containers:
- name: resilio
image: >-
resilio/sync:latest
ports:
- containerPort: 55555
protocol: TCP
- containerPort: 55555
protocol: UDP
- containerPort: 8888
protocol: TCP
resources: {}
volumeMounts:
- name: resilio-1
mountPath: /mnt/sync
- name: resilio-config
mountPath: /mnt/sync/sync.conf
subPath: sync.conf
imagePullPolicy: IfNotPresent
restartPolicy: Always
dnsPolicy: ClusterFirst
strategy:
type: Recreate

Service YAML如下:

kind: Service
apiVersion: v1
metadata:
name: resilio
namespace: test
labels:
app: resilio
spec:
ports:
- name: 55555-tcp
protocol: TCP
port: 55555
targetPort: 55555
- name: 55555-udp
protocol: UDP
port: 55555
targetPort: 55555
- name: 8888-tcp
protocol: TCP
port: 8888
targetPort: 8888
selector:
app: resilio
type: ClusterIP

OpenShift Router 配置如下: (类似K8S 的Ingress. 也可以通过port-forward, nodeport, LoadBalancer等方式实现外部访问)

kind: Route
apiVersion: route.openshift.io/v1
metadata:
name: resilio
namespace: test
labels:
app: resilio
spec:
to:
kind: Service
name: resilio
weight: 100
port:
targetPort: 8888-tcp

Resilio 初始化配置



在2个集群上都进行初始化配置.



通过Ingress URL访问, 创建账号密码, 点击Continue:





选择Sync Home, 免费版的:





改名, 勾选协议, Get started:





A集群创建需要同步的文件夹



如下图:





假设为: /mnt/sync/folders, 如下:





创建后会生成用于 读写 或 *只读* 同步的密钥等信息, 如下:





创建后显示如下, 还没有用户来同步我这个文件夹:





然后在/mnt/sync/folders 下添加个 a.txt, 可以看到已经有日志记录了:





B集群配置双向同步



通过读写权限实现双向同步



首先, 输入A集群的读写 权限的密钥来连接到A集群的同步文件夹:







同步的文件放到哪儿, 也放到/mnt/sync/folders下:





内网环境的特殊配置



由于A B集群都是内网(不连接互联网), 且不在同一个LAN. 且没有通过域名发布P2P: 55555的tcp和udp端口.(tcp udp通过NodePort发布)



但是A B集群网络是通的. 所以要做以下配置:



  1. 勾选 使用预定义主机:

  2. (可选): 取消勾选 需要时使用中继服务器

  3. (可选): 取消勾选 使用跟踪程序服务器





验证



可以看到, 1个用户(B集群)已经连上来了:





做一些操作, 可以看到2边已经在进行一个 非实时双向同步 了:



A集群的同步日志和文件夹:







B集群的同步日志和文件夹:







至此, 可行性验证成功.



其他实践化配置



使用内网镜像库



调整如下: (示例)

...
image: 'registry.example.com/resilio/sync:latest'
...

使用ConfigMap 外化sync.conf

sync.conf的ConfigMap如下:



kind: ConfigMap
apiVersion: v1
metadata:
name: resilio-config
namespace: test
data:
sync.conf: |
{
"listening_port" : 55555,
"storage_path" : "/mnt/sync/config",
"vendor" : "docker",
"display_new_version": false,

"directory_root_policy" : "belowroot",
"directory_root" : "/mnt/",

"webui" :
{
"listen" : "0.0.0.0:8888",
"allow_empty_password" : false,
"dir_whitelist" : [ "/mnt/sync/folders", "/mnt/mounted_folders" ]
}
}

Deployment YAML更新的配置如下:

spec:
template:
spec:
volumes:
- name: resilio-config
configMap:
name: resilio-config
...
containers:
- name: resilio
volumeMounts:
- name: resilio-config
mountPath: /mnt/sync/sync.conf
subPath: sync.conf

引用:

官方关于sync.conf的详细说明如下:





持久化`/mnt/sync/config`文件夹



PVC YAML如下:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: resilio-db
namespace: test
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nas-data

Deployment YAML更新如下:

template:
spec:
volumes:
- name: resilio-db
persistentVolumeClaim:
claimName: resilio-db
...
containers:
- name: resilio
volumeMounts:
- name: resilio-db
mountPath: /mnt/sync/config

将需要进行数据同步的PV挂载到 Resilio 目录下



接上回的背景: "有个报表类的应用, 定期或用户查询会生成一些EXCEL表格. 这个EXCEL表格放在持久化存储上(NFS上), 然后用户就能下载到.所以表格需要2边同步."



这个报表类的应用先通过挂载NFS PV RWX的方式, 将数据持久化.



然后再将这个PV, 也挂载到Resilio 的特定目录下. 流程如下:



  1. 报表类应用产生EXCEL文件, 写入到NFS上;

  2. NFS 已经Mount到Resilio 上, Resilio监测到NFS对应文件夹的变化;

  3. 另一个集群启动Resilio, 也监测到了文件夹的变化, 开始同步.

  4. ...



Deployment 更新的配置如下:

template:
spec:
volumes:
- name: reportapp-excel
persistentVolumeClaim:
claimName: reportapp-excel
...
containers:
- name: resilio
volumeMounts:
- name: reportapp-excel
mountPath: /mnt/sync/folders/reportapp-excel

配置资源requests和limits



根据初步实践, 调整resources配置如下:

...
resources:
limits:
cpu: '1'
memory: 3Gi
requests:
cpu: 200m
memory: 128Mi
...

总结



最终同步效果如下, 还是不错的. 满足了最初的需求: 在2套K8S的pod上做数据的双向非实时同步.









发布于: 2020 年 11 月 30 日阅读数: 24
用户头像

东风微鸣

关注

资源共享, 天下为公! 2018.11.08 加入

APM行业认证专家, 容器技术认证专家. 现任中国大地保险PAAS平台架构师. 公众号:东风微鸣技术博客

评论

发布
暂无评论
使用resilio实现多集群的k8s pod数据双向非实时同步