canal在k8s部署实现
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,很难区分,运维难度大。
2.解决以上问题的关键点
采用statefulset实现
以下为server端环境变量实现:
---canal.register.ip定义为:pod_name.service_name-headless.NS
---canal.register.name定义为:pod_name
充分利用statefulset的有状态特性,即使pod发生异常重启,或者pod ip改变,这样每次注册的ip和name都是一样,就可以避免上述两个问题。
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
这样注册后,出现上面的情况,一切ok.