Kubernetes部署阿里巴巴canal集群

基础知识

【自行脑补】
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及客户端连接访问

待补充。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值