有持久化的数据的应用, 部署在2套K8S集群上做双中心双活, 存储也是2套. (存储不提供存储level的双向同步方案.)
需要在2套K8S的pod上做数据的双向非实时同步.
由于"丰富的精验", 就想到了使用BT resilio来实现. 还真可以.
简单来说, 就是这样的:
有个报表类的应用, 定期或用户查询会生成一些EXCEL表格. 这个EXCEL表格放在持久化存储上(NFS上), 然后用户就能下载到.所以表格需要2边同步.
Resilio 我就不做详细介绍了. 感兴趣的可以百度一下.
简单说就是利用P2P Bittorrent 技术实现的一个同步盘.
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
在2个集群上都进行初始化配置.
通过Ingress URL访问, 创建账号密码, 点击Continue:
选择Sync Home
, 免费版的:
改名, 勾选协议, Get started:
如下图:
假设为: /mnt/sync/folders
, 如下:
创建后会生成用于 读写 或 只读 同步的密钥等信息, 如下:
创建后显示如下, 还没有用户来同步我这个文件夹:
然后在/mnt/sync/folders
下添加个 a.txt, 可以看到已经有日志记录了:
通过读写权限实现双向同步
首先, 输入A集群的读写 权限的密钥来连接到A集群的同步文件夹:
同步的文件放到哪儿, 也放到/mnt/sync/folders
下:
由于A B集群都是内网(不连接互联网), 且不在同一个LAN. 且没有通过域名发布P2P: 55555的tcp和udp端口.(tcp udp通过NodePort发布)
但是A B集群网络是通的. 所以要做以下配置:
可以看到, 1个用户(B集群)已经连上来了:
做一些操作, 可以看到2边已经在进行一个 非实时双向同步 了:
A集群的同步日志和文件夹:
B集群的同步日志和文件夹:
至此, 可行性验证成功.
调整如下: (示例)
...
image: 'registry.example.com/resilio/sync:latest'
...
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
接上回的背景: "有个报表类的应用, 定期或用户查询会生成一些EXCEL表格. 这个EXCEL表格放在持久化存储上(NFS上), 然后用户就能下载到.所以表格需要2边同步."
这个报表类的应用先通过挂载NFS PV RWX的方式, 将数据持久化.
然后再将这个PV, 也挂载到Resilio 的特定目录下. 流程如下:
Deployment 更新的配置如下:
template:
spec:
volumes:
- name: reportapp-excel
persistentVolumeClaim:
claimName: reportapp-excel
...
containers:
- name: resilio
volumeMounts:
- name: reportapp-excel
mountPath: /mnt/sync/folders/reportapp-excel
根据初步实践, 调整resources配置如下:
...
resources:
limits:
cpu: '1'
memory: 3Gi
requests:
cpu: 200m
memory: 128Mi
...
最终同步效果如下, 还是不错的. 满足了最初的需求: 在2套K8S的pod上做数据的双向非实时同步. 💪💪💪