【问题标题】:How can I isolate pods in namespace using NetworkPolicy without disabling external traffic to Kubernetes pods如何在不禁用到 Kubernetes pod 的外部流量的情况下使用 NetworkPolicy 隔离命名空间中的 pod
【发布时间】:2020-10-25 19:52:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: kubernetes kubernetes-ingress kubernetes-networkpolicy kubernetes-networking


    【解决方案1】:

    使用 kubernetes networkPolicy 我认为在允许所有外部流量的同时拒绝 Pod 之间的通信是不可能的。这是因为 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
    

    【讨论】:

    • @odenSon,我尝试过 calico network Policy,但遗憾的是它对我不起作用。
    • @Pratheesh 可以分享一下你使用的calico NetworkPolicy资源yaml吗?
    • apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: allow-ns namespace: dev spec: selector: all() ingress: - action: Allow protocol: TCP source: selector: all( ) - 动作:允许来源:nets: - 0.0.0.0/0
    【解决方案2】:

    您应用的 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
    

    【讨论】:

    • 是的,我试图在我的策略中添加一个 cidr。但这将允许来自该特定 cidr 的流量,如果我们给 cidr 像 0.0.0.0/0 ,所有流量都会被路由到包括流量在内的 Pod从另一个命名空间..
    • 0.0.0.0/0 允许来自每个来源的流量,请使用负载均衡器的 CIDR 块。
    【解决方案3】:

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

    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
    

    【讨论】:

    • ,这将允许来自该特定命名空间的流量对吗? .根据我的第一个条件,这是正确的。但我也试图允许所有外部流量。此方法阻止所有外部流量
    • 外部流量来自哪里?
    • 通过 NodePort 的外部流量。就像尝试使用 NodePort 公开我的一项服务,并尝试通过 nodeport 访问该服务一样,它不会将该流量传递给我的服务
    • 如果外部流量来自负载均衡器,您可以在同一策略上允许负载均衡器的 cidr 范围内的入口。
    【解决方案4】:

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

    下面的网络策略允许访问除内部网络(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
    

    【讨论】:

      猜你喜欢
      • 2022-06-28
      • 2021-07-05
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 2021-07-16
      • 2021-01-17
      • 1970-01-01
      • 2021-07-02
      相关资源
      最近更新 更多