一、当Kubernetes网络突然罢工时

想象一下这个场景:你正喝着咖啡,突然收到告警说集群里的服务全都失联了。Pod之间无法通信,跨节点流量像被黑洞吞噬了一样。这时候你意识到——网络插件出问题了。

在Kubernetes中,Calico和Flannel就像城市的交通信号灯系统。Calico采用BGP协议实现路由分发,适合需要精细网络策略的场景;而Flannel使用简单的overlay网络,像给所有道路铺了一层统一的地毯。两者都可能因为配置错误、资源冲突或版本兼容性问题突然"罢工"。

二、Calico经典故障现场还原

假设我们使用Calico v3.20作为网络插件,突然发现所有Pod都处于NotReady状态。首先检查Calico的核心组件:

# 检查calico-node守护进程状态(技术栈:Kubernetes+Calico)
kubectl get pods -n kube-system -l k8s-app=calico-node
# 正常应该看到每个节点都有一个Running状态的pod

如果发现大量CrashLoopBackOff,接着查看日志:

kubectl logs -n kube-system <calico-pod-name> -c calico-node

常见错误1:bird: BGP peer x.x.x.x not established
这表示节点间的BGP对等体通信失败。检查物理网络是否放行了TCP 179端口,或者尝试重置BGP配置:

# calico-configmap.yaml示例修复配置
apiVersion: v1
kind: ConfigMap
metadata:
  name: calico-config
  namespace: kube-system
data:
  typha_service_name: "none"  # 小型集群可以禁用Typha
  veth_mtu: "1440"            # 解决某些云环境的MTU问题

三、Flannel网络异常诊断手册

当使用Flannel作为网络插件(这里以Flannel v0.15为例),典型症状是新建Pod无法获取IP地址。首先检查核心服务:

# 检查flannel守护进程(技术栈:Kubernetes+Flannel)
kubectl get pods -n kube-system -l app=flannel

如果发现flanneld不断重启,可能是后端存储配置问题。查看日志会有明显提示:

kubectl logs -n kube-system <flannel-pod-name> | grep "Failed to create"

常见错误1:Failed to create SubnetManager
这通常意味着etcd连接异常。检查Flannel使用的etcd配置:

# kube-flannel.yml关键片段
containers:
- name: kube-flannel
  args:
  - --ip-masq
  - --kube-subnet-mgr
  - --iface=eth0       # 显式指定网卡避免选择错误
env:
- name: POD_IP
  valueFrom:
    fieldRef:
      fieldPath: status.podIP

四、网络恢复的黄金四步法

无论使用Calico还是Flannel,系统化恢复应该遵循以下步骤:

  1. 基础设施检查
    确认节点基础网络连通性:

    # 跨节点连通性测试
    kubectl get nodes -o wide
    ping <node-internal-ip>
    
  2. 组件健康诊断
    使用专用诊断工具:

    # Calico专用诊断
    calicoctl node status
    # Flannel网络检查
    ip route show | grep flannel
    
  3. 配置版本回溯
    如果最近升级过插件,尝试回退到上个稳定版本:

    # Calico版本回退示例
    kubectl apply -f https://docs.projectcalico.org/archive/v3.19/manifests/calico.yaml
    
  4. 资源清理重建
    终极解决方案(谨慎操作):

    # 清理Flannel残留网络设备
    ip link delete flannel.1
    systemctl restart docker kubelet
    

五、预防胜于治疗的运维哲学

根据生产环境经验,这些预防措施能减少90%的网络故障:

  • 版本兼容矩阵
    Calico v3.x需要匹配Kubernetes 1.19+,Flannel v0.15+需要etcd v3.4+

  • 资源预留配置
    在values.yaml中为网络组件预留资源:

    # calico-operator资源限制示例
    resources:
      limits:
        cpu: "2"
        memory: 1Gi
      requests:
        cpu: "500m" 
        memory: 256Mi
    
  • 定期验证方案
    创建自动化测试Pod验证跨节点通信:

    kubectl run net-test --image=alpine --restart=Never -- sleep 3600
    kubectl exec net-test -- ping <其他节点PodIP>
    

六、技术选型的思考维度

当在Calico和Flannel之间抉择时,考虑这些关键差异点:

维度 Calico Flannel
网络性能 原生三层路由,延迟低 Overlay有10%性能损耗
策略支持 支持NetworkPolicy 需额外组件
部署复杂度 需要配置BGP 一键部署
适用规模 500+节点集群 中小规模集群

对于需要细粒度安全控制的金融系统,Calico是更好的选择;而快速迭代的互联网业务可能更适合Flannel的简单可靠。

七、那些年我们踩过的坑

  1. 云厂商的特殊限制
    阿里云等厂商的VPC路由表有200条上限,Calico需要调整ippoolblockSize

    apiVersion: projectcalico.org/v3
    kind: IPPool
    metadata:
      name: default-ipv4-ippool
    spec:
      blockSize: 26  # 默认26(64个IP)可减少路由条目
    
  2. Windows节点兼容问题
    Flannel在Windows节点需要特殊配置:

    # flannel-daemonset-windows.yaml片段
    args:
    - --kube-subnet-mgr
    - --iface=以太网  # Windows网卡名称需本地化
    
  3. 内核版本依赖
    Calico的eBPF模式要求Linux内核5.3+,在CentOS 7上需要手动升级内核。

八、终极救火队员工具箱

把这些命令保存到你的应急脚本库:

#!/bin/bash
# Kubernetes网络诊断大全(技术栈:Linux+Kubectl)
function netcheck() {
    echo "=== 节点基础网络 ==="
    ip a | grep -E 'eth0|flannel|cali'
    echo "=== 路由表检查 ==="
    ip route show | grep -E 'flannel|calico'
    echo "=== 端口监听检查 ==="
    netstat -tulnp | grep -E '179|8472'  # Calico BGP端口/Flannel VXLAN端口
}

把这些知识装进你的工具箱,下次遇到网络故障时,你就能像老练的消防员一样快速定位问题源头。记住,好的网络运维不是在问题发生时力挽狂澜,而是通过合理的设计让问题根本无处藏身。