智汇华云—华云SDN CNI的网络隔离方法

时间:2022-11-11 13:51 来源:IT专家网


背景

在单个Kubernetes集群中,所有pod共用同一个网段且可以与其他pod通信,在网络隔离和多租户方面存在不足。Kubernetes提供了基于Network Policy的原生网络隔离规则,但是没有具体的实现,并且这种原生的隔离存在局限性,租户不能对网络进行单独设置而是采用Kubernetes集群统一的配置,导致所有租户共用一个网段、DNS、路由等。因此我们提供了一种能实现租户间彻底的网络隔离以及各租户能够独立进行网络规划和配置的华云SDN CNI的网络隔离方法。

华云SDN CNI简介

本文的网络隔离方法是基于华云SDN CNI的一种实现。华云SDN是安超云推出的一种高效、安全的网络解决方案,华云SDN可以同时纳管多个Kubernetes集群、多个安超集群、多个裸机和多个vmware集群,实现网络互通。华云SDN CNI则是基于华云SDN的Kubernetes集群容器网络解决方案,它实现了pod、service以及ingress等网络资源的通信,以下是pod从创建到CNI分配网络以及跨节点通信的网络架构图:

华云SDN CNI网络隔离方案

华云SDN CNI提供了四种网络隔离模式:

默认模式:这是基于华云SDN CNI的Kubernetes集群的默认网络模式,在该模式下,集群中所有的pod共用同一个网络,所有pod之间可以互相通信。不同Kubernetes集群之间相互隔离。

空间隔离模式:在该模式下,设置了隔离属性的命名空间是孤立的,不能从其他命名空间访问该命名空间中的 pod,反之亦然。

租户模式:在该模式下,通过在Kubernetes集群中创建network crd的方式,为某个namespace创建多个网络,并指定某个网络为该namespace的默认网络,此 namespace中创建的所有pod都默认使用这个网络。该模式与空间隔离模式区别在于空间隔离模式是基于集群名称和命名空间名称新建一个pod和service网络,但是共用集群默认的ipam,为pod和service分配的网段与集群默认的一致。而租户模式是通过network crd 的方式,为某个namespace创建并指定了一个自定义网络,使用自定义创建的ipam,为pod分配自定义的网段。

自定义网络模式:在该模式下,创建pod时可以指定任意一个pod网络,该网络可以是其他集群的pod网络。

默认模式

当Kubernetes集群完成华云SDN CNI部署后,CNI的控制器华云SDN-kube-manager根据配置的集群名称和pod/service cidr创建一个由该集群所有命名空间共享的虚拟pod/service网络和ipam。

集群中所有pod IP地址默认通过该pod ipam分配,创建的所有命名空间的pod共用同一个网络和网段,因此可以互相通信。

集群中所有service IP地址默认通过service ipam分配。service网络与pod网络通过Network Policy打通,实现了pod与service的通信。

由于不同Kubernetes集群会创建不同的pod和service网络,因此不同集群之间pod和service相互隔离。

空间隔离模式

创建namespace时,通过在namespace上添加注释:华云SDN/isolation: true来实现命名空间的pod和service隔离。

CNI的控制器华云SDN-kube-manager在watch到namespace创建事件时,当获取到华云SDN/isolation参数的值为true,就基于集群名称和命名空间名称新建一个pod和service网络,ipam共用集群默认的。

隔离命名空间中所有pod IP地址通过上述新建的pod ipam分配,共用同一个网络和网段,因此隔离命名空间中的pod可以互相通信。并且隔离命名空间的pod网络和隔离命名空间的service网络以及集群默认service网络通过Network Policy打通,实现了隔离命名空间的pod与隔离命名空间的service以及集群默认service间的通信。

由于隔离命名空间的pod和service网络是独立的,隔离命名空间的pod与其他pod网络没有打通,其他pod网络也没有与隔离命名空间的service网络打通,因此实现了隔离命名空间的pod与其他命名空间的pod相互隔离,其他命名空间的pod也不能访问隔离命名空间的service。

租户模式

通过在Kubernetes中创建network crd的方式,为某个命名空间创建多个自定义的pod网络和ipam,并指定某个网络为该namespace的默认网络。在该命名空间内创建pod会默认使用该pod网络和ipam来实现网络分配。创建自定义网络的yaml如下:

apiVersion: "k8s.cni.cncf.io/v1"

kind: NetworkAttachmentDefinition

metadata:

  name: network-test

  namespace: network-test

  annotations:

    "华云SDN/cidr": "81.244.0.0/16"

spec:

  config: '{

    "cniVersion": "0.3.0",

    "type": "contrail-k8s-cni"

}'

租户命名空间的pod共用同一个自定义网络和ipam,它们之间可以相互通信。由于和其他pod网络默认不通,因此实现了租户命名空间的pod和其他命名空间的pod间的隔离。

自定义网络模式

创建pod时,通过在pod上添加注释:"华云SDN/network": "{'net_id':'xxx', 'subnet_id': 'xxx'}"来设置自定义网络,这里要求这个网络必须是一个pod-network,可以是其他集群的pod网络。

使用同一个自定义网络的pod间可以互相通信,但是和其他网络的pod之间相互隔离。可以通过Network Policy或添加路由器来实现打通。

总结

针对Kubernetes集群中的pod网络隔离,华云SDN CNI提供了四种网络隔离方法,实现了租户间彻底的网络隔离和各租户能够独立进行网络规划和配置,很大程度上满足了不同场景下针对于pod网络隔离的应用。

上一篇:

从追随到引领,懂车帝《奋进的力量》见证中国新能源汽车辉煌时刻


ad2