第18章 Calico网络深度解析
学习目标
- 深入理解Calico的网络架构和核心组件
- 掌握Calico的BGP路由和IPAM机制
- 了解Calico的eBPF加速和性能优化
- 能够排查Calico网络故障和性能问题
前置知识
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 延伸阅读
返回目录:README