Kubernetes — 核心资源对象 — Network Policy
Posted 范桂飓
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes — 核心资源对象 — Network Policy相关的知识,希望对你有一定的参考价值。
目录
文章目录
Network Policy
通过设置 Network Policy,可以允许被 Label Selector 选定的 Pods 被哪些 IP 地址访问(Ingress 入站策略),以及允许选定的 Pods 去访问哪些 IP 地址(Egress 出站)。本质上是以 App/Pod 为中心的 L3-4 ACL(访问控制策略)设计。
Network Policy 通常与某个 Namespace 绑定,默认情况下,如果 Namespace 中不存在 Network Policy,则所有 Ingress/Egress 该 Namespace 中的 Pods 的流量都被允许。并且针对某个 App/Pod 的多条 Policies 的效果是叠加的,所以不存在顺序和冲突的情况。
需要注意的是,Network Policy 由 CNI 支撑,所以 Network Policy 支持的能力取决于 CNI 的能力。
一个 Network Policy 的示例:
- 必需字段:apiVersion、 kind 和 metadata。
- spec:NetworkPolicy Spec,包含了在一个 Namespace 中定义一个 Network Policy 所需要的所有信息。
- podSelector:每个 NetworkPolicy 都必须包含一个 podSelector。NULL 表示选择该 Namespace 下的所有 Pods。
- policyTypes:每个 NetworkPolicy 都必须包含一个 policyTypes 列表,可选元素为 Ingress 和 Egress。NULL 表示 Ingress。
- ingress:每个 NetworkPolicy 可包含一个 Ingress Rule 的白名单列表。Ingress Rule 允许同时匹配 from 和 ports 字段的流量。示例中包含了一条简单的 Ingress Rule,它匹配某个特定的端口,和 3 个来源,第一个通过 ipBlock 指定,第二个通过 namespaceSelector 指定,第三个通过 podSelector 指定。
- egress:每个 NetworkPolicy 可包含一个 Egress Rule 的白名单列表。 Egress Rule 允许同时匹配 to 和 ports 字段的流量。示例中包含一条规则,它匹配某个特定的端口上,和一个目的,通过 ipBlock 指定。
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
Network Policy Rules
Ingress Rule
示例 1:为 Namespace test-ns2 创建 Network Policy default-deny Ingress,表示默认拒绝 Namespace 内所有 Pods 的 Ingress 流量。
- podSekectir 为空,表示选择所有 Pods,即控制整个 Namespace。
- policyTypes 只定义了 Ingress,又把 podSelector 设置为空,表示拒绝 other Namespace 的所有 Ingress 流量。
- 没有定义 Egress,表示(默认)允许 Namespace 所有的 Pods 的 Egress 流量。
示例 2:允许 Subnet 20.10.10.0/24 里的 Pods 访问 Namespace test-ns1 中有 Label nginx-ns1 的 Pods 的 Port 80,并且将 IP 20.10.10.3/32 的 Pod 除外。
Egress Rule
示例 1:禁止 Namespace test-ns1 中的 Label nginx-ns1 的 Pods 去(egress 出站)请求 Namespace test-ns2 的 ClusterIP Service 10.96.0.12。
Network Policy Rule Selectors
Network Policy 支持在 Ingress Rule 的 from 或 Egress Rule 的 to 部分中指定 4 种 Selectors(选择器):
- namespaceSelector:表示选定的 Namespace 中的所有 Pods 作为 Ingress from 或 Egress to 的来源或目的 Pods。
- podSelector:表示 Namespace 中选定的 Pods 作为 Ingress from 或 Egress to 的来源或目的 Pods。
- ipBlock:表示指定的 IP block(IP 地址块)作为 Ingress from 或 Egress to 的来源或目的 IP 地址。该 IP 地址应该是 Service IP 或 External IP,因为 Pod IP 总是短暂且随机产生的。
namespaceSelector:此选择器将选择特定的名字空间,应将所有 Pod 用作其 入站流量来源或出站流量目的地。
namespaceSelector 和 podSelector:一个指定 namespaceSelector 和 podSelector 的 to/from 条目选择特定名字空间中的特定 Pod。 注意使用正确的 YAML 语法;下面的策略:
namespaceSelector
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
spec:
podSelector: # 规则对具有 role=db 标签的 Pod 生效
matchLabels:
role: db
ingress: # 表示入规则
- from:
- namespaceSelector: # 只允许具有 project=myproject 标签的命名空间中的 Pod 访问
matchLabels:
project: myproject
ports: # 只能使用 TCP 协议访问 6379 端口
- protocol: TCP
port: 6379
podSelector
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
policyTypes:
- Ingress
- Egress
podSelector: # 规则对具有 role=db 标签的 Pod 生效
matchLabels:
role: db
ingress: # 表示入规则
- from:
- podSelector: # 只允许具有 role=frontend 标签的 Pod 访问
matchLabels:
role: frontend
ports: # 只能使用 TCP 协议访问 6379 端口
- protocol: TCP
port: 6379
egress:
以上是关于Kubernetes — 核心资源对象 — Network Policy的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes — 核心资源对象 — Controller
Kubernetes — 核心资源对象 — Network Policy