Kubernetes NetworkPolicy:阻止所有出口,尽管没有指定块



我有一项服务,我希望能够访问互联网和其他吊舱。然而,ALL egress规则似乎阻止了所有出口。

# No NetworkPolicies
kubectl -n mytestnamespace exec service-c-78f784b475-qsdqg -- bin/bash -c 'curl www.google.com'

没有NetworkPolicy,我的pod就可以访问互联网。接下来,我制定了一个允许出口到所有IP地址的Networkpolicy。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all
namespace: mytestnamespace
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0

但现在curl不能再上网了,但为什么??????

NetworkPolicies允许出口到所有IP

kubectl -n mytestnamespace exec service-c-78f784b475-qsdqg -- bin/bash -c 'curl www.google.com'

为什么此NetworkPolicy会阻止所有出口?毫无意义!

事实证明,尽管向所有IP地址开放,但网络策略不允许出口到另一个命名空间中的DNS pod。

# Identifying DNS pod
kubectl get pods -A | grep dns
# Identifying DNS pod label
kubectl describe pods -n kube-system coredns-64cfd66f7-rzgwk

接下来,我将dns标签添加到出口策略:

# network_policy.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-all
namespace: mytestnamespace
spec:
podSelector: {}
policyTypes:
- Egress
- Ingress
egress:
- to:
- ipBlock:
cidr: "0.0.0.0/0"
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: "kube-system"
- podSelector:
matchLabels:
k8s-app: "kube-dns"

我应用网络策略并测试curl调用:

# Setting up policy
kubectl apply -f network_policy.yaml
# Testing curl call
kubectl -n mytestnamespace exec service-c-78f784b475-qsdqg -- bin/bash -c 'curl www.google.com'

成功!现在我可以进行出口呼叫,接下来我只需要在专用网络中屏蔽适当的IP地址。

原因是curl试图与www.google.com上的HTTP服务器形成双向TCP连接。这意味着,出口和入口流量都需要在您的策略中被允许。目前,只允许对外交通。也许,如果您在详细模式下运行curl,您将能够更详细地看到这一点:

kubectl -n mytestnamespace exec service-c-78f784b475-qsdqg -- bin/bash -c 'curl www.google.com' -v

然后,您可以看到由箭头>(向外(和<(向内(标记的来回通信。您会注意到,只会列出>箭头,并且不会显示<流量。

注意:如果你做一些更简单的事情,比如ping google.com,它可能会起作用,因为这是一种简单的无状态通信。

为了做到这一点,你可以简单地在你的策略中添加一个允许所有入口的规则,比如:

ingress:
- {}

此外,还有一种更简单的方法可以允许所有出口流量,简单地说:

egress:
- {}

我希望这能有所帮助。你可以在这里阅读更多关于政策的信息。

最新更新