kafka命令空间下Pod kafka-kafka-X为非Running状态。
1、查看问题Pod日志。
关键日志:
client: /127.0.0.1:32896, server: localhost/127.0.0.1:2181
Timed out waiting for connection while in state: CONNECTING
2、127.0.0.1:2181是什么?
查看Sidecar容器日志,继续分析。
关键日志:
Service [zookeeper-2181] accepted connection from 127.0.0.1:32896
connect_blocking: connected
其中,A为zk service,后面对应3个endpoint,分别为kafka-zookeeper-0,kafka-zookeeper-1,kafka-zookeeper-2。
3、连通性验证
分析:该Pod由两个容器组成,主容器kafka,以及sidecar容器tls-sidecar,前者kafka会通过127.0.0.1:2181连接zk,由于访问失败导致主容器启动失败,从而整个Pod启动失败。后者tls-sidecar提供的127.0.0.1:2181实际上是访问同namespace的zk svc:kafka-zookeeper-client 172.16.218.3:2181,svc则通过rr模式访问后端3个zk Pod。排障经过:进入容器tls-sidecar中,直接curl 172.16.218.3:2181,能rr到3个zk Pod,正常响应;直接curl 3个后端zk Pod的2181端口也正常。对比,curl 127.0.0.1:2181,实际会转换zk svc 172.16.218.3:2181,rr 3次请求只会成功一次,成功这次为相同节点的zk Pod响应。通过抓包分析,curl 127.0.0.1:2181实际走的https,而直接curl 172.16.218.3:2181或3个后端,实际走的http。二者效果不同,http协议通,https协议不通。换验证方式,curl https://172.16.218.3:2181,以及3个后端,也是只有相同节点的zk Pod能响应。问题变换为跨节点执行https为何不通的问题。Node节点上直接抓包,现象也相同。经抓包,原节点tunl0网卡出错"TCP Previous segment not captured",目的节点tunl0网卡及cali网卡出错"TCP Retransmission"。后续分析:tunl0的mtu及其他网络接口的二三层配置是否对数据包的转发有影响。
4、继续分析
处理过程:1、昨日怀疑IPIP隧道tunl0的mtu有问题。2、Calico官网查询mtu相关资料,IPIP模式协议头占20字节,需要在节点主网卡mtu上减20,当前集群主网卡eth0的mtu为1450,tunl0的mtu为1440,不满足Calico要求。相关链接:https://docs.projectcalico.org/networking/mtu3、按照上述资料调整集群的mtu,主要使用下面两条命令$ kubectl patch configmap/calico-config -n kube-system --type merge -p '{"data":{"veth_mtu": "1430"}}'$ kubectl rollout restart daemonset calico-node -n kube-system4、再次观察tunl0的mtu,已自动修改为1430。5、新的mtu需要对新Pod生效,所以手动删除kafka命名空间下已有Pod,使其自动重建。6、待Pod重建后,观察到Pod内eth0的mtu已为1430。7、Pod kafka-kafka-0内连通性检查,3次curl 127.0.0.1:2181正常;3次curl -k 172.16.218.3:2181(zk svc)正常;分别curl -k
昨日怀疑IPIP隧道tunl0的mtu有问题,今天分析后,修改集群Calico的mtu从1440到1430,问题解决。后续会针对Calico IPIP模式调整集群部署工具的参数。
Configure MTU to maximize network performance:https://docs.projectcalico.org/networking/mtu