🐱Calico架构和使用
约 1033 字大约 3 分钟
2025-08-03
在 Calico(或基于 BGP 的网络架构)中,路由宣告的触发条件与网络拓扑变化、策略调整或系统事件密切相关。以下是详细场景分析及触发机制:
1. Calico架构图
| 组件 | 子模块/文件 | 核心功能 | 配置参数示例 | 交互组件 | 典型工作场景 |
|---|---|---|---|---|---|
| Felix | felix.cfg | - 管理节点本地路由表 (route table) - 配置iptables/eBPF规则链 ( cali-INPUT, cali-FORWARD等) - 实施网络策略(标记流量 allow/deny) | RouteRefreshInterval=10s MetadataAddr=127.0.0.1 IptablesMarkMask=0xff000000 | BIRD, etcd/K8s API, Typha | Pod创建时自动添加路由规则;策略更新时实时生效 |
| BIRD | bird.cfg (由confd生成) | - 通过BGP协议广播本节点Pod CIDR(如10.0.1.0/24)- 学习其他节点的路由( via Node2) | protocol bgp { local as 64512; neighbor 192.168.1.2 as 64512; } | Felix, Route Reflector | 新节点加入时自动建立BGP对等连接 |
| Calico CNI Plugin | 10-calico.conflist | - 调用IPAM插件分配Pod IP - 创建veth pair ( caliXXXXX)- 设置Pod网络命名空间路由 | "ipam": { "type": "calico-ipam", "subnet": "usePodCidr" } | kubelet, IPAM, Felix | kubectl run时被kubelet调用,完成Pod网络配置 |
| calico-kube-controllers | policy-controller | - 监听K8s NetworkPolicy并同步到Felix- 清理孤儿IP地址( IPGC)- 维护节点心跳 | controllers: node, policy, serviceaccount | K8s API Server, etcd | 用户创建NetworkPolicy时,转换为Calico格式并下发 |
| Typha | typha-deployment.yaml | - 代理Felix的API请求(缓存Nodes, Policies)- 减少API Server负载(连接数从O(N)→O(1)) | maxConnsPerClient=4 clientPort=5473 | Felix, K8s API | 集群超过50节点时,Felix通过Typha获取策略而非直连API |
| Route Reflector | bgpconfiguration.yaml | - 集中式路由分发(替代全互联) - 支持集群AS号( AS 64512)和路由聚合 | routeReflectorClusterID: 1.0.0.1 logSeverityScreen: Info | BIRD (所有节点) | 跨可用区部署时,通过RR避免节点间直接BGP连接 |
| etcd/K8s API | calico-config ConfigMap | - 存储IPPools(10.0.0.0/16)- 保存 BGPPeers和NetworkPolicy定义 | etcd_endpoints: "https://etcd:2379" useKubernetesAPI: true | 所有组件 | 管理员通过calicoctl创建IP池时写入etcd |
| confd | /etc/calico/confd | - 监听etcd/K8s API变更(如BGPPeer更新)- 动态生成BIRD配置并触发重载 | confd -watch -interval 10 | BIRD, etcd | BGP对等节点IP变更时,自动更新bird.cfg并执行birdc configure |
| eBPF Dataplane | bpfnat, bpfilter | - 替换kube-proxy实现Service负载均衡 - 通过eBPF map加速策略匹配( calico_prefilter) | bpfEnabled: true bpfExternalServiceMode: DSR | Linux内核, Felix | 高性能场景下,Service的DNAT规则由eBPF程序处理 |
| WireGuard | wg-cali (接口) | - 加密节点间流量(udp port 51820)- 支持PSK或证书认证 | wireguardEnabled: true wireguardListeningPort: 51820 | 节点网络栈 | 跨公有云部署时,自动建立加密隧道 |
2. Calico使用
1.setup kind集群
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
networking:
disableDefaultCNI: true
podSubnet: 192.168.0.0/16kind create cluster --name=calico-cluster --config=config.yaml2. 安装calico
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.30.2/manifests/tigera-operator.yamlkubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.30.2/manifests/custom-resources.yaml3. 查看web页面
kubectl port-forward -n calico-system service/whisker 8081:80814. 安装nginx测试
kubectl create namespace quickstartkubectl create deployment --namespace=quickstart nginx --image=nginxkubectl expose --namespace=quickstart deployment nginx --port=80安装并暴露服务成功之后,创建busybox容器并对nginx pod进行访问
kubectl run --namespace=quickstart access --rm -ti --image busybox /bin/sh此时,通过pod网络访问集群内nginx和访问外网都能成功
wget -qO- http://nginx
wget -qO- https://docs.tigera.io/pod-connection-test.txt5. 通过calico对网络加一些限制
对进ingress和egress都进行限制
kubectl create -f - <<EOF
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: default-deny
spec:
selector: projectcalico.org/namespace not in {'kube-system', 'calico-system', 'calico-apiserver'}
types:
- Ingress
- Egress
EOF在进行网络限制之后,访问nginx和外网都会失败。
wget -qO- http://nginx
wget -qO- https://docs.tigera.io/pod-connection-test.txt5. 把网络放开一点
把egress放开
kubectl create -f - <<EOF
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-busybox-egress
namespace: quickstart
spec:
selector: run == 'access'
types:
- Egress
egress:
- action: Allow
EOF此时访问外网可以成功,但是访问nginx依旧失败。
wget -qO- https://docs.tigera.io/pod-connection-test.txt
wget -qO- http://nginx把nginx的ingress打开
kubectl create -f - <<EOF
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-nginx-ingress
namespace: quickstart
spec:
selector: app == 'nginx'
types:
- Ingress
ingress:
- action: Allow
source:
selector: run == 'access'
EOF此时访问nginx即可成功
wget -qO- http://nginx6. 清理
kind delete cluster --name calico-cluster更新日志
2025/8/13 15:11
查看所有更新日志
b14e6-add calico于
