Rancher部署Canal
上一篇介绍了如何Rancher部署Redis三主三从集群,这里继续介绍通过Rancher部署Canal
Canal
参考Canal官网:https://github.com/alibaba/canal/
参考Canal官网使用Docker管理Canal:https://github.com/alibaba/canal/wiki/Docker-QuickStart/
部署环境
[root@uat-master ~]# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
uat-master Ready controlplane,etcd,worker 41d v1.17.4 172.18.30.215 <none> CentOS Linux 7 (Core) 3.10.0-1062.18.1.el7.x86_64 docker://18.9.9
uat-w1 Ready worker 41d v1.17.4 172.18.30.216 <none> CentOS Linux 7 (Core) 3.10.0-1062.18.1.el7.x86_64 docker://18.9.9
uat-w2 Ready worker 40d v1.17.4 172.18.30.214 <none> CentOS Linux 7 (Core) 3.10.0-1062.18.1.el7.x86_64 docker://18.9.9
[root@uat-master ~]#
1 前期准备
参考如上配置自定义配置文件,namespace调整为 middleware
1.1 准备数据库配置参数Secret
用于保存目标数据库连接信息,用户名及密码
canal-sec.yaml
apiVersion: v1
kind: Secret
data:
canal.instance.master.address: "base64编码后的数据库主机HOST"
canal.instance.dbUsername: "base64编码后的用户名"
canal.instance.dbPassword: "base64编码后的密码"
metadata:
name: canal-secret
namespace: middleware
type: Opaque
创建canal-sec
[root@uat-master canal]# kubectl apply -f canal-sec.yaml
secret/canal-secret created
[root@uat-master canal]#
1.2 准备配置参数ConfigMap
用于保存instance.properties配置信息
canal-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: canal-cm
namespace: middleware
data:
# table regex .*\\..*表示监听所有表 也可以写具体的表名,用,隔开
canal.instance.filter.regex: .*\\..*
canal.instance.filter.regex: uat_shop_goods.ad_items
# mysql 数据解析表的黑名单,多个表用,隔开
#canal.instance.filter.black.regex:
创建configmap
[root@uat-master canal]# vi canal-cm.yaml
[root@uat-master canal]# kubectl apply -f canal-cm.yaml
configmap/canal-cm created
[root@uat-master canal]#
1.3 准备NFS
参考Rancher部署NFS持久化存储:https://blog.csdn.net/iceliooo/article/details/111461651
2 部署canal单节点
2.1 编写canal-alone-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: canal-alone
namespace: middleware
spec:
serviceName: canal-alone-headless
replicas: 1
template:
metadata:
labels:
app: canal-alone
annotations:
pod.alpha.kubernetes.io/initialized: "true"
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- canal-alone
topologyKey: "kubernetes.io/hostname"
serviceAccountName: nfs-client-provisioner
containers:
- name: canal-alone
imagePullPolicy: IfNotPresent
image: canal/canal-server:v1.1.4
resources:
requests:
memory: "0.2Gi"
cpu: "100m"
ports:
- containerPort: 11110
protocol: TCP
name: admin
- containerPort: 11111
protocol: TCP
name: http
env:
- name: SERVICE_NAME
value: "canal-alone-headless"
- name: DOMAIN_NAME
value: "cluster.local"
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: canal.instance.filter.regex
valueFrom:
configMapKeyRef:
name: canal-cm
key: canal.instance.filter.regex
- name: canal.instance.master.address
valueFrom:
secretKeyRef:
name: canal-secret
key: canal.instance.master.address
- name: canal.instance.dbUsername
valueFrom:
secretKeyRef:
name: canal-secret
key: canal.instance.dbUsername
- name: canal.instance.dbPassword
valueFrom:
secretKeyRef:
name: canal-secret
key: canal.instance.dbPassword
# 如果不需要查看日志信息,可以去掉挂载信息
volumeMounts:
- name: logs
mountPath: /home/admin/canal-server/logs
subPath: logs
volumeClaimTemplates:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: logs
namespace: middleware
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 512Mi
storageClassName: managed-nfs-storage
volumeMode: Filesystem
selector:
matchLabels:
app: canal-alone
2.2 部署canal
[root@uat-master canal]# kubectl apply -f canal-alone-statefulset.yaml
statefulset.apps/canal-alone created
[root@uat-master canal]#
2.3 部署service
canal-service.yaml
apiVersion: v1
kind: Service
metadata:
name: canal-alone-headless
namespace: middleware
labels:
app: canal-alone
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
ports:
- port: 11111
name: http
targetPort: 11111
- port: 11110
name: admin
targetPort: 11110
clusterIP: None
selector:
app: canal-alone
---
## 开放集权外访问端口,便于本地应用访问外网canal服务
apiVersion: v1
kind: Service
metadata:
name: canal-alone-client
namespace: middleware
labels:
app: canal-alone
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
ports:
- port: 11111
name: http
targetPort: 11111
- port: 11110
name: admin
targetPort: 11110
selector:
app: canal-alone
type: NodePort
部署service
[root@uat-master canal]# kubectl apply -f canal-service.yaml
··· created
[root@uat-master canal]#
2.4 验证
这里新建一个SpringBoot项目连接canal验证
pom.xml中引入canal客户端依赖包
<dependency>
<groupId>top.javatool</groupId>
<artifactId>canal-spring-boot-starter</artifactId>
<version>1.2.1-RELEASE</version>
</dependency>