将 Calico 替换为 Antrea CNI
目录
将 Calico 替换为 Antrea CNI
概述
Calico 环境准备
业务部署
测试 1
测试 2
测试 3
测试 4
测试 5
卸载 calico
删除后服务访问情况
测试 1
测试 2
测试 3
测试 4
测试 5
卸载 Calico 残留组件
安装 Antrea
重启节点上的 Pod
切换 CNI 后测试
测试 1
测试 2
测试 3
测试 4
测试 5
使用 acnp 替换 NetworkPolicy
概述
在 k8s 中,可能因为前期规划的一些原因使用了开源的 Calico,但使用中发现 Calico 的产品缺陷或者功能,需要更换为其他 CNI,比如 Antrea,本文便讲解下从 Calico 到 Antrea 的整个迁移过程。
Calico 环境准备
本文使用 Calico v3.26.1 版本,安装 yaml 链接如下:
https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml

安装完毕后节点状态及 Calico Pod 状态均正常:

业务部署
在环境中我们进行下列几种业务及服务的测试:
Deploy1:3 个 Pod,通过 Nodeport 发布到集群外;
Statefulset1:3 个 Pod,通过 Service Type ClusterIP 发布;
Deploy2:使用自定义 Calico IP Pool 创建命名空间,通过 Nodeport 发布到集群外;
安装 Nginx Ingress Controller:通过 Nodeport 发布到集群外,创建 Ingress 服务,关联 Deploy1;
设置 NetworkPolicy,限制某个 IP 到 Deploy1 的访问
测试 1
发布后通过 NodePort 可以正常访问:

测试 2
测试 3
创建自定义 IPpool,然后关联给 namespace,在该 namespace 下创建 Pod:
测试 4
安装 Nginx Controller:
创建 Ingress:
通过 NodePort 访问正常:

查看 Nginx 上的访问的日志:
测试 5
未创建 NetworkPolicy 之前,Master 节点可以正常访问应用(通过 ClusterIP 访问,NetworkPolicy 无法对 NodePort 来的访问做控制,其源 IP 会被转化为 NodeIP)
创建下列 NetworkPolicy,仅允许 10.0.0.0/8 访问该服务的 80 端口,禁止 Master 10.10.50.65 访问该应用:
之后外部无法访问:
卸载 calico
删除后服务访问情况
测试 1
Pod 看着运行正常,实则部分无法访问
NodePort 部分无法访问
在 Pod 所在节点访问其他 Pod,会发现通信正常:
如果 Pod 访问同 Worker 上的其他 Pod,部分访问正常:
跨节点访问不正常,提示没有路由,通过路由表查看到丢失到其他 Node 的路由:
Worker 访问 ClusterIP SVC,部分访问正常(这些正常的请求来自本地的 Pod 回应,也就是说在卸载 calico 后,IPtables 并没有立即删除,依然在工作):
抓到的 IPtables 规则:
Nodeport 部分无法访问(部分来自外部的访问不正常,比如当请求发给本地没有 Pod 的节点时,或者 Worker 横向把流量交给了其他节点上的 Pod,但这时通信有问题导致这部分访问异常):
测试 2
Worker 访问 ClusterIP SVC,部分访问正常,结果和测试 1 中的一致:
Endpoint 的结果和卸载前一致:
测试 3
通过自定义 IPPool 创建的 Pod 运行正常,
Worker 访问 ClusterIP SVC,部分访问正常,结果和测试 1 中的一致:
Nodeport 部分来自外部的访问不正常,比如当请求发给本地没有 Pod 的节点时,或者 Worker 横向把流量交给了其他节点上的 Pod,但这时通信有问题导致这部分访问异常,结果和测试 1 一致。
测试 4
外部到 Nginx 所在节点时请求才可能正常(Nginx Controller 并不是在所有节点部署的,所以只有访问到 Nginx 所在 Worker 时才能通信)
部分访问异常(Nginx Controller 不会检测后端 Pod 通信情况,可能把流量转发到其他节点的 Pod 上)
测试 5
Network Policy 依然会存在,但因为网络已经无法访问,所以实际上 Network Policy 不会起到任何作用。
卸载 Calico 残留组件
安装 Antrea
应用 antrea.yaml
安装完成后确保 Antrea 相关的 Pod 为 Running:
Antrea 会在 IPtables 中加入下列项:
重启节点上的 Pod
可以通过 drain 一一驱逐节点上的 Pod:
之后 Worker 1 上的 Pod 会在其他节点重建:
之后再 uncordon该节点:
drain 另一个节点:
所有 Pod 在 worker1 上重建,以前通过 Calico IPPool 创建的 Pod 在 Antrea 下会被用默认的 CIDR 创建:
切换 CNI 后测试
测试 1
所有 Pod 及服务运行正常:
外部通过 NodePort 访问应用均正常:
进入 Worker 节点的 Antrea-Agent 容器中,查看流表:
测试 2
访问 Statefulset 均正常:
测试 3
Pod 均运行正常:
测试 4
Ingress Controller 运行正常:
在 Nginx 日志中可以看到外部的访问记录,使用 RR 的形式发送给 Pod:
测试 5
Network Policy 运行正常,10.0.0.0/8 网络仅能访问 Pod 的 TCP 80,ping 之类的操作会被拒绝:
调整此 Network Policy,禁止 10.39.0.1 (Master 节点)访问该服务,再次测试,所有访问都被拒绝:
使用 acnp 替换 NetworkPolicy
因为 Kubernetes 默认的 NetworkPolicy 功能非常弱,所以使用 Antrea 的 ACNP 来进行替换:
应用上述文件后再次进行访问,观察到 web 访问正常,ping 被拒绝:
登陆 Pod 所在节点查看 ACNP 的日志:
这有帮助吗?