如何在不禁用到 Kubernetes pods 的外部流量的情况下使用 NetworkPolicy 在命名空间中隔离 pods

How can I isolate pods in namespace using NetworkPolicy without disabling external traffic to Kubernetes pods

我正在尝试将命名空间中的 pods 与其他命名空间隔离开来。我试图创建一个 NetworkPolicy:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-from-other-namespaces
spec:
  podSelector:
    matchLabels:
  ingress:
  - from:
    - podSelector: {}

此 NetworkPolicy 成功地将我的命名空间中的 pods 与另一个命名空间隔离开来。但是,一旦应用此策略,就会禁用这些 pods 的所有外部流量。有什么方法可以只阻止来自其他名称空间的流量并允许所有外部流量进入 pods.

您应用的 NetworkPolicy 正在阻止来自每个来源的流量。

您可以在定义中添加授权的 CIDR 块:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: example-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
  policyTypes:
  - Ingress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16

使用 kubernetes networkPolicy 我认为不可能在允许所有外部流量的同时拒绝 pods 之间的通信。这是因为 kubernetes networkPolicy 资源没有显式拒绝规则的概念。我会调整您的方法或考虑另一个具有拒绝规则的网络策略(例如 Calico)。

解法:

apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
  name: deny-other-namespaces
  namespace: prod
spec:
  selector: all()
  types:
  - Ingress
  - Egress
  ingress:
  - action: Deny
    protocol: TCP
    source:
      namespaceSelector: name == 'dev'
  - action: Allow
  egress:
  - action: Allow

您可以确保为 NetworkPolicy 资源命名空间并将 ingress/egress 限制为仅命名空间。

apiVersion: extensions/v1beta1
kind: NetworkPolicy
metadata:
  name: onlywithinnamespace
  namespace: mynamespace
spec:
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          role: mynamespace
    - podSelector: {}
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          role: mynamespace
    - podSelector: {}
  podSelector:
    matchLabels:
  policyTypes:
  - Ingress
  - Egress

确保您的命名空间具有匹配的正确标签:

apiVersion: v1
kind: Namespace
metadata:
  labels:
    role: mynamespace
  name: mynamespace

您可以允许所有流量但阻止来自内部网络的流量。

下面的网络策略允许访问除内部网络(192.168.0.0/16 和 172.23.40.0/24)之外的所有网络

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
   name: allow-external
   namespace: dmz
spec:
  podSelector: {}
  policyTypes:
  - Egress
  - Ingress
  egress:
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
        except:
        - 192.168.0.0/16
        - 172.23.42.0/24
    - namespaceSelector:
         matchLabels:
           name: dmz