基础知识
【自行脑补】
https://www.bookstack.cn/read/canal-v1.1.4
https://github.com/alibaba/canal
前提条件
- 本文采用的部署版本为v1.1.7
- 提前部署好zookeeper集群,如无zookeeper集群,则只能部署单节点canal-server
- canal-admin需要mysql数据库,可以独立部署mysql服务器,如无独立mysql服务器,canal-admin本身也自带mysql-server。(本文采用canal-admin自带的mysql-server)
部署canal-admin
建议将canal-admin部署为有状态工作负载。
apiVersion: v1
kind: Service
metadata:
name: canal-admin-headless
namespace: chen
labels:
app: canal-admin
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
ports:
- port: 8089
name: canal-admin-server
targetPort: 8089
clusterIP: None
selector:
app: canal-admin
---
kind: Service
apiVersion: v1
metadata:
name: canal-admin
namespace: chen
labels:
app: canal-admin
annotations:
kubesphere.io/description: canal-admin-service
spec:
ports:
- name: tcp-8089
protocol: TCP
port: 8089
targetPort: 8089
selector:
app: canal-admin
type: ClusterIP
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: canal-admin
namespace: chen
spec:
serviceName: canal-admin-headless
replicas: 1
template:
metadata:
labels:
app: canal-admin
annotations:
pod.alpha.kubernetes.io/initialized: "true"
spec:
containers:
- name: canal-admin
imagePullPolicy: IfNotPresent
image: canal/canal-admin:v1.1.7
resources:
requests:
memory: "2Gi"
cpu: "500m"
ports:
- containerPort: 8089
name: web-port
env:
# canal-admin web服务端口
- name: server.port
value: '8089'
# 用来与canal-server连接认证的用户名
- name: canal.adminUser
value: admin
# 用来与canal-server连接认证的密码(明文)
- name: canal.adminPasswd
value: admin
selector:
matchLabels:
app: canal-admin
---
# 发布nodeport给我们访问canal-admin的web界面进行配置
apiVersion: v1
kind: Service
metadata:
name: canal-admin-nodeport
namespace: chen
labels:
app: canal-admin
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
ports:
- port: 8089
name: canal-admin-web
targetPort: 8089
nodePort: 30089
clusterIP:
type: NodePort
selector:
app: canal-admin
新建canal集群配置
部署完canal-admin之后,我们便可以使用上面发布的nodeport来访问。
默认用户名admin密码123456
点击新建集群
输入集群名称和zookeeper集群地址,多个地址可以用英文逗号隔开。
点击操作–>主配置,修改集群的主配置文件
初次配置可以“载入模板”,编辑完成点击“保存”
默认情况下只需修改zkServers地址和spring配置方式。其他配置自行选配。配置项都可以使用K8S环境变量进行覆盖,因此,这里只需修改固定不变的部分配置,其他配置都在部署canal-server的环境变量中定义。
# zookeeper地址,可以单个也可以多个,多个地址用英文逗号隔开
canal.zkServers = zk01:2181,zk02:2181,zk03:2181
# 全局的spring配置方式的组件文件
# 所有组件的数据都选择内存模式,速度快,但无数据存储,重启后又会回到初始位点进行解析
#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
# 基于file的持久化模式,支持单点canal,无HA,简单易用,会将位点信息写到meta.dat文件中
#canal.instance.global.spring.xml = classpath:spring/file-instance.xml
# store选择了内存模式,其余的parser/sink依赖的位点管理选择了持久化模式,目前持久化的方式主要是写入zookeeper,保证数据集群共享
canal.instance.global.spring.xml = classpath:spring/default-instance.xml
部署canal-server
官方文档建议使用无状态工作负载来部署管理canal-server,但实际由于无状态工作负载容器重启后pod的IP会变化,自动注册到canal-admin上后,使用旧IP注册的server节点还是存在,并不会自动删除,会造成canal-admin上有很多过期无用的canal-server节点,所以建议使用StatefulSet方式进行部署。
apiVersion: v1
kind: Service
metadata:
name: canal-server-headless
namespace: chen
labels:
app: canal-server
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
ports:
- port: 11110
name: canal-server-11110
targetPort: 11110
- port: 11111
name: canal-server-11111
targetPort: 11111
- port: 11112
name: canal-server-11112
targetPort: 11112
clusterIP: None
selector:
app: canal-server
---
kind: Service
apiVersion: v1
metadata:
name: canal-server
namespace: chen
labels:
app: canal-server
annotations:
kubesphere.io/description: canal-server-service
spec:
ports:
- name: tcp-11110
protocol: TCP
port: 11110
targetPort: 11110
- name: tcp-11111
protocol: TCP
port: 11111
targetPort: 11111
- name: tcp-11112
protocol: TCP
port: 11112
targetPort: 11112
selector:
app: canal-server
type: ClusterIP
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: canal-server
namespace: chen
spec:
serviceName: canal-server-headless
# 副本数,由于canal只是HA模式,其实两个就足够的。
replicas: 3
template:
metadata:
labels:
app: canal-server
annotations:
pod.alpha.kubernetes.io/initialized: "true"
spec:
containers:
- name: canal-server
imagePullPolicy: IfNotPresent
image: canal/canal-server:v1.1.7
resources:
requests:
memory: "2Gi"
cpu: "500m"
ports:
- containerPort: 11110
name: admin-port
- containerPort: 11111
name: server-port
- containerPort: 11112
name: metrics-port
env:
# 取StatefulSet中pod name的字段
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
# 取StatefulSet中的labels字段作为service name前缀
- name: SERVICE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: 'metadata.labels[''app'']'
# 取StatefulSet中的namespace字段
- name: STS_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
# 使用上面取到的字段,定义为canal-server的IP,用来连接注册到canal-admin
- name: canal.register.ip
value: $(POD_NAME).$(SERVICE_NAME)-headless.$(STS_NAMESPACE)
# canal-admin的连接地址(配置该值后,canal-server会自动选择sh startup.sh local进行启动)
- name: canal.admin.manager
value: 'canal-admin-headless:8089'
# canal-admin服务的通信端口
- name: canal.admin.port
value: '11110'
# canal-admin用户名(用来与canal-admin双向验证)
- name: canal.admin.user
value: admin
# canal-admin密码 密文形式,与canal-admin的canal.adminPasswd的值相同(用来与canal-admin双向验证)
- name: canal.admin.passwd
value: 4ACFE3202A5FF5CF467898FC58AAB1D615029441
# 自动加入canal-admin集群
- name: canal.admin.register.auto
value: 'true'
# 取StatefulSet中的pod name字段,用作在canal-admin中显示的名字
- name: canal.admin.register.name
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
# 加入canal-admin中新建的集群名字
- name: canal.admin.register.cluster
value: uat
# 开启instance自动扫描
- name: canal.auto.scan
value: 'true'
selector:
matchLabels:
app: canal-server
查看canal-admin页面,canal-server已注册到集群内。
至此canal-server集群部署完毕
新建instance及客户端连接访问
待补充。