前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用resilio实现多集群的k8s pod数据双向非实时同步

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

作者头像
东风微鸣
发布2022-04-21 17:30:24
9260
发布2022-04-21 17:30:24
举报
文章被收录于专栏:东风微鸣技术博客

概述

背景

有持久化的数据的应用, 部署在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 ...部署:

代码语言:javascript
复制
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如下:

代码语言:javascript
复制
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等方式实现外部访问)

代码语言:javascript
复制
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如下:

代码语言:javascript
复制
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更新的配置如下:

代码语言:javascript
复制
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如下:

代码语言:javascript
复制
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: resilio-db
  namespace: test
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nas-data

Deployment YAML更新如下:

代码语言:javascript
复制
  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 更新的配置如下:

代码语言:javascript
复制
  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配置如下:

代码语言:javascript
复制
...
          resources:
            limits:
              cpu: '1'
              memory: 3Gi
            requests:
              cpu: 200m
              memory: 128Mi
...              

总结

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 东风微鸣技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
    • 背景
    • Resilio
    • 可行性验证
      • 环境概述
        • 部署 Resilio
          • Resilio 初始化配置
            • A集群创建需要同步的文件夹
              • B集群配置双向同步
                • 内网环境的特殊配置
                  • 验证
                  • 其他实践化配置
                    • 使用内网镜像库
                      • 使用ConfigMap 外化sync.conf
                        • 持久化/mnt/sync/config文件夹
                          • 将需要进行数据同步的PV挂载到 Resilio 目录下
                            • 配置资源requests和limits
                            • 总结
                            相关产品与服务
                            容器服务
                            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档