前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >canal在k8s部署实现

canal在k8s部署实现

原创
作者头像
云计算小K
修改2022-03-17 17:43:31
3.9K1
修改2022-03-17 17:43:31
举报
文章被收录于专栏:小谈云原生小谈云原生

1.canal容器化面临问题

canal的架构分为admin和server。目前官网提供了容器化实现,但目前并未有canal在k8s中的验证。

将canal在k8s中部署时,如果server定义为多实例模式,注册到admin后,admin会显示的server ip为pod ip。众所周知,容器的pod ip会随着POD的重启等发生变化,一旦pod因为异常原因重启,重启后的pod ip就会发生变化,这样就会导致一个新ip重新注册到canal admin,但是旧的pod ip不会删除,所以整个页面就会越来越多。

一旦刷新页面,admin就会尝试重连pod,因为多个地址已经不存在,连不上,容易导致页面卡死;

注册后的实例未有任何表示信息,单纯依靠pod ip,很难区分,运维难度大。

4个canal server注册到admin
4个canal server注册到admin
2个pod因异常重启后,以新IP重新注册,但旧的ip未删除
2个pod因异常重启后,以新IP重新注册,但旧的ip未删除

2.解决以上问题的关键点

采用statefulset实现

以下为server端环境变量实现:

---canal.register.ip定义为:pod_name.service_name-headless.NS

---canal.register.name定义为:pod_name

充分利用statefulset的有状态特性,即使pod发生异常重启,或者pod ip改变,这样每次注册的ip和name都是一样,就可以避免上述两个问题。

代码语言:javascript
复制
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
            - name: SERVICE_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: 'metadata.labels[''app'']'
            - name: STS_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
            - name: canal.register.ip
              value: $(POD_NAME).$(SERVICE_NAME)-headless.$(STS_NAMESPACE)
            - name: canal.admin.manage
              value: 'canal-admin:8089'
            - name: canal.admin.port
              value: '11110'
            - name: canal.admin.use
              value: admin
            - name: canal.admin.passwd
              value: 4ACFE3202A5FF5CF467898FC58AAB1D615029441
            - name: canal.admin.register.auto
              value: 'true'
            - name: canal.admin.register.name
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
            - name: canal.admin.register.cluste
              value: yd_test

利用statefulset实现server部署
利用statefulset实现server部署

这样注册后,出现上面的情况,一切ok.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档