大象盒子
从这里,品行业,感世界

calico

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



大象盒子 TM

成都市高新区天府软件园G5栋3层
gongxj@xcentiot.com
186-2824-6831