我有一项服务,我希望能够访问互联网和其他吊舱。然而,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:
- {}
我希望这能有所帮助。你可以在这里阅读更多关于政策的信息。