如何使用网络策略停止所有外部流量并仅允许名称空间内的内部Pod网络调用?

时间:2019-01-18 13:36:32

标签: kubernetes

我正在kubernetes集群中设置一个名称空间,以拒绝任何http://company.com之类的传出网络调用,但允许在http://my-nginx之类的名称空间中进行内部Pod通信,其中my-nginx是kubernetes服务指向到我的Nginx吊舱。

如何使用网络策略来实现这一目标。以下网络政策有助于阻止所有传出网络呼叫

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: deny-all-egress
  namespace: sample
spec:
  policyTypes:
  - Egress
  podSelector: {}

如何仅将内部Pod呼叫白名单?

3 个答案:

答案 0 :(得分:0)

我不确定是否可以使用Kubernetes NetworkPolicy做到这一点,但是可以通过启用Istio的Pod来实现。

注意:首先请确保在群集上安装了Istio。用于安装see

请参见来自Istio's documentation about Egress Traffic的引用。

  

默认情况下,启用Istio的服务无法访问外部URL   集群的原因,因为Pod使用iptables透明地重定向   到sidecar代理的所有出站流量,该代理仅处理   集群内目的地。

此外,您可以通过将ServiceEntryVirtualService添加到群集中来将群集外部的域列入白名单,例如Istio文档中的Configuring the external services

我希望它对您有用。

答案 1 :(得分:0)

使用网络策略,您可以将名称空间中的所有Pod列入白名单:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-egress-to-sample
  namespace: sample
spec:
  policyTypes:
  - Egress
  podSelector: {}
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          name: sample

您可能已经知道,应用了至少一个网络策略的Pod只能与应用到它们的任何网络策略所允许的目标进行通信。

名称实际上并不重要。选择器(在这种情况下为namespaceSelector和podSelector)仅关心标签。标签是与资源关联的键值对。上面的示例假定名为sample的命名空间的标签为name=sample

如果要将名为http://my-nginx的名称空间列入白名单,首先需要在名称空间中添加标签(如果还没有标签)。 name是一个很好的IMO密钥,值可以是服务的名称,在这种特殊情况下,http://my-nginx(不确定:/是否可以作为一部分)标签)。然后,只需在您的网络策略中使用它,就可以定位命名空间(用于入口或出口)

    - namespaceSelector:
        matchLabels:
          name: http://my-nginx

如果您想允许与名为my-nginx的服务进行通信,则该服务的名称实际上并不重要。您需要使用podSelector选择目标容器,这应该使用服务用来知道属于哪个容器的标签来完成。检查您的服务以获取标签,然后使用网络策略中的key: value。例如,对于role = nginx的键=值对,您应该使用

    - podSelector:
        matchLabels:
          role: nginx

答案 2 :(得分:0)

这可以使用以下网络策略组合来完成:

# The same as yours
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: deny-all-egress
  namespace: sample
spec:
  policyTypes:
  - Egress
  podSelector: {}
---
# allows connections to all pods in your namespace from all pods in your namespace
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-namespace-egress
  namespace: sample
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - podSelector:
        matchLabels: {}
---
# allows connections from all pods in your namespace to all pods in your namespace
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-namespace-internal
  namespace: sample
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels: {}

假设您的网络策略实施实现了完整规范。