Kubernetes 网络策略支持
总结 瞻博网络云原生 Contrail® 网络™ (CN2) 允许您在 Contrail 防火墙安全策略框架内部署 Kubernetes 网络策略。您必须使用支持 NetworkPolicy
(如 Contrail) 的 CNI 来部署网络策略。本主题提供有关如何在运行云原生 Contrail 网络的环境中部署 Kubernetes 网络策略的信息。
Kubernetes 网络策略概述
Kubernetes 网络策略允许您指定 Pod 如何与其他 Pod 和网络端点通信。Kubernetes NetworkPolicy
资源使 Pod 能够与:
-
允许列表中的其他 Pod(Pod 无法阻止对自身的访问)。
-
允许列表中有命名空间。
-
IP 块或无类域间路由 (CIDR)。
Kubernetes 网络策略仅适用于命名空间中的 Pod,并定义入口(源)和出口(目标)规则。Kubernetes 网络策略应用于 Pod 时具有以下特征:
-
Pod 特定,适用于单个 Pod 或一组 Pod。网络策略规则规定到该 Pod 的流量。
-
为 Pod 定义入口流量和/或出口流量的流量规则。如果未明确指定方向,则默认情况下该策略将应用于入口方向。
-
必须包含显式规则,用于在入口和出口方向中指定来自 allowlist 的流量。与允许列表规则不匹配的流量将被拒绝。
-
允许的流量包括与应用于 Pod 的任何网络策略匹配的流量。
Kubernetes 网络策略具有以下附加特征:
-
未应用于 Pod 时,该 Pod 会接受来自所有来源的流量。
-
对连接采取行动,而不是针对单个数据包采取行动。例如,如果配置的策略允许从 Pod A 到 Pod B 的流量,则也允许从 Pod B 到 Pod A 的数据包,即使已实施的策略不允许 Pod B 发起与 Pod A 的连接。
Kubernetes 网络策略包括以下部分:
-
spec
:描述 Kubernetes 对象所需的状态。对于网络策略,podSelector
规格中的和policyTypes
字段指定该策略的规则。 -
podSelector
:选择应用策略的 Pod 组。空podSelector
部分选择命名空间中的所有 Pod。 -
policyTypes
:指定策略是应用于选定 Pod 的入口流量,还是应用于选定 Pod 的出口流量。policyTypes
如果未指定,则默认选择入口方向。 -
ingress
:允许与和ports
部分匹配的from
入口流量。在以下示例中,入口规则允许使用标签应用程序与命名空间中的所有dev
Pod 进行连接:webserver-dev
在 TCP 端口 80 上,发件人:-
默认命名空间中带有标签
app: client1-dev
的任何 Pod。 -
10.169.25.20/32 范围内的所有 IP 地址。
-
默认命名空间中带有标签
project: jtac
的任何 Pod。
-
-
egress
:允许与和ports
部分匹配的to
出口流量。在示例 1 中,出口规则允许来自默认命名空间中任何带有标签app: dbserver-dev
的 Pod 的连接端口 TCP 80。 -
ipBlock
:选择要允许作为入口源或出口目标的 IP CIDR 范围。ipBlock
网络策略部分包含以下两个字段:-
cidr (ipBlock.cidr):网络策略允许指定 IP 范围内的出口流量或入口流量。
-
除外(ipBlock.除外):Kubernetes 预计指定 IP 范围内的流量与策略不匹配。网络策略会拒绝进入或从指定
except
IP 范围内的入口流量。注意:如果您在except
网络策略中使用,Kubernetes 希望 IP 范围内的识别流量except
与策略不匹配。CN2 不支持使用该术语的这种特定场景except
。因此,我们建议您避免使用except
。
-
以下 NetworkPolicy
资源示例显示 ingress
和 egress
规则:
#policy1-do.yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy1 namespace: dev spec: podSelector: matchLabels: app: webserver-dev policyTypes: - Ingress - Egress ingress: - from: - ipBlock: cidr: 10.169.25.20/32 - namespaceSelector: matchLabels: project: jtac - podSelector: matchLabels: app: client1-dev ports: - protocol: TCP port: 80 egress: - to: - podSelector: matchLabels: app: dbserver-dev ports: - protocol: TCP port: 80
在此示例中,允许来自 CIDR 10.169.25.20/32
port: 80
中 IP 的入口 TCP 流量。允许流向 Pod 的 matchLabels
app: dbserver-dev
TCP port: 80
出口流量。
在云原生 Contrail 网络中部署 Kubernetes 网络策略
在 CN2 中,配置和部署 Kubernetes 网络策略后,会在 Contrail 中自动创建该策略。以下是 Kubernetes 网络策略的示例:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: default spec: podSelector: matchLabels: role: db app: webserver-dev 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 TCP port: 5978
此策略将导致在 CN2 中创建以下对象:
关键 | 价值 |
---|---|
作用 | Db |
命名 空间 | 默认 |
项目 | 我的项目 |
作用 | 前端 |
名称 | 前缀 |
---|---|
test-network-policy-除外 | 172.17.1.0/24 |
test-network-policy | 172.17.0.0/16 |
test-network-policy-egress | 10.0.0.0/24 |
规则名称 | 操作 | 服务 | 端点1 | 方向 | 端点2 |
---|---|---|---|---|---|
default-ingress-test-network-policy-0-ipBlock-0-17x.xx.1.0/24-0 | 否认 | tcp:6379 | role=db && 命名空间=default | 入口 | 地址组:172.17.1.0/24 |
default-ingress-test-network-policy-0-ipBlock-0-cidr-17x.xx.0.0/16-0 | 通过 | tcp:6379 | role=db && 命名空间=default | 入口 | 地址组:172.17.0.0/16 |
default-ingress-test-network-policy-0-namespaceSelector-1-0 | 通过 | tcp:6379 | role=db && 命名空间=default | 入口 | 项目=我的项目 |
default-ingress-test-network-policy-0-podSelector-2-0 | 通过 | tcp:6379 | role=db && 命名空间=default | 入口 | 命名空间=default && role=前端 |
default-egress-test-network-policy-ipBlock-0-cidr-10.0.0.0/24-0 | 通过 | tcp:5978 | role=db && 命名空间=default | 出口 | 地址组:10.0.0.0/24 |
名称 | 规则 |
---|---|
default-test-network-policy | default-ingress-test-network-policy-0-ipBlock-0-172.17.1.0/24-0,default-ingress-test-network-policy-0-ipBlock-0-cidr-172.17.0.0/16-0 default-ingress-test-network-policy-0-namespaceSelector-1-0 default-ingress-test-network-policy-0-podSelector-2-0,default-egress-test-network-policy-ipBlock-0-cidr-10.0.0.0/24-0 |
Kubernetes 网络策略匹配 Expression
从云原生 Contrail 网络 22.3 开始,CN2 通过 matchExpressions
.有关的更多信息matchExpressions
,请参阅 Kubernetes 文档中的“支持基于集要求的资源”。