37. K8s 网络原理——NetworkPolicy

本章讲解知识点

  • Network Policy 网络原理
  • NetworkPolicy 资源介绍

<br>

1. Network Policy 网络原理

在 Kubernetes 中,容器之间的连通性是网络模型的关注点,而与此同时,容器之间的隔离性也是同样重要的。Kubernetes 的网络方案对“隔离”到底是如何考虑的呢?Kubernetes 又如何考虑网络“多租户”的需求。在 Kubernetes 的网络方案中,为实现容器之间的隔离性,引入了专门的 API 对象,即 NetworkPolicy。该对象提供了一种描述容器间网络隔离的机制,以满足多租户的需求。

NetworkPolicy 是 Kubernetes 的一个网络策略对象,用于限制 Pod 或 Namespace 之间的网络通信,以实现网络隔离和准入控制。该策略对象可以根据查询条件(如 Label)设置允许或禁止访问客户端 Pod 列表。当前,查询条件可用于 Pod 和 Namespace 级别。但是,该资源对象只配置策略规则,还需要一个策略控制器来实现具体策略规则。第三方网络组件,如 Calico、Weave Net 等,都提供策略控制器来实现 NetworkPolicy。

Network Policy 的工作原理如下图:策略控制器需要实现一个 API Listener,监听用户设置的 NetworkPolicy 定义,并将网络访问规则通过各 Node 的 Agent 进行实际设置(Agent 需要通过 CNI 网络插件实现)。

<br>

2. NetworkPolicy 资源介绍

2.1 一个示例

一个完整的 NetworkPolicy 对象的示例,如下所示:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978

在 Kubernetes 中,默认情况下,Pod 具有“接受全部”(Accept All)的网络访问权限,也就是说,Pod 可以接收来自任何发送方的请求,并向任何接收方发送请求。如果需要对此进行限制,必须通过 NetworkPolicy 对象来设置规则。

在上面这个例子中,可以看到 podSelector 字段,它的作用是定义 NetworkPolicy 的作用范围,例如当前命名空间中带有 role=db 标签的 Pod。如果将 podSelector 字段留空:

spec:
 podSelector: {}

那么这个 NetworkPolicy 就会作用于当前 Namespace 下的所有 Pod。而一旦 Pod 被 NetworkPolicy 选中,那么这个 Pod 就会进入“拒绝所有”(Deny All)的状态,即:这个 Pod 既不允许被外界访问,也不允许对外界发起访问。而 NetworkPolicy 定义的规则,其实就是“白名单”

在上述示例中,policyTypes 字段定义了 NetworkPolicy 的类型为 ingress 和 egress,即限制了流入和流出的请求。在 ingress 字段中,from 和 ports 字段指定了允许流入的"白名单"和端口。其中,"白名单"由三个并列的情况构成,分别是 ipBlock、namespaceSelector 和 podSelector。而在 egress 字段中,则定义了 to 和 ports,即允许流出的"白名单"和端口。这里允许流出的"白名单"的定义方式与 ingress 类似,只不过 ipBlock 字段指定的是目标地址的网段。

综上所述,这个 NetworkPolicy 对象,指定的隔离规则如下所示:

  1. 该隔离规则只对 default Namespace 下的,携带了 role=db 标签的 Pod 有效。限制的请求类型包括 ingress(流入)和 egress(流出)。
  2. Kubernetes 会拒绝任何访问被隔离 Pod 的请求,除非这个请求来自于以下“白名单”里的对象,并且访问的是被隔离 Pod 的 6379 端口。这些“白名单”对象包括:a. default Namespace 里的,携带了 role=fronted 标签的 Pod;b. 携带了 project=myproject 标签的 Namespace 里的任何 Pod;c. 任何源地址属于 172.17.0.0/16 网段,且不属于 172.17.1.0/24 网段的请求。
  3. Kubernetes 会拒绝被隔离 Pod 对外发起任何请求,除非请求的目的地址属于 10.0.0.0/24 网段,并且访问的是该网段地址的 5978 端口。

2.2 from 和 to 字段的区别

需要注意的是,定义一个 NetworkPoli

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

云计算面试题全解析 文章被收录于专栏

本专刊适合于立志转行云计算的小白,有一定的编程、操作系统、计算机网络、数据结构、算法基础。 本专刊同时也适合于面向云计算(Docker + Kubernetes)求职的从业者。 本专刊囊括了云计算、VMWare、Docker、Kubernetes、Containerd等一系列知识点的讲解,并且最后总

全部评论

相关推荐

05-09 14:45
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务