Kubernetes学习笔记-保障集群内节点和网络安全(4)隔离pod的网络20220911

通过限制pod可以与哪些pod通信,来确保pod之间的网络安全。
一个NetworkPolicy会应用在它的标签选择器的pod上,指明这些允许访问这些pod的源地址,或这些pod可以访问的目标地址。这些分别由入向(ingress)和出向(egress)规则指定。这两种规则都可以去匹配由标签选择器选出的pod,或一个namespace中的所有pod,或通过无类别域间路由(Classless Inter-Domain Routing,CIDR)指向的ip地址段。
两种规则及全部三种匹配选项
1、在一个命名空间中启用网络隔离

默认情况下,某一个命名空间中的pod可以被任意来源访问。需要改变这个设定,需要创建一个default-deny NetworkPolicy,它会阻止任何客户端访问中的pod。
如下NetworkPolicy的定义yaml文件
apiVersion:network.k8s.io/v1
kind:NetworkPolicy
metadata:
  name:
    default-deny
  spec:
    podSelector:

在任何一个特定的命名空间中创建该NetworPolicy之后,任何客户端都不能访问该命名空间中的pod
注意:集群中的CNI插件或其他网络方案需要支持NetworkPolicy,否则NetworkPolicy将不会影响pod之间的可达性。
 

2、允许同一命名空间中的部分pod访问一个服务端pod
为了允许同一命名空间中的客户端pod访问该命名空间的pod,需要指明哪些pod可以访问。假设foo namespace中有一个pod运行PostgreSQL数据库,以及一个使用该数据库的网页服务器pod,其他pod也在这个命名空间中运行,然而你不允许他们连接数据库。为了保障网络安全,需要在数据库pod所在命名空间中创建一个如下NetworkPolicy资源
apiVersion:networking.k8s.io/v1
kind:NetworkPolicy
metadata:
  name:postgres-netpolicy
spec:
  podSelector:
    matchLabels:
      app:database
    ingress:
    -from:
      -podSelector:
        matchLabels:
          app:webserver
      ports:
      -port:5432

例子中的networkpolicy允许具有app=wenserver标签的pod访问具有app=database的pod的访问,并且仅访问5432端口


3、在不同kubernetes命名空间之间进行网络隔离

一个多租户使用统一kubernetes集群的例子。每个租户有多个命名空间,每个命名空间中有一个标签指明他们属于哪个租户。如一个租户Manning,他的所有命名空间中都有标签tenant:manning。其中一个命名空间运行了一个微服务Shopping Cart,他需要允许同一个租户下所有命名空间的所有pod访问。

为了保障该微服务安全,可以创建如下NetworkPolicy资源:network-policy-cart.yaml

apiVersion:networking.k8s.io/v1

kind:NetworkPolicy

metadata:

  name:shoppingcart-netpolicy

spec:

  podSelector:

    matchLabels:        

      app:shopping-cart

  ingress:

  -from:

      -namespaceSelector:

        matchLabels:

          tenant:manning

      pors:

      -port:80

以上NetworkPolicy保证了只有tenant=manning标签的命名空间中运行的pod可以访问Shopping Cart微服务。

如果shopping cart服务的提供者需要允许其他租户(可能是他们合作公司)访问该服务,他们可以创建一个新的NetworkPolicy资源,或者在之前的NetworkPolicy中添加一条入项规则。

注意:在多租户的kubernetes集群中,通常租户不能给你喂它们的命名空间添加标签(或注释)。否则,他们可以规避基于namespacesSelector的入向规则。

4、使用CIDR隔离网络

(Classless Inter-Domain Routing,CIDR)

除了通过在pod选择器或命名空间选择器定义哪些pod可以访问NetworkPolicy资源中制定的目标pod,还可以通过CIDR表示法指定一个IP端。如:为了允许IP在192.168.1.1到192.168.1.255范围内的客户端访问之间提到的shopping-cart的pod,可以在入向规则中加入如下代码:

ingress:

-from:

  -ipBlock:

    cidr:192.168.1.0/24

5、限制pod的对外访问流量

之前通过入向规则限制了进入pod的访问流量,也可以通过处向规则限制pod的对外访问流量,如下:

spec:

  podSelector:

    matchLabels:

      app:webserver

egress:

-to:

  -podSelector:

    matchLabels:

      app:database

以上的NetworkPolicy仅允许具有标签app=webserver的pod访问具有标签app=database的pod,除此之外不能访问任何地址(不论是其他pod,还是任何其他ip,无论在集群内还是外部)

13章总结

  • pod可以使用宿主节点的Linux命名空间,而不是他们自己的
  • 容器可以运行在与镜像中不同的用户或用户组下
  • 容器可以在特权模式下运行,运行他们访问通常情况下不对pod暴露的设备
  • 容器可以在只读模式下运行,阻止进程写入容器的根文件系统(只允许写入挂载的存储卷)
  • 集群级别的PodSecurityPolicy资源可以用来防止用户创建可能危及宿主节点的pod
  • PodSecurityPolicy资源可以通过RBAC中的ClusterRole和ClusterRoleBinding与特定用户关联
  • NetworkPolicy资源可以限制pod的入向和出向网络流量

你可能感兴趣的:(学习笔记,kubernetes,学习,网络)