• 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的入向和出向网络流量

  • 相关阅读:
    python数据可视化
    如何在不恢复出厂设置的情况下解锁 Android 手机密码?
    苹果平板不用原装笔可以吗?值得入手的几款ipad触控笔
    MyBatis-Plus用法 真的很强大啊
    对抗微信如何要把网页都变成快应用
    C++:二叉搜索树
    记录使用docker-compose搭建中间件基础环境
    【附源码】计算机毕业设计SSM图书销售系统设计
    经典c程序100例==31--40
    初识Redis之分布式
  • 原文地址:https://blog.csdn.net/wwxsoft/article/details/126807028