如何使用网络策略停止所有外部流量并只允许命名空间内的pod间网络调用



我正在kubernetes集群中设置一个命名空间,以拒绝任何传出的网络调用,如http://company.com但是允许在我的命名空间中进行pod间通信http://my-nginx其中我的nginx是一个指向nginx pod的kubernetes服务。

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

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

如何只将吊舱间呼叫列入白名单?

使用网络策略,您可以将命名空间中的所有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选择目标pod,这应该使用与服务相同的标签来确定哪些pod属于它。检查您的服务以获取标签,并使用网络策略中的key: value。例如,对于role=nginx的key=value对,您应该使用

- podSelector:
matchLabels:
role: nginx

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

# 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: {}

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

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

注意:首先确保Istio已安装在您的集群上。有关安装,请参阅

请参阅Istio文档中关于出口流量的引用。

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

此外,您可以通过将ServiceEntryVirtualService添加到集群中,将集群外的域列入白名单,例如Istio文档中的配置外部服务。

我希望它能对你有用。

最新更新