找回密码
 立即注册
首页 业界区 业界 Calico-Node Pod 启动时 READY 状态卡在 0/1 排查流程 ...

Calico-Node Pod 启动时 READY 状态卡在 0/1 排查流程

拍棹 2 小时前
Calico Node 启动失败

故障表现

发现请求集群 demo 入口时卡住,并且对应 Pod 没有新的日志输出
  1. root@ce-demo-1:~# kubectl get pods -n deepflow-otel-spring-demo -o wide
  2. NAME                         READY   STATUS    RESTARTS   AGE    IP               NODE        NOMINATED NODE   READINESS GATES
  3. db-demo-0                    1/1     Running   0          2d1h   10.244.81.203    ce-demo-3   <none>           <none>
  4. nacos-0                      1/1     Running   0          2d1h   10.244.142.37    ce-demo-1   <none>           <none>
  5. svc-item-588b4cfcc9-zkvpd    1/1     Running   0          2d1h   10.244.142.36    ce-demo-1   <none>           <none>
  6. svc-order-5f67c67555-ds7bj   1/1     Running   0          2d1h   10.244.228.140   ce-demo-2   <none>           <none>
  7. svc-stock-b9df64d4b-bsxs5    1/1     Running   0          2d1h   10.244.142.38    ce-demo-1   <none>           <none>
  8. svc-user-7c5c7b488f-4zjdc    1/1     Running   0          2d1h   10.244.81.204    ce-demo-3   <none>           <none>
  9. web-shop-5d495d8cbc-lnpxq    1/1     Running   0          2d1h   10.244.228.139   ce-demo-2   <none>           <none>
  10. root@ce-demo-1:~# curl 10.244.228.139:8090/shop/full-test
  11. ## 等待很久后报错
  12. curl: (28) Failed to connect to 10.244.228.139 port 8090 after 133345 ms: Could not connect to server
  13. ## 此处新开终端查看日志后再次请求,发现没有新的日志
  14. root@ce-demo-1:~# kubectl logs -f -n deepflow-otel-spring-demo web-shop-5d495d8cbc-lnpxq --tail 20
复制代码
排查流程


  • 在客户端抓包发现请求后一直建连失败,从客户端 IP 看出,识别到 Server IP 是 Pod IP,所以直接走了 calico 网口转发
1.png
  1. tcpdump -v -i any dst 10.244.228.139 -w pod.pcap
复制代码
  1. root@ce-demo-1:~# ip a s vxlan.calico
  2. 30499: vxlan.calico: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000
  3.     link/ether 66:e0:bb:93:52:4f brd ff:ff:ff:ff:ff:ff
  4.     inet 10.244.142.0/32 scope global vxlan.calico
  5.        valid_lft forever preferred_lft forever
复制代码

  • 由上数据怀疑是 ce-demo-2 节点 calico 问题,查看后发现对应节点 calico-node 运行异常:
此组件作用可参考官网 calico/node 配置说明 和 calico 组件架构
  1. root@ce-demo-1:~# kubectl get pods -n calico-system -o wide
  2. NAME                                       READY   STATUS    RESTARTS   AGE    IP               NODE        NOMINATED NODE   READINESS GATES
  3. calico-kube-controllers-86596856c4-w7nsl   1/1     Running   0          2d9h   10.244.228.132   ce-demo-2   <none>           <none>
  4. calico-node-n2b4b                          1/1     Running   0          2d9h   10.51.0.102      ce-demo-3   <none>           <none>
  5. calico-node-p4k7s                          1/1     Running   0          2d9h   10.51.0.100      ce-demo-1   <none>           <none>
  6. calico-node-sbxrk                          0/1     Running   0          44h    10.51.0.101      ce-demo-2   <none>           <none>
  7. calico-typha-75c74d6ffd-6xq2j              1/1     Running   0          2d9h   10.51.0.100      ce-demo-1   <none>           <none>
  8. calico-typha-75c74d6ffd-fkf6b              1/1     Running   0          2d9h   10.51.0.102      ce-demo-3   <none>           <none>
  9. csi-node-driver-72pkg                      2/2     Running   0          2d9h   10.244.142.1     ce-demo-1   <none>           <none>
  10. csi-node-driver-8sjvc                      2/2     Running   0          2d9h   10.244.81.195    ce-demo-3   <none>           <none>
  11. csi-node-driver-skj6v                      2/2     Running   0          2d9h   10.244.228.130   ce-demo-2   <none>           <none>
复制代码

  • Calico 启动 calico-node 时,会根据主机的网络接口自动选择一个 IP 地址作为节点的 IPv4Address,默认是自动探测(autodetect)。查看三台节点对应的值,发现此 ip 不是对应节点的 ens160:
  1. root@ce-demo-1:~# kubectl get node -o yaml | grep 'IPv4Address'
  2.       projectcalico.org/IPv4Address: 10.51.0.100/24
  3.       projectcalico.org/IPv4Address: 10.4.0.1/24
  4.       projectcalico.org/IPv4Address: 10.51.0.102/24
复制代码

  • ce-demo-2 节点查看 10.1.0.1 对应 ip 网络设备的详细信息,可以看出这是一个网桥(bridge)设备,用于容器间通信/外部访问
  1. root@ce-demo-2:~# ip address show nerdctl0
  2. 686: nerdctl0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
  3.     link/ether b2:90:e4:5b:f4:d1 brd ff:ff:ff:ff:ff:ff
  4.     inet 10.4.0.1/24 brd 10.4.0.255 scope global nerdctl0
  5.        valid_lft forever preferred_lft forever
  6. root@ce-demo-2:~# ip -d link show nerdctl0
  7. 686: nerdctl0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
  8.     link/ether b2:90:e4:5b:f4:d1 brd ff:ff:ff:ff:ff:ff promiscuity 0  allmulti 0 minmtu 68 maxmtu 65535
  9.     bridge forward_delay 1500 hello_time 200 max_age 2000 ageing_time 30000 stp_state 0 priority 32768 vlan_filtering 0 vlan_protocol 802.1Q bridge_id 8000.b2:90:e4:5b:f4:d1 designated_root 8000.b2:90:e4:5b:f4:d1 root_port 0 root_path_cost 0 topology_change 0 topology_change_detected 0 hello_timer    0.00 tcn_timer    0.00 topology_change_timer    0.00 gc_timer  240.02 vlan_default_pvid 1 vlan_stats_enabled 0 vlan_stats_per_port 0 group_fwd_mask 0 group_address 01:80:c2:00:00:00 mcast_snooping 1 no_linklocal_learn 0 mcast_vlan_snooping 0 mcast_router 1 mcast_query_use_ifaddr 0 mcast_querier 0 mcast_hash_elasticity 16 mcast_hash_max 4096 mcast_last_member_count 2 mcast_startup_query_count 2 mcast_last_member_interval 100 mcast_membership_interval 26000 mcast_querier_interval 25500 mcast_query_interval 12500 mcast_query_response_interval 1000 mcast_startup_query_interval 3125 mcast_stats_enabled 0 mcast_igmp_version 2 mcast_mld_version 1 nf_call_iptables 0 nf_call_ip6tables 0 nf_call_arptables 0 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 tso_max_size 524280 tso_max_segs 65535 gro_max_size 65536
  10. root@ce-demo-2:~# brctl show nerdctl0
  11. bridge name   bridge id           STP enabled   interfaces
  12. nerdctl0      8000.b290e45bf4d1   no            veth76f5219b
复制代码

  • Calico 默认配置通过  first-found 模式(从所有接口中第一个有 IP 的接口选一个)
从 ce-demo-2 节点 calico-node log time 看出,首先看到的是 nerdctl0:
接口遍历顺序由宿主机内核/Netlink 返回的接口顺序决定,常见情况下与接口 ifindex(创建顺序/系统里登记的编号)相关;如果 nerdctl0 在系统里排序靠前(例如创建得更早,或者 ifindex 更靠前),first-found 就会先看到它。
  1. root@ce-demo-1:~# kubectl describe daemonset calico-node -n calico-system | grep "IP_AUTODETECTION_METHOD"
  2.       IP_AUTODETECTION_METHOD:            first-found
  3. root@ce-demo-1:~# kubectl logs -n calico-system calico-node-sbxrk -c calico-node | grep -i 'nerdctl0'
  4. 2025-07-15 07:51:58.079 [INFO][9] startup/autodetection_methods.go 103: Using autodetected IPv4 address on interface nerdctl0: 10.4.0.1/24
  5. 2025-07-15 07:52:02.351 [INFO][87] felix/int_dataplane.go 1431: Linux interface state changed. ifIndex=686 ifaceName="nerdctl0" state="up"
  6. 2025-07-15 07:52:02.351 [INFO][87] felix/int_dataplane.go 1475: Linux interface addrs changed. addrs=set.Set{10.4.0.1} ifaceName="nerdctl0"
  7. 2025-07-15 07:52:02.351 [INFO][87] felix/int_dataplane.go 2098: Received interface update msg=&intdataplane.ifaceStateUpdate{Name:"nerdctl0", State:"up", Index:686}
  8. 2025-07-15 07:52:02.351 [INFO][87] felix/int_dataplane.go 2125: Received interface addresses update msg=&intdataplane.ifaceAddrsUpdate{Name:"nerdctl0", Addrs:set.Typed[string]{"10.4.0.1":set.v{}}}
  9. 2025-07-15 07:52:02.351 [INFO][87] felix/hostip_mgr.go 84: Interface addrs changed. update=&intdataplane.ifaceAddrsUpdate{Name:"nerdctl0", Addrs:set.Typed[string]{"10.4.0.1":set.v{}}}
  10. 2025-07-15 07:52:02.413 [INFO][87] felix/vxlan_mgr.go 597: VXLAN device parent changed from "" to "nerdctl0" ipVersion=0x4
  11. root@ce-demo-1:~# kubectl logs -n calico-system calico-node-sbxrk -c calico-node | grep -i 'ens160'
  12. 2025-07-15 07:52:02.348 [INFO][87] felix/int_dataplane.go 1431: Linux interface state changed. ifIndex=2 ifaceName="ens160" state="up"
  13. 2025-07-15 07:52:02.348 [INFO][87] felix/int_dataplane.go 1475: Linux interface addrs changed. addrs=set.Set{10.51.0.101} ifaceName="ens160"
  14. 2025-07-15 07:52:02.349 [INFO][87] felix/int_dataplane.go 2098: Received interface update msg=&intdataplane.ifaceStateUpdate{Name:"ens160", State:"up", Index:2}
  15. 2025-07-15 07:52:02.349 [INFO][87] felix/int_dataplane.go 2125: Received interface addresses update msg=&intdataplane.ifaceAddrsUpdate{Name:"ens160", Addrs:set.Typed[string]{"10.51.0.101":set.v{}}}
  16. 2025-07-15 07:52:02.349 [INFO ][87] felix/hostip_mgr.go 84: Interface addrs changed. update=&intdataplane.ifaceAddrsUpdate{Name:"ens160", Addrs:set.Typed[string]{"10.51.0.101":set.v{}}}
  17. 2025-07-16 06:17:42.649 [INFO][87] felix/int_dataplane.go 1475: Linux interface addrs changed. addrs=set.Set{10.51.0.101,fe80::20c:29ff:febb:1bdc} ifaceName="ens160"
  18. 2025-07-16 06:17:42.649 [INFO][87] felix/int_dataplane.go 2125: Received interface addresses update msg=&intdataplane.ifaceAddrsUpdate{Name:"ens160", Addrs:set.Typed[string]{"10.51.0.101":set.v{}, "fe80::20c:29ff:febb:1bdc":set.v{}}}
  19. 2025-07-16 06:17:42.649 [INFO][87] felix/hostip_mgr.go 84: Interface addrs changed. update=&intdataplane.ifaceAddrsUpdate{Name:"ens160", Addrs:set.Typed[string]{"10.51.0.101":set.v{}, "fe80::20c:29ff:febb:1bdc":set.v{}}}
复制代码

  • 由于 Calico 官方文档中也有注明,first-found 模式为:使用第一个接口(不包括 Docker 网桥等本地接口)上的第一个有效 IP 地址,建议根据不同需求选择不同配置方式,本文采用的指定接口方式。
还需要额外解释下,first-found 文档中描述的 "the first valid IP address on the first interface (excluding local interfaces such as the docker bridge)." 只是举例,他的默认排除项中并不包括 nerdctl0,所以它会被当作一个合法候选接口。
  1. ## 注:需要看 Calico 部署方式,当前环境通过 Calico Tigera Operator 自定义资源部署,无法直接更改 DaemonSet
  2. root@ce-demo-1:~# kubectl edit daemonset calico-node -n calico-system
  3.         ## 找到或添加这个变量
  4.         - name: IP_AUTODETECTION_METHOD
  5.         ## 由于几台机器网卡名称都是 ens160,此处写网卡名或正则都可以
  6.           value: interface=ens.*
复制代码
需要更改 Calico 的自定义资源参数,官网链接搜索 nodeAddressAutodetectionV4 后有具体参数:
  1. root@ce-demo-1:~# kubectl get Installation
  2. NAME      AGE
  3. default   2d10h
  4. root@ce-demo-1:~# kubectl edit installation default
  5.     nodeAddressAutodetectionV4:
  6.       ## 默认使用此配置
  7.       ##firstFound: true
  8.       ## 删掉后添加指定接口:
  9.       interface: ens160
  10. ## 查看更新结果
  11. root@ce-demo-1:~# kubectl get pods -n calico-system -o wide | grep calico-node
  12. calico-node-4fndv                          1/1     Running   0          104s    10.51.0.101      ce-demo-2   <none>           <none>
  13. calico-node-8n5qr                          1/1     Running   0          39s     10.51.0.100      ce-demo-1   <none>           <none>
  14. calico-node-rxhsf                          1/1     Running   0          72s     10.51.0.102      ce-demo-3   <none>           <none>
  15. root@ce-demo-1:~# kubectl describe daemonset -n calico-system calico-node | grep "IP_AUTODETECTION_METHOD"
  16.       IP_AUTODETECTION_METHOD:            interface=ens160
复制代码

  • 验证更新后效果
  1. root@ce-demo-1:~# curl 10.244.228.139:8090/shop/full-test ; echo
  2. {"count":1,"elapsed":209,"elapsedAvg":209,"startAt":"2025-07-17 13:33:55.116","stopAt":"2025-07-17 13:33:55.325","success":1,"failed":0}
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册