暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

k8s集群下搭建数据同步工具-canal:canal-server篇

一粒菜鸟 2020-02-15
562


前言


    canal-server的搭建过程与canal-admin大体相同,但需要解决一下一些问题,我们知道,server是通过canal.properties中的register.ip向admin注册server信息的,但是在k8s环境下,pod的ip是不固定的,每一次pod重启其ip都会发生变化,也就会在admin中重新注册一个新的server,这种情况下程序基本是不可用的。


    本文提供一种方法,通过headlessService和StatefulSet方式搭建canal-server,使canal-server以固定域名的方式向canal-admin注册,解决pod重启ip变化,重新注册新server的问题。




容器化


环境准备:

1. yum源文件 CentOS6-Base-163.repo

2. jdk包 jdk-8u201-linux-x64.tar.gz

3. canal-server程序包 canal.server-1.1.4.tar.gz

4. centos基础镜像 centos:6.6


将准备的文件与Dockerfile放在同一文件夹下:


1. 解压canal-server程序


mkdir canal-server
tar -zxvf canal.deployer-1.1.4.tar.gz -C canal-server


2. 在canal-server/bin目录下创建文件config.sh(这部分主要是为了实现server在k8s中的自动注册过程中容器重启后ip变化的问题) 同时注意将start.sh文件中启动命令改为前台启动(删掉启动命令最后的 & )


cat > home/canal/conf/canal.properties <<- EOF
# register ip
# ${HOSTNAME} 为podname,canal-server-discovery-svc-stable为svc名称
# StatefulSet类型pod名称是固定的,k8s集群内pod域名规则为pod_name.svc_name.namespace.svc.cluster.local
canal.register.ip = ${HOSTNAME}.canal-server-discovery-svc-stable.testcanal.svc.cluster.local

#
 canal admin config
canal.admin.manager = canal-admin-stable:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 4ACFE3202A5FF5CF467898FC58AAB1D615029441
# admin auto register
canal.admin.register.auto = true
canal.admin.register.cluster =
EOF
sh home/canal/bin/restart.sh


3. Dockerfile文件


FROM centos:6.6

#
设置时钟
RUN cp usr/share/zoneinfo/Asia/Shanghai etc/localtime
RUN echo ZONE=\"Asia/Shanghai\" > etc/sysconfig/clock

#
更新yum源
RUN rm -rf etc/yum.repos.d/*.repo
COPY CentOS6-Base-163.repo etc/yum.repos.d/
RUN yum clean all


#
创建用户
RUN groupadd -g 2500 canal; useradd -u 2501 -g canal -d home/canal -m canal
RUN echo canal:De@2018er | chpasswd; echo root:dockerroot | chpasswd

#
 安装相关包
RUN yum -y install wget vi openssl.x86_64 glibc.x86_64 tar inetutils-ping net-tools telnet which file
RUN yum clean all

#
 配置java环境变量
COPY jdk-8u201-linux-x64.tar.gz opt
RUN tar -zvxf opt/jdk-8u201-linux-x64.tar.gz -C opt && \
        rm -rf opt/jdk-8u201-linux-x64.tar.gz && \
                        chmod -R 755 opt/jdk1.8.0_201 && \
                                        chown -R root:root opt/jdk1.8.0_201
RUN echo 'export JAVA_HOME=/opt/jdk1.8.0_201' >> etc/profile
RUN echo 'export JRE_HOME=$JAVA_HOME/jre' >> etc/profile
RUN echo 'export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH' >> etc/profile
RUN echo 'export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH' >> etc/profile
RUN source etc/profile

#
安装中文包
RUN yum install kde-l10n-Chinese -y
RUN yum install glibc-common -y
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
ENV JAVA_HOME opt/jdk1.8.0_201
ENV PATH $PATH:$JAVA_HOME/bin
ENV LANG zh_CN.UTF-8
ENV LC_ALL zh_CN.UTF-8

#
ADD 复制canal-server程序
ADD canal-server home/canal/
RUN chmod 755 home/canal/bin

#
启动程序
WORKDIR home/canal/bin
RUN chmod 777 /home/canal/bin/restart.sh
RUN chmod 777 /home/canal/bin/startup.sh
RUN chmod 777 /home/canal/bin/stop.sh
RUN chmod 777 /home/canal/bin/config.sh
CMD /home/canal/bin/config.sh


4. 构建镜像


docker build  -t canal/canal-server:v1.1.4 .




K8S集群内创建


以下所有操作均在testcanal命名空间下进行


    通过headless类型svc和statefulset类型的pod,使用固定不变的域名向admin注册,这也是之前sever容器化过程中config.sh脚本的作用


1. 将config.sh作为configmap,挂载到容器内,便于后续变更配置


kubectl create configmap canal-server-stable-conf --from-file=canal/canal-server/bin/config.sh -n testcanal


2. canal-server-headless-svc-stable.yaml


apiVersion: v1
kind: Service
metadata:
  name: canal-server-discovery-svc-stable
  labels:
    app: canal-server-discovery-svc-stable
  namespace: testcanal
spec:
  selector:
    app: canal-server-stable
  ports:
  - protocol: TCP
    port: 3678
    targetPort: 3678
    name: transport
  clusterIP: None


3. canal-server-statefulset-stable.yaml(文件中annotations部分是为了后续适配prometheus监控所作的配置,不需要可以删除)


apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: canal-server-stable
  namespace: testcanal
  labels:
    app: canal-server-stable
spec:
  selector:
    matchLabels:
      app: canal-server-stable
  serviceName: "canal-server-discovery-svc-stable"
  replicas: 2
  template:
    metadata:
      labels:
        app: canal-server-stable
      annotations:
        prometheus.io/path: /
        prometheus.io/port: "11112"
        prometheus.io/scrape: "true"
    spec:
      containers:
      - image: canal/canal-server:v1.1.4
        name: canal-server-stable
        imagePullPolicy: Always
        ports:
        - containerPort: 11110
          protocol: TCP
          name: admin
        - containerPort: 11111
          protocol: TCP
          name: http
        - containerPort: 11112
          protocol: TCP
          name: metric
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 4000m
            memory: 4Gi
        volumeMounts:
        - mountPath: /home/canal/bin/config.sh
          subPath: config.sh
          name: server-conf
      volumes:
        - name: server-conf
          configMap:
            name: canal-server-stable-conf
            defaultMode: 0777
      securityContext:
        runAsUser: 0


4. 创建server相关


kubectl apply -f canal-server-headless-svc-stable.yaml
kubectl apply -f canal-server-statefulset-stable.yaml

#
 查看pod创建结果
kubectl get pods -n testcnal

#
 访问master节点:31628验证server是否以域名形式注册成功

#
 重启pod查看sever注册地址是否会发生变化






一粒菜鸟


程序猿非硬核技术文档和崩溃日常




文章转载自一粒菜鸟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论