HiHuo
首页
博客
手册
工具
关于
首页
博客
手册
工具
关于
  • 网络架构师学习手册

    • 网络架构师学习教程
    • 基础篇

      • 第1章 网络模型与数据流转
      • 第2章 以太网与二层通信
      • 第3章 IP路由与三层转发
      • 第4章 TCP与可靠传输
      • 第5章 应用层协议
    • Linux网络栈

      • 第6章 数据包接收路径
      • 第7章 多核网络优化
      • 第8章 Netfilter与防火墙
      • 第9章 流量控制与QoS
    • 虚拟网络

      • 第10章 Network Namespace基础
      • 第11章 Bridge与互联
      • 第12章 VXLAN与Overlay网络
      • 第13章 OVS与SDN
    • Kubernetes网络

      • 第14章 CNI模型与实现
      • 第15章 kube-proxy与Service实现
      • 第16章 CoreDNS与服务发现
      • 第17章 NetworkPolicy与安全隔离
      • 第18章 Calico网络深度解析
      • 第19章 Cilium与eBPF网络
    • 网络架构

      • 第20章 网络设备与拓扑设计
      • 第21章 网络容量规划与计算
      • 第22章 负载均衡架构设计
      • 第23章 高可用网络架构
      • 第24章 网络安全架构
    • 性能调优

      • 第25章 系统级网络调优
      • 第26章 故障排查方法论
      • 第27章 生产环境案例分析
    • 前沿技术

      • 第28章 eBPF深度实践
      • 第29章 ServiceMesh与边车代理
      • 第30章 网络技术趋势与未来展望
    • 附录

      • 附录A:命令速查手册
      • 附录B:排错决策树
      • 附录C:学习资源
      • 附录D:技能图谱

第18章 Calico网络深度解析

学习目标

  • 深入理解Calico的网络架构和核心组件
  • 掌握Calico的BGP路由和IPAM机制
  • 了解Calico的eBPF加速和性能优化
  • 能够排查Calico网络故障和性能问题

前置知识

  • 第17章:NetworkPolicy
  • 第12章:VXLAN与Overlay
  • 第3章:IP与路由

18.1 Calico架构概述

18.1.1 Calico核心组件

1. Felix

  • 运行在每个节点上的守护进程
  • 管理网络接口和路由规则
  • 实现NetworkPolicy和IPAM

2. BIRD

  • BGP路由守护进程
  • 负责节点间路由信息交换
  • 支持BGP协议栈

3. Typha

  • 数据存储代理
  • 减少etcd/API Server负载
  • 提供高可用性

4. CNI插件

  • 容器网络接口实现
  • 负责Pod网络配置
  • 与kubelet集成

18.1.2 Calico数据平面

┌─────────────────────────────────────────────────────────────┐
│                    Calico Data Plane                       │
├─────────────────────────────────────────────────────────────┤
│  Pod Network (10.244.x.x/32)                              │
├─────────────────────────────────────────────────────────────┤
│  veth pair (cali<id>)                                     │
├─────────────────────────────────────────────────────────────┤
│  Linux Kernel (iptables, routing)                         │
├─────────────────────────────────────────────────────────────┤
│  Physical Network (BGP/Overlay)                           │
└─────────────────────────────────────────────────────────────┘

18.2 Calico安装与配置

18.2.1 使用Calico Operator安装

安装Calico Operator:

# 下载Calico manifest
curl https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/tigera-operator.yaml -O
kubectl apply -f tigera-operator.yaml

# 安装Calico
curl https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/custom-resources.yaml -O
kubectl apply -f custom-resources.yaml

验证安装:

# 检查Calico Pod状态
kubectl get pods -n calico-system

# 检查Calico节点状态
kubectl get nodes -o wide

18.2.2 使用calicoctl配置

安装calicoctl:

# 下载calicoctl
curl -L https://github.com/projectcalico/calico/releases/download/v3.24.1/calicoctl-linux-amd64 -o calicoctl
chmod +x calicoctl
sudo mv calicoctl /usr/local/bin/

# 配置calicoctl
export CALICO_DATASTORE_TYPE=kubernetes
export CALICO_KUBECONFIG=~/.kube/config

基本操作:

# 查看节点状态
calicoctl get nodes

# 查看IP池
calicoctl get ippool

# 查看网络策略
calicoctl get networkpolicy

18.3 BGP路由机制

18.3.1 BGP配置

查看BGP配置:

# 查看BGP对等体
calicoctl get bgppeer

# 查看BGP配置
calicoctl get bgpconfig

# 查看节点BGP状态
calicoctl node status

配置BGP对等体:

# bgp-peer.yaml
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: external-router
spec:
  peerIP: 192.168.1.1
  asNumber: 64512

18.3.2 路由表分析

查看路由表:

# 查看节点路由表
ip route show

# 查看BGP路由
ip route show proto bgp

# 查看特定Pod路由
ip route get 10.244.1.2

路由规则示例:

# Pod路由规则
10.244.1.2 via 192.168.1.10 dev eth0 proto bird

# 节点路由规则
10.244.0.0/16 via 192.168.1.10 dev eth0 proto bird

18.4 IPAM机制

18.4.1 IP池管理

查看IP池:

# 查看所有IP池
calicoctl get ippool

# 查看IP池详情
calicoctl get ippool default-ipv4-ippool -o yaml

创建IP池:

# custom-ippool.yaml
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: custom-ippool
spec:
  blockSize: 26
  cidr: 10.244.0.0/16
  ipipMode: Never
  natOutgoing: true
  nodeSelector: all()

18.4.2 IP分配机制

查看IP分配:

# 查看节点IP分配
calicoctl get ipam block

# 查看Pod IP分配
kubectl get pods -o wide

# 查看IP分配统计
calicoctl ipam show

18.5 eBPF加速

18.5.1 启用eBPF模式

配置eBPF:

# calico-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: calico-config
  namespace: kube-system
data:
  # 启用eBPF
  cni_network_config: |
    {
      "name": "k8s-pod-network",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "calico",
          "log_level": "info",
          "log_file_path": "/var/log/calico/cni/cni.log",
          "datastore_type": "kubernetes",
          "nodename": "__KUBERNETES_NODE_NAME__",
          "mtu": __CNI_MTU__,
          "ipam": {
            "type": "calico-ipam",
            "assign_ipv4": "true",
            "assign_ipv6": "false"
          },
          "policy": {
            "type": "k8s"
          },
          "kubernetes": {
            "kubeconfig": "__KUBECONFIG_FILEPATH__"
          },
          "bpffs": "/sys/fs/bpf"
        }
      ]
    }

18.5.2 eBPF性能优势

性能对比:

  • 数据包处理:eBPF比iptables快3-5倍
  • 内存使用:eBPF内存效率更高
  • CPU使用:eBPF CPU开销更低
  • 延迟:eBPF延迟更低

启用eBPF:

# 启用eBPF模式
calicoctl patch felixconfiguration default --patch='{"spec":{"bpfEnabled":true}}'

# 重启Calico节点
kubectl rollout restart daemonset/calico-node -n calico-system

18.6 实验:Calico网络分析

18.6.1 实验环境准备

创建测试应用:

# test-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: test-app
  template:
    metadata:
      labels:
        app: test-app
    spec:
      containers:
      - name: nginx
        image: nginx:1.20
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: test-app-service
spec:
  selector:
    app: test-app
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP

18.6.2 实验1:网络连通性分析

步骤1:部署应用

# 部署应用
kubectl apply -f test-app.yaml

# 查看Pod IP
kubectl get pods -o wide

步骤2:分析网络配置

# 查看Pod网络接口
kubectl exec -it test-app-pod -- ip addr show

# 查看veth接口
ip link show | grep cali

# 查看路由表
ip route show

步骤3:测试连通性

# 测试Pod间通信
kubectl exec -it test-app-pod-1 -- ping test-app-pod-2-ip

# 测试Service访问
kubectl exec -it test-app-pod-1 -- wget -qO- http://test-app-service

18.6.3 实验2:BGP路由分析

步骤1:查看BGP状态

# 查看BGP对等体
calicoctl node status

# 查看BGP路由
ip route show proto bird

步骤2:分析路由传播

# 查看特定Pod路由
ip route get pod-ip

# 查看BGP路由表
calicoctl get bgppeer

18.6.4 实验3:NetworkPolicy测试

步骤1:创建NetworkPolicy

# test-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-policy
spec:
  podSelector:
    matchLabels:
      app: test-app
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: test-app
    ports:
    - protocol: TCP
      port: 80

步骤2:测试策略效果

# 应用策略
kubectl apply -f test-policy.yaml

# 测试内部通信
kubectl exec -it test-app-pod-1 -- wget -qO- http://test-app-pod-2-ip

# 查看iptables规则
iptables -t filter -L | grep cali

18.7 性能优化

18.7.1 网络性能调优

调整MTU:

# calico-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: calico-config
  namespace: kube-system
data:
  veth_mtu: "1500"
  cni_network_config: |
    {
      "mtu": 1500
    }

调整BGP参数:

# bgp-config.yaml
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
  name: default
spec:
  logSeverityScreen: Info
  nodeToNodeMeshEnabled: true
  asNumber: 64512

18.7.2 资源限制

设置资源限制:

# calico-node-resources.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: calico-node
  namespace: calico-system
spec:
  template:
    spec:
      containers:
      - name: calico-node
        resources:
          limits:
            memory: 1Gi
            cpu: 1000m
          requests:
            memory: 256Mi
            cpu: 100m

18.8 故障排查

18.8.1 常见问题诊断

问题1:Pod网络不通

# 检查Calico节点状态
kubectl get pods -n calico-system

# 检查Felix日志
kubectl logs -n calico-system -l k8s-app=calico-node

# 检查网络接口
ip link show | grep cali

问题2:BGP路由问题

# 检查BGP状态
calicoctl node status

# 检查BGP对等体
calicoctl get bgppeer

# 检查路由表
ip route show proto bird

问题3:IP分配问题

# 检查IP池
calicoctl get ippool

# 检查IP分配
calicoctl ipam show

# 检查IPAM日志
kubectl logs -n calico-system -l k8s-app=calico-node | grep ipam

18.8.2 调试工具

# 使用calicoctl调试
calicoctl node diags

# 使用tcpdump抓包
kubectl exec -it pod-name -- tcpdump -i eth0

# 使用netshoot调试
kubectl run netshoot --image=nicolaka/netshoot -it --rm

18.9 排错清单

18.9.1 Calico组件检查

  • [ ] Calico节点是否正常运行
  • [ ] Felix进程是否正常
  • [ ] BIRD进程是否正常
  • [ ] Typha是否正常(如果使用)
  • [ ] CNI插件是否正常

18.9.2 网络连通性检查

  • [ ] Pod网络接口是否正确创建
  • [ ] veth pair是否正确配置
  • [ ] 路由表是否正确
  • [ ] BGP路由是否正确传播
  • [ ] IP地址是否正确分配

18.9.3 性能问题检查

  • [ ] CPU使用率是否过高
  • [ ] 内存使用是否正常
  • [ ] 网络延迟是否正常
  • [ ] 吞吐量是否满足要求
  • [ ] eBPF是否正常工作

18.10 延伸阅读

  • Calico Documentation
  • Calico eBPF
  • Calico BGP
  • Calico Troubleshooting

下一章:第19章 Cilium与eBPF网络

返回目录:README

Prev
第17章 NetworkPolicy与安全隔离
Next
第19章 Cilium与eBPF网络