限制 pods 在名称空间和端口内的通信的网络策略

Network policy to restrict communication of pods within namespace and port

命名空间 1:arango

命名空间 2:apache - 8080

要达到的标准:

策略不应允许未在端口 8080 上侦听的 pods

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

以下入口是否有助于实现此目的?或者是否必须添加出口,因为有规则拒绝其他命名空间 pods 和 8080 以外的端口?

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

您当前的配置

您当前的配置允许流量从 pods 到 pods 的 default namespace 中带有标签 app: arango 的流量 port: 8080 ] 在 default namespace

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

问题

or is it manadtory to add egress as there are rules to deny other namespace pods and ports except 8080?

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

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

The policyTypes field indicates whether or not the given policy applies to ingress traffic to selected pod, egress traffic from selected pods, or both. If no policyTypes are specified on a NetworkPolicy then by default Ingress will always be set and Egress will be set if the NetworkPolicy has any egress rules.

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

您想应用两个主要规则:

The policy should not allow pods which are not listening in port 8080

如果您只想将其用于入口流量,它看起来像:

  ingress:
  - from:
    ports:
    - protocol: <protocol>
      port: 8080

The policy Should not allow pods from any other namespace except "arango"

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

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

请求网络策略

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

在下面的示例中,只有当它们来自带有标签 app: apache 的 pod 时,才允许进入带有 arango namespace 标签 app: arango 的 pods 的传入流量,正在侦听 port: 8080 并部署在 arango 命名空间中。

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

有用链接:

Guide to Kubernetes Ingress Network Policies

Get started with Kubernetes network policy

如果这个答案没有解决您的问题,请clarify/provide详细说明它应该如何工作,我会编辑答案。