写点什么

云原生(二十三) | Kubernetes 篇之 Kubernetes 网络策略(NetworkPolicy)

作者:Lansonli
  • 2022 年 8 月 21 日
    广东
  • 本文字数:2551 字

    阅读完需:约 8 分钟

云原生(二十三) | Kubernetes篇之Kubernetes 网络策略(NetworkPolicy)

​Kubernetes 网络策略(NetworkPolicy)

网络策略(网络隔离策略)

网络策略 | Kubernetes

指定 Pod 间的网络隔离策略,默认是所有互通。

Pod 之间互通,是通过如下三个标识符的组合来辩识的:

  • 其他被允许的 Pods(例外:Pod 无法阻塞对自身的访问)

  • 被允许的名称空间

  • IP 组块(例外:与 Pod 运行所在的节点的通信总是被允许的, 无论 Pod 或节点的 IP 地址)



一、Pod 隔离与非隔离

  • 默认情况下,Pod 网络都是非隔离的(non-isolated),可以接受来自任何请求方的网络请求。

  • 如果一个 NetworkPolicy 的标签选择器选中了某个 Pod,则该 Pod 将变成隔离的(isolated),并将拒绝任何不被 NetworkPolicy 许可的网络连接。


二、规约

apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:  name: test-network-policy  namespace: defaultspec:  podSelector:  ## 选中指定Pod    matchLabels:      role: db  policyTypes:  ## 定义上面Pod的入站出站规则  - 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
复制代码


  • 基本信息: 同其他的 Kubernetes 对象一样,NetworkPolicy 需要 apiVersionkindmetadata 字段

  • spec:NetworkPolicy的 spec 字段包含了定义网络策略的主要信息:

    podSelector: 同名称空间中,符合此标签选择器 .spec.podSelector 的 Pod 都将应用这个 NetworkPolicy。上面的 Example 中的 podSelector 选择了 role=db 的 Pod。如果该字段为空,则将对名称空间中所有的 Pod 应用这个 NetworkPolicy

    policyTypes: .spec.policyTypes 是一个数组类型的字段,该数组中可以包含 IngressEgress 中的一个,也可能两个都包含。该字段标识了此 NetworkPolicy 是否应用到 入方向的网络流量、出方向的网络流量、或者两者都有。如果不指定 policyTypes 字段,该字段默认将始终包含 Ingress,当 NetworkPolicy 中包含出方向的规则时,Egress 也将被添加到默认值。

    ingress:ingress 是一个数组,代表入方向的白名单规则。每一条规则都将允许与fromports匹配的入方向的网络流量发生。例子中的ingress包含了一条规则,允许的入方向网络流量必须符合如下条件:

    Pod 的监听端口为 6379

    请求方可以是如下三种来源当中的任意一种:

    ipBlock 为 172.17.0.0/16 网段,但是不包括 172.17.1.0/24 网段

    namespaceSelector 标签选择器,匹配标签为 project=myproject

    podSelector 标签选择器,匹配标签为 role=frontend

    egress:egress是一个数组,代表出方向的白名单规则。每一条规则都将允许与toports匹配的出方向的网络流量发生。例子中的egress允许的出方向网络流量必须符合如下条件:

    目标端口为 5978

    目标 ipBlock 为 10.0.0.0/24 网段

因此,例子中的 NetworkPolicy 对网络流量做了如下限制:

  • 隔离了 default 名称空间中带有 role=db 标签的所有 Pod 的入方向网络流量和出方向网络流量

  • Ingress 规则(入方向白名单规则):

    当请求方是如下三种来源当中的任意一种时,允许访问default名称空间中所有带role=db标签的 Pod 的 6379 端口:

    ipBlock 为 172.17.0.0/16 网段,但是不包括 172.17.1.0/24 网段

    namespaceSelector 标签选择器,匹配标签为 project=myproject

    podSelector 标签选择器,匹配标签为 role=frontend

  • Egress 规则(出方向白名单规则):

    当如下条件满足时,允许出方向的网络流量:

    目标端口为 5978

    目标 ipBlock 为 10.0.0.0/24 网段


三、to 和 from 选择器的行为

NetworkPolicy 的 .spec.ingress.from.spec.egress.to 字段中,可以指定 4 种类型的标签选择器:

  • podSelector 选择与 NetworkPolicy 同名称空间中的 Pod 作为入方向访问控制规则的源或者出方向访问控制规则的目标

  • namespaceSelector 选择某个名称空间(其中所有的 Pod)作为入方向访问控制规则的源或者出方向访问控制规则的目标

  • namespaceSelectorpodSelector 在一个 to / from 条目中同时包含 namespaceSelectorpodSelector 将选中指定名称空间中的指定 Pod。此时请特别留意 YAML 的写法,如下所示:

  ...  ingress:  - from:    - namespaceSelector:        matchLabels:          user: alice      podSelector:        matchLabels:          role: client  ...
复制代码


该例子中,podSelector 前面没有 - 减号,namespaceSelector 和 podSelector 是同一个 from 元素的两个字段,将选中带 user=alice 标签的名称空间中所有带 role=client 标签的 Pod。但是,下面的这个 NetworkPolicy 含义是不一样的:

 ...  ingress:  - from:    - namespaceSelector:        matchLabels:          user: alice    - podSelector:        matchLabels:          role: client  ...
复制代码


后者,podSelector 前面带 - 减号,说明 namespaceSelector 和 podSelector 是 from 数组中的两个元素,他们将选中 NetworkPolicy 同名称空间中带 role=client 标签的对象,以及带 user=alice 标签的名称空间的所有 Pod。

前者是交集关系(且),后者是并集关系(或)

  • ipBlock 可选择 IP CIDR 范围作为入方向访问控制规则的源或者出方向访问控制规则的目标。这里应该指定的是集群外部的 IP,因为集群内部 Pod 的 IP 地址是临时分配的,且不可预测。

集群的入方向和出方向网络机制通常需要重写网络报文的 source 或者 destination IP。kubernetes 并未定义应该在处理 NetworkPolicy 之前还是之后再修改 source / destination IP,因此,在不同的云供应商、使用不同的网络插件时,最终的行为都可能不一样。这意味着:

  • 对于入方向的网络流量,某些情况下,你可以基于实际的源 IP 地址过滤流入的报文;在另外一些情况下,NetworkPolicy 所处理的 "source IP" 可能是 LoadBalancer 的 IP 地址,或者其他地址

  • 对于出方向的网络流量,基于 ipBlock 的策略可能有效,也可能无效


四、场景

参考官网文档:

网络策略 | Kubernetes



发布于: 刚刚阅读数: 3
用户头像

Lansonli

关注

微信公众号:三帮大数据 2022.07.12 加入

CSDN大数据领域博客专家,华为云享专家、阿里云专家博主、腾云先锋(TDP)核心成员、51CTO专家博主,全网六万多粉丝,知名互联网公司大数据高级开发工程师

评论

发布
暂无评论
云原生(二十三) | Kubernetes篇之Kubernetes 网络策略(NetworkPolicy)_云原生_Lansonli_InfoQ写作社区