我正在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代理的所有出站流量,该代理仅处理集群内目的地。
此外,您可以通过将ServiceEntry
和VirtualService
添加到集群中,将集群外的域列入白名单,例如Istio文档中的配置外部服务。
我希望它能对你有用。