Kubernetes中如何配置特定的NetworkPolicy来控制网络流量?

2026-05-27 21:342阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1587个文字,预计阅读时间需要7分钟。

Kubernetes中如何配置特定的NetworkPolicy来控制网络流量?

Kubernetes官方网址介绍:Network Policy提供了基于策略的网络控制,用于隔离应用并减少攻击面。它使用标签选择器模拟传统的分段网络,并通过策略控制流量。


​​Kubernetes 官方网址介绍​​

Network Policy提供了基于策略的网络控制,用于隔离应用并减少攻击面。它使用标签选择器模拟传统的分段网络,并通过策略控制它们之间的流量以及来自外部的流量。

在使用Network Policy之前,需要注意

  • apiserver开启extensions/v1beta1/networkpolicies
  • 网络插件要支持Network Policy,如Calico、Romana、Weave Net和trireme等

1、Namespace隔离

默认情况下,所有Pod之间是全通的。每个Namespace可以配置独立的网络策略,来隔离Pod之间的流量。比如隔离namespace的所有Pod之间的流量(包括从外部到该namespace中所有Pod的流量以及namespace内部Pod相互之间的流量):

kubectl annotate ns <namespace> "net.beta.kubernetes.io/network-policy={\"ingress\": {\"isolation\": \"DefaultDeny\"}}"

注:目前,Network Policy仅支持Ingress流量控制。

Kubernetes中如何配置特定的NetworkPolicy来控制网络流量?

2、Pod隔离

通过使用标签选择器(包括namespaceSelector和podSelector)来控制Pod之间的流量。比如下面的Network Policy

  • 允许IP范围​​172.17.0.0/16​​​或者​​172.17.1.0/24​​访问,带有的default Pod带有role=db标签
  • 允许namespace带有​​project=myproject​​标签访问,带有的default Pod带有role=db标签
  • 允许当前namespace Pod带有​​role=frontend​​标签访问,带有的default Pod带有role=db标签
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db # 对当前namespace default中Pod带有role=db标签生效
policyTypes:
- Ingress
- Egress
ingress: # 入站规则
- from:
- ipBlock:
cidr: 172.17.0.0/16 # 允许网段
except:
- 172.17.1.0/24 # 排除网段
- namespaceSelector:
matchLabels:
project: myproject # 允许标签带有project=myproject namespace访问
- podSelector:
matchLabels:
role: frontend # 允许当前namespace Pod带有role=frontend标签访问
ports:
- protocol: TCP # 支持的协议有TCP, UDP, SCTP
port: 6379
egress: # 出站规则
- {} # 允许所有出站规则

说明: 除非选择支持网络策略的网络解决方案,否则将上述示例发送到API服务器没有任何效果。

必需字段:与所有其他的 Kubernetes 配置一样,NetworkPolicy 需要 ​​apiVersion​​​、 ​​kind​​​ 和 ​​metadata​​​ 字段。关于配置文件操作的一般信息, 请参考​​配置 Pod 以使用 ConfigMap​​​ 和​​对象管理​​。

spec:NetworkPolicy ​​规约​​ 中包含了在一个名字空间中定义特定网络策略所需的所有信息。

podSelector:每个 NetworkPolicy 都包括一个 ​​podSelector​​​, 它对该策略所适用的一组 Pod 进行选择。示例中的策略选择带有 “role=db” 标签的 Pod。 空的 ​​podSelector​​ 选择名字空间下的所有 Pod。

policyTypes:每个 NetworkPolicy 都包含一个 ​​policyTypes​​​ 列表,其中包含 ​​Ingress​​​ 或 ​​Egress​​​ 或两者兼具。​​policyTypes​​​ 字段表示给定的策略是应用于进入所选 Pod 的入站流量还是来自所选 Pod 的出站流量,或两者兼有。 如果 NetworkPolicy 未指定 ​​policyTypes​​​ 则默认情况下始终设置 ​​Ingress​​​; 如果 NetworkPolicy 有任何出口规则的话则设置 ​​Egress​​。

ingress:每个 NetworkPolicy 可包含一个 ​​ingress​​​ 规则的白名单列表。 每个规则都允许同时匹配 ​​from​​​ 和 ​​ports​​​ 部分的流量。示例策略中包含一条简单的规则: 它匹配某个特定端口,来自三个来源中的一个,第一个通过 ​​ipBlock​​​ 指定,第二个通过 ​​namespaceSelector​​​ 指定,第三个通过 ​​podSelector​​ 指定。

egress:每个 NetworkPolicy 可包含一个 ​​egress​​​ 规则的白名单列表。 每个规则都允许匹配 ​​to​​​ 和 ​​port​​​ 部分的流量。该示例策略包含一条规则, 该规则将指定端口上的流量匹配到 ​​10.0.0.0/24​​ 中的任何目的地。

所以,该网络策略示例:

  • 隔离 “default” 名字空间下 “role=db” 的 Pod (如果它们不是已经被隔离的话)。
  • (Ingress 规则)允许以下 Pod 连接到 “default” 名字空间下的带有 “role=db” 标签的所有 Pod 的 6379 TCP 端口:
    • “default” 名字空间下带有 “role=frontend” 标签的所有 Pod
    • 带有 “project=myproject” 标签的所有名字空间中的 Pod
    • IP 地址范围为 172.17.0.0–172.17.0.255 和 172.17.2.0–172.17.255.255 (即,除了 172.17.1.0/24 之外的所有 172.17.0.0/16)
  • (Egress 规则)允许 “default” 命名空间中任何带有标签 “role=db” 的 Pod 到 CIDR 10.0.0.0/24 下 5978 TCP 端口的连接。
  • 2、默认规则

    不定义规则并非没有规则,此时默认规则生效,以下展示默认规则用法。

    1、默认禁止所有入pod流量

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: default-deny
    spec:
    podSelector: {}
    policyTypes:
    -

    上例中没有定义pod选择器,表示如果namespace下的某个pod没有被任何Network Policy对象选中,则应用此对象,如果被其它Network Policy先中则不应用此对象。

    policyTypes的值为Ingress,表示本例启用Ingress规则。但是本例没有定义具体的Ingress,那就应用默认规则。默认规则禁止所有入pod流量,但例外情况是如果source就是pod运行的节点,则允许通过。

    2、默认允许所有入pod流量

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: allow-all
    spec:
    podSelector: {}
    ingress:
    - {}

    同样没有定义pod选择器,意义与上例同。注意ingress的定义,这个是有规则的,只是规则中的条目为空,与默认规则不同,表示全部允许通过。

    3、默认禁止所有出pod流量

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: default-deny
    spec:
    podSelector: {}
    policyTypes:
    -

    与默认禁止所有入pod流量(Default deny all ingress traffic)同,只是流量由入变成出

    4、默认允许所有出pod流量

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: allow-all
    spec:
    podSelector: {}
    egress:
    - {}
    policyTypes:
    -

    与默认允许所有入pod流量(Default allow all ingress traffic)同,只是流量由入变成出。

    5、默认禁止所有入出pod流量

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: default-deny
    spec:
    podSelector: {}
    policyTypes:
    - Ingress
    -

    无需详解,但请注意,pod与所运行节点之间流量不受Network Policy限制。


    本文共计1587个文字,预计阅读时间需要7分钟。

    Kubernetes中如何配置特定的NetworkPolicy来控制网络流量?

    Kubernetes官方网址介绍:Network Policy提供了基于策略的网络控制,用于隔离应用并减少攻击面。它使用标签选择器模拟传统的分段网络,并通过策略控制流量。


    ​​Kubernetes 官方网址介绍​​

    Network Policy提供了基于策略的网络控制,用于隔离应用并减少攻击面。它使用标签选择器模拟传统的分段网络,并通过策略控制它们之间的流量以及来自外部的流量。

    在使用Network Policy之前,需要注意

    • apiserver开启extensions/v1beta1/networkpolicies
    • 网络插件要支持Network Policy,如Calico、Romana、Weave Net和trireme等

    1、Namespace隔离

    默认情况下,所有Pod之间是全通的。每个Namespace可以配置独立的网络策略,来隔离Pod之间的流量。比如隔离namespace的所有Pod之间的流量(包括从外部到该namespace中所有Pod的流量以及namespace内部Pod相互之间的流量):

    kubectl annotate ns <namespace> "net.beta.kubernetes.io/network-policy={\"ingress\": {\"isolation\": \"DefaultDeny\"}}"

    注:目前,Network Policy仅支持Ingress流量控制。

    Kubernetes中如何配置特定的NetworkPolicy来控制网络流量?

    2、Pod隔离

    通过使用标签选择器(包括namespaceSelector和podSelector)来控制Pod之间的流量。比如下面的Network Policy

    • 允许IP范围​​172.17.0.0/16​​​或者​​172.17.1.0/24​​访问,带有的default Pod带有role=db标签
    • 允许namespace带有​​project=myproject​​标签访问,带有的default Pod带有role=db标签
    • 允许当前namespace Pod带有​​role=frontend​​标签访问,带有的default Pod带有role=db标签
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: test-network-policy
    namespace: default
    spec:
    podSelector:
    matchLabels:
    role: db # 对当前namespace default中Pod带有role=db标签生效
    policyTypes:
    - Ingress
    - Egress
    ingress: # 入站规则
    - from:
    - ipBlock:
    cidr: 172.17.0.0/16 # 允许网段
    except:
    - 172.17.1.0/24 # 排除网段
    - namespaceSelector:
    matchLabels:
    project: myproject # 允许标签带有project=myproject namespace访问
    - podSelector:
    matchLabels:
    role: frontend # 允许当前namespace Pod带有role=frontend标签访问
    ports:
    - protocol: TCP # 支持的协议有TCP, UDP, SCTP
    port: 6379
    egress: # 出站规则
    - {} # 允许所有出站规则

    说明: 除非选择支持网络策略的网络解决方案,否则将上述示例发送到API服务器没有任何效果。

    必需字段:与所有其他的 Kubernetes 配置一样,NetworkPolicy 需要 ​​apiVersion​​​、 ​​kind​​​ 和 ​​metadata​​​ 字段。关于配置文件操作的一般信息, 请参考​​配置 Pod 以使用 ConfigMap​​​ 和​​对象管理​​。

    spec:NetworkPolicy ​​规约​​ 中包含了在一个名字空间中定义特定网络策略所需的所有信息。

    podSelector:每个 NetworkPolicy 都包括一个 ​​podSelector​​​, 它对该策略所适用的一组 Pod 进行选择。示例中的策略选择带有 “role=db” 标签的 Pod。 空的 ​​podSelector​​ 选择名字空间下的所有 Pod。

    policyTypes:每个 NetworkPolicy 都包含一个 ​​policyTypes​​​ 列表,其中包含 ​​Ingress​​​ 或 ​​Egress​​​ 或两者兼具。​​policyTypes​​​ 字段表示给定的策略是应用于进入所选 Pod 的入站流量还是来自所选 Pod 的出站流量,或两者兼有。 如果 NetworkPolicy 未指定 ​​policyTypes​​​ 则默认情况下始终设置 ​​Ingress​​​; 如果 NetworkPolicy 有任何出口规则的话则设置 ​​Egress​​。

    ingress:每个 NetworkPolicy 可包含一个 ​​ingress​​​ 规则的白名单列表。 每个规则都允许同时匹配 ​​from​​​ 和 ​​ports​​​ 部分的流量。示例策略中包含一条简单的规则: 它匹配某个特定端口,来自三个来源中的一个,第一个通过 ​​ipBlock​​​ 指定,第二个通过 ​​namespaceSelector​​​ 指定,第三个通过 ​​podSelector​​ 指定。

    egress:每个 NetworkPolicy 可包含一个 ​​egress​​​ 规则的白名单列表。 每个规则都允许匹配 ​​to​​​ 和 ​​port​​​ 部分的流量。该示例策略包含一条规则, 该规则将指定端口上的流量匹配到 ​​10.0.0.0/24​​ 中的任何目的地。

    所以,该网络策略示例:

  • 隔离 “default” 名字空间下 “role=db” 的 Pod (如果它们不是已经被隔离的话)。
  • (Ingress 规则)允许以下 Pod 连接到 “default” 名字空间下的带有 “role=db” 标签的所有 Pod 的 6379 TCP 端口:
    • “default” 名字空间下带有 “role=frontend” 标签的所有 Pod
    • 带有 “project=myproject” 标签的所有名字空间中的 Pod
    • IP 地址范围为 172.17.0.0–172.17.0.255 和 172.17.2.0–172.17.255.255 (即,除了 172.17.1.0/24 之外的所有 172.17.0.0/16)
  • (Egress 规则)允许 “default” 命名空间中任何带有标签 “role=db” 的 Pod 到 CIDR 10.0.0.0/24 下 5978 TCP 端口的连接。
  • 2、默认规则

    不定义规则并非没有规则,此时默认规则生效,以下展示默认规则用法。

    1、默认禁止所有入pod流量

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: default-deny
    spec:
    podSelector: {}
    policyTypes:
    -

    上例中没有定义pod选择器,表示如果namespace下的某个pod没有被任何Network Policy对象选中,则应用此对象,如果被其它Network Policy先中则不应用此对象。

    policyTypes的值为Ingress,表示本例启用Ingress规则。但是本例没有定义具体的Ingress,那就应用默认规则。默认规则禁止所有入pod流量,但例外情况是如果source就是pod运行的节点,则允许通过。

    2、默认允许所有入pod流量

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: allow-all
    spec:
    podSelector: {}
    ingress:
    - {}

    同样没有定义pod选择器,意义与上例同。注意ingress的定义,这个是有规则的,只是规则中的条目为空,与默认规则不同,表示全部允许通过。

    3、默认禁止所有出pod流量

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: default-deny
    spec:
    podSelector: {}
    policyTypes:
    -

    与默认禁止所有入pod流量(Default deny all ingress traffic)同,只是流量由入变成出

    4、默认允许所有出pod流量

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: allow-all
    spec:
    podSelector: {}
    egress:
    - {}
    policyTypes:
    -

    与默认允许所有入pod流量(Default allow all ingress traffic)同,只是流量由入变成出。

    5、默认禁止所有入出pod流量

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: default-deny
    spec:
    podSelector: {}
    policyTypes:
    - Ingress
    -

    无需详解,但请注意,pod与所运行节点之间流量不受Network Policy限制。