• Kubernetes隔离pod的网络


      本章介绍如何通过限制pod可以与其他哪些pod通信,来确保pod之间的网络安全。

      是否可以进行这些配置取决于集群中使用的容器网络插件。如果网络插件支持,可以通过NetworkPolicy资源配置网络隔离。

      一个NetworkPolicy会应用在匹配它的标签选择器的pod上,指明这些允许访问这些pod的源地址,或这些pod可以访问的目标地址。这些分别由入向(ingress) 和出向(egress)规则指定。这两种规则都可以匹配由标签选择器选出的pod,或者一个namespace中的所有pod,或者通过无类别域间路由(Classless Inter-Domain Routing, CIDR)指定的IP地址段。

      将介绍这两种规则及全部三种匹配选项。

      注意:入向规则与Ingress资源无关。

     

    1.在一个命名空间中启用网络隔离

      在默认情况下,某一命名空间中的pod可以被任意来源访问。首先,需要改变这个设定。需要创建一个default-deny NetworkPolicy,它会阻止任何客户端访问中的pod。这个NetworkPolicy的定义如以下代码所示。

    #代码13.21 default-deny NetworkPolicy定义: network-policy-default-deny.yaml
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: default-deny
    spec:
      podSelector:            #空的标签选择器匹配命名空间中的所有pod

      在任何一个特定的命名空间中创建该NetworkPolicy之后,任何客户端都不能访问该命名空间中的pod。

      注意:集群中的CNI插件或其他网络方案需要支持NetworkPolicy,否则NetworkPolicy将不会影响pod之间的可达性。

     

    2.允许同一命名空间中的部分pod访问一个服务端pod

      为了允许同一命名空间中的客户端pod访问该命名空间的pod,需要指明哪些pod可以访问。接下来,通过例子来探究如何做到这些。

      假设在foo namespace中有一个pod运行PostgreSQL数据库,以及一个使用该数据库的网页服务器pod,其他pod也在这个命名空间中运行,然而你不允许它们连接数据库。为了保障网络安全,需要在数据库pod所在的命名空间中创建一个如以下代码清单所示的NetworkPolicy资源。

    #代码13.22 为Postgres pod使用的NetworkPolicy:network-policy-postgres.yaml
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: postgres-netpolicy
    spec:                              #这个策略确保了对具有app=database标签的pod的访问安全性
      podSelector:
        matchLabels:
          app: database
      ingress:                        #它予许来自具有app=webserver标签的pod的访问
      - from:
        - podSelector:
            matchLabels:
              app: webserver
        ports:                             #予许对这个端口访问
        - port: 5432

      例子中的NetworkPolicy允许具有app=webserver标签的pod访问具有app=database的pod的访问,并且仅限访问5432端口,如图13.4所示。

      客户端pod通常通过Service而非直接访问pod来访问服务端pod,但这对结果没有改变。NetworkPolicy在通过Service访问时仍然会被执行。

     

     

    3.在不同 Kubernetes 命名空间之间进行网络隔离

      现在来看有另一个多个租户使用同一Kubernetes集群的例子。每个租户有多个命名空间,每个命名空间中有一个标签指明它们属于哪个租户。例如,有一个租户Manning,它的所有命名空间中都有标签tenant:manning。其中的一个命名空间中运行了一个微服务Shopping Cart,它需要允许同一租户下所有命名空间的所有pod访问。显然,其他租户禁止访问这个微服务。

      为了保障该微服务安全,可以创建如下的NetworkPolicy资源,如以下代码所示。

    #代码13.23 为shopping cart微服务中的pod使用的NetworkPolicy: network-policy-cart.yaml
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: shoppingcart-netpolicy
    spec:
      podSelector:                          #该策略应用于具有app=shopping-cart标签的pod
        matchLabels:
          app: shopping-cart 
      ingress:
      - from:
        - namespaceSelector:         #只有在具有tenant=manning标签的命名空间中运行的pod可以访问该微服务
            matchLabels:
              tenant: manning
        ports:
        - port: 80

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

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

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

     

    4.使用CIDR隔离网络

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

    #代码13.24 在入向规则中指明IP段:network-policy-cidr.yaml
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: ipblock-netpolicy
    spec:
      podSelector:
        matchLabels:
          app: shopping-cart
      ingress:
      - from:
        - ipBlock:                                #这条入向规则来自192.168.1.0/24段的客户端的流量
            cidr: 192.168.1.0/24

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

      在之前的所有例子中,已经通过入向规则限制了进入pod的访问流量。然而,也可以通过出向规则限制pod的对外访问流量。以下代码清单展示了一个例子。

    #代码13.25 在NetworkPolicy中使用出现规则:network-policy-egress.yaml
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: egress-net-policy
    spec:
      podSelector:                      #这个策略应用于包含app=webserver标签的pod
        matchLabels:
          app: webserver
      egress:                               #限制pod的出网流量
      - to:
        - podSelector:                  #webserver的pod只能与有app=webserver标签的pod通信
            matchLabels:
              app: database
        ports:
        - port: 5432

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

    作者:小家电维修

    相见有时,后会无期。

  • 相关阅读:
    springMvc 4.0 jackson包改变
    spring 获取bean的几种方式
    添加@ControllerAdvice后报错 Failed to invoke @ExceptionHandler method
    Cglib学习报错 java.lang.reflect.InvocationTargetException-->null
    JDK动态proxy原理解析
    (转)jquery $.proxy的使用
    (转)jQuery的deferred对象详解
    (转)JavaScript中==和===的区别
    (扫盲)jQuery extend()和jQuery.fn.extend()的区别
    (转)js中__proto__和prototype的区别和关系
  • 原文地址:https://www.cnblogs.com/lizexiong/p/14813296.html
Copyright © 2020-2023  润新知