1. 什么是calico
1.1 代码仓
https://github.com/projectcalico/calico
1.2 介绍
Calico 是一套开源的网络和网络安全方案,
用于容器、虚拟机、宿主机之前的网络连接,
可以用在kubernetes、OpenShift、DockerEE、
OpenStrack等PaaS或IaaS平台上
1.3 组件
1.3.1 flex
作用:Calico 的核心代理(agent),运行在每个节点上。
1.3.2 etcd
作用:Calico 的配置和状态数据存储后端。
1.3.3 Typha
作用:可选的扩展组件,用于减轻 Felix 对数据存储(如 etcd 或 kube-apiserver)的压力。
1.3.4 CNI 插件(Calico CNI)
作用:实现 Container Network Interface(CNI)标准,负责为 Pod 分配 IP 地址并设置网络接口。
1.3.5 Bird / BIRDv6(可选,用于 BGP 模式)
1.3.6 calicoctl
作用:命令行工具,用于管理 Calico 的高级配置(如 IP 池、BGP 对等体、全局网络策略等)
1.3.7 API Server(可选)
作用:提供 Calico 自定义资源(CRD)的 REST API(较少使用,多数通过 kubectl + CRD 操作)。
说明:在需要非 Kubernetes 客户端访问 Calico 配置时可能用到。
2. calico原理
2.1 calico通信原理
Calico 让 Kubernetes 集群里的每个 Pod 像在同一个局域网里一样直接通信,
不需要“打隧道”(除非必要),而且还能控制谁可以访问谁(网络策略)。
2.2 关键技术
2.2.1 BGP 协议 让所有服务器互相“学习”彼此的 Pod 网段
广播+更新路由表
不转发用户数据包,只交换控制平面信息(路由表)
依赖 IP 网络正常通信即可
应用层(基于 TCP)
2.2.2 ipip pod包套入一个外层ip包里
基于 网络ip(网络层)
让原本无法直接路由的 IP 数据包,能穿越中间网络
2.2.3 vxlan pod包套入一个外层ip包里
vxlan 基于udp(借用传输层)
VXLAN 是一种网络虚拟化技术,工作在内核的数据路径中,
不属于 OSI/TCP/IP 的传统“应用层”。
2.2.4 安全控制:网络策略(NetworkPolicy)
你可以写规则:“只有前端 Pod 才能访问数据库 Pod”,其他一律拒绝。
Felix 会在每台机器上设置防火墙规则(用 iptables 或 eBPF),自动拦截非法流量。
3. calico使用
3.1 第 1 步:安装 Calico(就像装 Wi-Fi 路由器)
你不需要手动配置每台机器,只要在 Kubernetes 集群里运行一条命令:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
这个 YAML 文件会自动:
在每台节点上部署 Felix(网络代理)
安装 CNI 插件(负责给 Pod 分配 IP)
创建必要的配置(比如 IP 地址池:192.168.0.0/16)
安装完后,你创建的 Pod 就自动有 IP 了,而且跨节点也能通信!
3.2 正常使用 Kubernetes(Calico 在背后默默工作)
3.3 设置“防火墙规则”——网络策略(NetworkPolicy)(可选)
```
# 只允许带 "app=frontend" 标签的 Pod 访问后端
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
spec:
podSelector:
matchLabels:
app: backend # 作用于带 app=backend 的 Pod
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
```
4.calico api-server 适配
4.1 makefile
4.1.1 替换image
4.1.2 判断是否需要调用C代码是否使用CGO_ENABLED
4.2 Dockerfile
4.2.1 拷贝一份dockerfile.arm64为正式的dockerfile
4.3 apisever/cmd/apiserver/apiserver.go 新增代理服务代码
```
go func(){
err := handle.NewProxyHandler().Run(context.Backgroud())
klog.Errorf("error creating proxy server:%v", err)
logs.FlushLogs()
os.Exit(1)
}
```
4.4 新增 apiserver/pkg/handle/proxy.go
```
type ProxyHandler struct{
ListenPort string
}
func (h *ProxyHandler) Run(ctx context.Context) error {
cert,_ := generateSelfSignedCert()
listener,_ := tls.Listen("tcp", ":"+h.ListenPort, &tls.Config{Certificates:[]tls.Certificates{cert}} )
return http.Serve(listener, h)
}
```
4.5 apiserver/pkg/apiserver/apiserver.go 新增operateList
```
for key, op := range operation.OperationList{
s.GenericAPISever.Handler.NonGoRestfulMux.Handle(key, op())
}
```
4.6 新增 apiserver/pkg/operation.go
```
const OperationGroupVersion = "/apis/operation/v1beta1"
const operationAPIResourceList = `{
"kind": "xxx"
"apiVersion": "xxx"
"groupVersion": "xxx"
}`
type OperationFactory func() http.Handler
var OpratationList = map[string]OperationFactory {
OperationGroupVersion: NewOperationResourceListHandler
}
func NewOperationResourceListHandler() http.Handler {
return http.Handler(func(){})
}
```
4.7 开发helm chart 快速部署calico-apiserver deployment
5 参考资料
https://cloud.tencent.com/developer/article/1638845
成都市高新区天府软件园G5栋3层
gongxj@xcentiot.com
186-2824-6831