基于Linux流量控制(TC)的Kubernetes NPWG MultiNetworkPolicy API的实现

202 阅读1分钟

多网络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流量,不执行网络策略