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 对象,指定的隔离规则如下所示:
- 该隔离规则只对 default Namespace 下的,携带了 role=db 标签的 Pod 有效。限制的请求类型包括 ingress(流入)和 egress(流出)。
- 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 网段的请求。
- Kubernetes 会拒绝被隔离 Pod 对外发起任何请求,除非请求的目的地址属于 10.0.0.0/24 网段,并且访问的是该网段地址的 5978 端口。
2.2 from 和 to 字段的区别
需要注意的是,定义一个 NetworkPoli
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专刊适合于立志转行云计算的小白,有一定的编程、操作系统、计算机网络、数据结构、算法基础。 本专刊同时也适合于面向云计算(Docker + Kubernetes)求职的从业者。 本专刊囊括了云计算、VMWare、Docker、Kubernetes、Containerd等一系列知识点的讲解,并且最后总