当前位置 : 主页 > 编程语言 > java >

Kubernetes NetworkPolicy

来源:互联网 收集:自由互联 发布时间:2022-10-26
​​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流量控制。

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限制。


    网友评论