限制命名空间和端口内 Pod 通信的网络策略

时间:2021-01-05 08:02:51

标签: kubernetes kubernetes-networkpolicy

命名空间 1:arango

命名空间 2:apache - 8080

要达到的标准:

该策略不应允许不在端口 8080 中侦听的 Pod

该策略不应允许来自除“arango”之外的任何其他命名空间的 pods

以下入口是否有助于实现这一目标?还是必须添加出口,因为有规则可以拒绝除 8080 之外的其他命名空间 pod 和端口?

apiVersion: networking.k8s.io/v1
metadata:
  name: access-nginx
spec:
  podSelector:
    matchLabels:
      app: arango
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: apache
    ports:
    - protocol: TCP
      port: 8080

1 个答案:

答案 0 :(得分:1)

您当前的配置

您当前的配置允许流量从 app: arango 上的 default namespace 中带有标签 port: 8080 的 Pod 从 app: apache 中具有标签 default namespace 的 Pod 传输

它将适用于 default namespace,因为您没有指定它。如果未定义 namespace,Kubernetes 始终使用 default 命名空间。

问题

<块引用>

还是必须添加出口,因为有规则可以拒绝除 8080 之外的其他命名空间 pod 和端口?

这取决于您的要求,如果您想过滤从 Pod 到外部、从外部到 Pod 或两者的流量。 Network Policy Resource 文档中对此进行了很好的描述。

NetworkPolicynamespaced resource,因此它将在创建它的命名空间中运行。如果您想允许另一个 namespaces,您应该使用 namespaceSelector

<块引用>

policyTypes 字段指示给定的政策是否适用于 ingress traffic to selected podegress traffic from selected pods 或两者。如果在 NetworkPolicy 上未指定 policyTypes,则默认情况下将始终设置 Ingress,如果 NetworkPolicy 有任何出口规则,则将设置 Egress。

总而言之,ingress 流量是从外部到您的 Pod,而 egress 是从您的 Pod 到外部。

您想应用两个主要规则:

<块引用>

该策略不应允许不在端口 8080 中侦听的 Pod

如果您只想将其用于入口流量,则如下所示:

  ingress:
  - from:
    ports:
    - protocol: <protocol>
      port: 8080
<块引用>

该策略不应允许来自除“arango”之外的任何其他命名空间的 pods

请记住,NetworkPolicynamespaced resource,因此它可以在创建的 Namespace 中工作。它应该在 metadata.namespace

中指定
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy
  namespace: arango
spec:
...

请求的网络政策

我已在启用网络策略的 GKE 集群上对此进行了测试。

在下面的示例中,只有当传入流量来自标签为 app: arango 的 pod,正在侦听 arango namespace 并且是部署在 app: apache 命名空间中。

port: 8080

有用的链接:

Guide to Kubernetes Ingress Network Policies

Get started with Kubernetes network policy

如果这个答案没有解决您的问题,请澄清/提供更多详细信息它应该如何工作,我将编辑答案。