浅析 Kubernetes原生NetworkPolicy 网络策略,让更安全的容器运行环境唾手可得

2023年 7月 9日 26.3k 0

该规则就限制了所有 Pod 的出流量。

ingress: 可选字段,数组,入站规则。互相间为或的关系,满足其中一条则放行。

  • ports: 可选字段,数组,放行端口信息。互相间为或的关系,如果为空表示端口不受约束,如果非空,则表示除了出现的端口放行,其他未指定的端口都禁止。

-port: 可选字段,数字,协议端口号。如果不写,表示协议所有端口。

-protocol: 可选字段,字符串,协议。允许取值为 TCP,UDP,SCTP。省缺为 TCP。

  • from: 可选字段,数组,放行源地址信息。互相间为或的关系,如果为空表示不约束源地址,如果非空,则表示除了出现的源地址放行外,其他源地址都禁止。

-ipBlock: 可选字段,放行 ip 段。

cidr: 标准 cidr,除了指定的cidr放行外其他都禁止。

except: 标准 cidr 字符串数组,表示前面cidr 中的放行的 cidr 段需要再排除掉 except 中指定的。

-namespaceSelector: 可选字段,namespace 的标签选择器,表示放行集群中的哪些命名空间中过来的流量。如果为空`{}`或未出现则表示选中所有命名空间。

-podSelector: 可选字段,Pod 的标签选择器,表示放行哪些 Pod 过来的流量,默认情况下从NetworkPolicy 同命名空间下的 Pod 中做筛选,如果前面设定了`namespaceSelector`则从符合条件的命名空间中的 Pod 中做筛选。如果为空`{}`则表示选中满足`namespaceSelector` 条件的所有 Pod。

egress: 可选字段,数组,出站规则。互相间为或的关系,满足其中一条就放行。

  • ports: 可选字段,数组,放行端口信息。互相间为或的关系,如果为空表示端口不受约束,如果非空,则表示除了出现的端口放行,其他未指定的端口都禁止。(详细字段同 ingress 中的 ports)
  • to: 可选字段,数组,放行目的地址信息。互相间为或的关系,如果为空表示不约束目的,如果非空,则表示除了出现的目的地址放行外,其他目的地址都禁止。(详细字段同ingress 中的 from)

介绍完 [Spec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.14/#networkpolicyspec-v1-networking-k8s-io) 中各字段的含义及其默认行为后,做个简单的小结,NetworkPolicy 定义了放行规则,规则间是或的关系,只要命中其中一条规则就认为流量可以放行。

下面以一个kubernetes官网(https://kubernetes.io/docs/concepts/services-networking/network-policies/#behavior-of-to-and-from-selectors)中的例子来回顾下前面的知识。

首先该规则指定了命名空间为 default, 选择了其中所有包含 `role=db` 这个 label 的 Pod,定义了入站流量规则与出站流量规则。

对于入站流量,放行源地址来自 cidr 172.17.0.0/16 除了 172.17.1.0/24 之外的流量,放行来自有`project=myproject` 这个label的namespace中的流量,放行 default 命名空间下有 label `role=frontend` 的 Pod 的流量,并限定这些流量只能访问到 `role=db` 这个 label 的 Pod 的 TCP 6379端口。

对于出站流量,只放行其访问目的地址属于 cidr 10.0.0.0/24 中,且端口为 TCP 5978的流量。

需要注意的是 NetworkPolicy 选中的 Pod 只能是与 NetworkPolicy 同处一个 namespace 中的 Pod,因此对于有些规则可能需要在多个命名空间中分别设置。或者使用非原生的网络策略定义,例如 Calico 中的 [GlobalNetworkPolicy](https://docs.projectcalico.org/v3.7/reference/calicoctl/resources/globalnetworkpolicy)。

 

NetworkPolicy 变更历史

v1.6 以及以前的版本需要在 kube-apiserver 中开启 extensions/v1beta1/networkpolicies;

v1.7 版本 Network Policy 已经 GA,API 版本为 networking.k8s.io/v1;

v1.8 版本新增 Egress 和 IPBlock 的支持;

附录

– 推荐观看[Securing Cluster Networking with Network Policies – Ahmet Balkan, Google](https://www.youtube.com/watch?v=3gGpMmYeEO8)

– 一些常见的策略样例[ahmetb/kubernetes-network-policy-recipes](https://github.com/ahmetb/kubernetes-network-policy-recipes)

相关文章

KubeSphere 部署向量数据库 Milvus 实战指南
探索 Kubernetes 持久化存储之 Longhorn 初窥门径
征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
那些年在 Terraform 上吃到的糖和踩过的坑
无需 Kubernetes 测试 Kubernetes 网络实现
Kubernetes v1.31 中的移除和主要变更

发布评论