多网络policy-tc
使用Linux流量控制(TC)实现多网络政策
描述
Kubernetes为网络安全提供了网络策略。 MultiNetworkPolicy定义了一个类似于Kubernetes内置NetworkPolicy API的API,用于通过NetworkAttachmentDefinition CRD定义的二级kubernetes网络。 Multi-networkpolicy-tc使用Linux TC实现MultiNetworkPolicy API,为net-attach-def网络提供网络安全。
支持的CNI
multi-networkpolicy-tc 的目的是用于通过加速桥接器 cni 提供的网络。它目前与其他 CNI 不兼容,但可能会扩展对其他 CNI 的支持。
multi-networkpolicy-tc依赖于这样一个事实:一个Pod有一个SRIOV VF分配给网络,并有一个相应的VF代表netdev,它遵循内核switchdev模型。
给定一个MultiNetworkPolicy,它生成并编程TC规则以执行该策略。更多信息请参考docs/tc-rule-pipeline.md
。
前提条件
- Linux内核5.17.9或更新版本
- 支持switchdev和TC硬件卸载的网卡,如。
- Nvidia Mellanox ConnectX-6Dx
快速启动
构建
本项目使用Go模块进行依赖性管理,需要Go 1.18来构建。
来构建二进制运行:
$ make build
二进制可执行文件位于build
文件夹下。
安装
安装MultiNetworkPolicy CRD到Kubernetes:
$ git clone https://github.com/Mellanox/multi-networkpolicy-tc
$ cd multi-networkpolicy-tc
$ kubectl create -f deploy/multi-net-crd.yaml
customresourcedefinition.apiextensions.k8s.io/multi-networkpolicies.k8s.cni.cncf.io created
将multi-networkpolicy-tc部署到Kubernetes:
$ git clone https://github.com/Mellanox/multi-networkpolicy-tc
$ cd multi-networkpolicy-tc
$ kubectl create -f deploy/deploy.yml
clusterrole.rbac.authorization.k8s.io/multi-networkpolicy created
clusterrolebinding.rbac.authorization.k8s.io/multi-networkpolicy created
serviceaccount/multi-networkpolicy created
daemonset.apps/multi-networkpolicy-ds-amd64 created
multi-network-policy-tc DaemonSet
multi-network-policy-tc作为daemonet在每个节点上运行。multi-networkpolicy-tc
,观察MultiNetworkPolicy对象,并在VF代表上创建TC规则,根据MultiNetworkPolicy过滤进出接口的数据包。
限制条件
由于该项目正在积极开发中,有一些限制,计划在不久的将来解决:
- 不支持MultiNetworkPolicy输入规则。进站策略将不会被强制执行
- 不支持VLAN标签流量,不支持网络策略。
- 不支持QinQ流量,不执行网络策略
- 不支持IPV6流量,不执行网络策略