kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-by-default
spec:
podSelector: {}
ingress: []
作为开发者,您可以定义网络策略来限制集群中 Pod 的流量。
默认情况下,项目中的所有 Pod 都可以从其他 Pod 和网络端点访问。要隔离项目中的一个或多个 Pod,您可以在该项目中创建 `NetworkPolicy` 对象以指示允许的传入连接。项目管理员可以在其自己的项目中创建和删除 `NetworkPolicy` 对象。
如果一个 Pod 与一个或多个 `NetworkPolicy` 对象中的选择器匹配,则该 Pod 仅接受至少一个 `NetworkPolicy` 对象允许的连接。任何 `NetworkPolicy` 对象都没有选择的 Pod 是完全可访问的。
网络策略仅应用于 TCP、UDP、ICMP 和 SCTP 协议。其他协议不受影响。
网络策略不适用于主机网络命名空间。启用主机网络的 Pod 不受网络策略规则的影响。但是,连接到主机网络 Pod 的 Pod 可能会受到网络策略规则的影响。 网络策略无法阻止来自本地主机或其驻留节点的流量。 |
以下 `NetworkPolicy` 对象示例演示了支持不同场景的方法
拒绝所有流量
要使项目默认拒绝连接,请添加一个匹配所有 Pod 但不接受任何流量的 `NetworkPolicy` 对象。
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-by-default
spec:
podSelector: {}
ingress: []
仅允许来自 OpenShift 专用 Ingress Controller 的连接
要使项目仅允许来自 OpenShift 专用 Ingress Controller 的连接,请添加以下 `NetworkPolicy` 对象。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-openshift-ingress
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
network.openshift.io/policy-group: ingress
podSelector: {}
policyTypes:
- Ingress
仅接受来自项目内 Pod 的连接
要允许来自同一命名空间中 `hostNetwork` Pod 的入站连接,您需要将 `allow-from-hostnetwork` 策略与 `allow-same-namespace` 策略一起应用。 |
要使 Pod 接受来自同一项目中其他 Pod 的连接,但拒绝来自其他项目中 Pod 的所有其他连接,请添加以下 `NetworkPolicy` 对象。
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-same-namespace
spec:
podSelector: {}
ingress:
- from:
- podSelector: {}
仅允许基于 Pod 标签的 HTTP 和 HTTPS 流量
要仅允许对具有特定标签(在以下示例中为 `role=frontend`)的 Pod 进行 HTTP 和 HTTPS 访问,请添加一个类似于以下内容的 `NetworkPolicy` 对象。
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-http-and-https
spec:
podSelector:
matchLabels:
role: frontend
ingress:
- ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
使用命名空间和 Pod 选择器接受连接
要通过组合命名空间和 Pod 选择器来匹配网络流量,您可以使用类似于以下内容的 `NetworkPolicy` 对象。
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-pod-and-namespace-both
spec:
podSelector:
matchLabels:
name: test-pods
ingress:
- from:
- namespaceSelector:
matchLabels:
project: project_name
podSelector:
matchLabels:
name: test-pods
`NetworkPolicy` 对象是累加的,这意味着您可以将多个 `NetworkPolicy` 对象组合在一起以满足复杂的网络需求。
例如,对于前面示例中定义的NetworkPolicy
对象,您可以在同一个项目中定义allow-same-namespace
和allow-http-and-https
策略。这样就允许带有标签role=frontend
的 Pod 接受每项策略允许的任何连接。也就是说,来自同一命名空间中 Pod 的任何端口上的连接,以及来自任何命名空间中 Pod 的80
和443
端口上的连接。
使用以下NetworkPolicy
允许外部流量,而不管路由器配置如何
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-router
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
policy-group.network.openshift.io/ingress: ""(1)
podSelector: {}
policyTypes:
- Ingress
1 | policy-group.network.openshift.io/ingress:"" 标签支持 OVN-Kubernetes。 |
添加以下allow-from-hostnetwork
NetworkPolicy
对象以引导来自主机网络 Pod 的流量。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-hostnetwork
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
policy-group.network.openshift.io/host-network: ""
podSelector: {}
policyTypes:
- Ingress
设计网络策略时,请参考以下指南
对于具有相同spec.podSelector
规范的网络策略,使用一个包含多个ingress
或egress
规则的网络策略,比使用多个包含ingress
或egress
规则子集的网络策略更高效。
每个基于podSelector
或namespaceSelector
规范的ingress
或egress
规则生成的 OVS 流数量与网络策略选择的 Pod 数量 + ingress 或 egress 规则选择的 Pod 数量
成正比。因此,最好使用可以在一个规则中选择尽可能多 Pod 的podSelector
或namespaceSelector
规范,而不是为每个 Pod 创建单独的规则。
例如,以下策略包含两条规则
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
spec:
podSelector: {}
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
- from:
- podSelector:
matchLabels:
role: backend
以下策略将这两条规则表达为一条规则
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
spec:
podSelector: {}
ingress:
- from:
- podSelector:
matchExpressions:
- {key: role, operator: In, values: [frontend, backend]}
同样的指南也适用于spec.podSelector
规范。如果不同的网络策略具有相同的ingress
或egress
规则,则创建一个具有公共spec.podSelector
规范的网络策略可能会更高效。例如,以下两个策略具有不同的规则
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: policy1
spec:
podSelector:
matchLabels:
role: db
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: policy2
spec:
podSelector:
matchLabels:
role: client
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
以下网络策略将这两条规则表达为一条规则
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: policy3
spec:
podSelector:
matchExpressions:
- {key: role, operator: In, values: [db, client]}
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
只有在将多个选择器表达为一个选择器时,才能应用此优化。如果选择器基于不同的标签,则可能无法应用此优化。在这种情况下,请考虑专门为网络策略优化应用一些新的标签。