Kubernetes Network Policy通过service出口到pod



我有一些通过Kubernetes服务而不是通过pod IP相互通信的pod正在运行,现在我想使用网络策略锁定事情,但我似乎无法获得出口。

在这个场景中,我有两个pod:

  • sleeper,客户端
  • frontend,一个名为frontend-svc的服务背后的服务器,它将端口8080转发到pod端口80

运行在同一个命名空间:ns

sleeperpod中,我简单地在frontendpod中wget一个ping端点:

wget -qO- http://frontend-svc.ns:8080/api/Ping

这是我的出口策略:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-to-frontend-egress
namespace: ns
spec:
podSelector:
matchLabels:
app: sleeper
policyTypes:
- Egress
egress:
- to:
- podSelector:
matchLabels:
app: frontend

如你所见,没什么特别的;没有端口,没有名称空间选择器,每个pod只有一个标签选择器。

不幸的是,这破坏了我的ping:
wget: bad address 'frontend-svc.ns:8080'

然而,如果我检索pod的ip(使用kubectl get po -o wide)并直接与前端交谈,我确实得到一个响应:
wget -qO- 10.x.x.x:80/api/Ping(x显然被值取代)

我的直觉是,这与pod到Kube-dns的出口有关,所以我添加了另一个出口策略:

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

现在我不想麻烦确切的pod和端口,所以我允许所有的pod从ns命名空间出口到kube-systempod。

然而,这一点帮助也没有。更糟糕的是:这也破坏了pod ip之间的通信。

我在Azure Kubernetes上运行Calico网络策略。

知道是什么问题吗,因为我没有主意了。


在启动并运行之后,这里是DNS出口策略的更锁定版本:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-all-pods-dns-egress
namespace: ns
spec:
policyTypes:
- Egress
podSelector: {} 
egress:
- to:
- namespaceSelector:
matchLabels:
# This label was introduced in version 1.19, if you are running a lower version, label the kube-dns pod manually.
kubernetes.io/metadata.name: "kube-system"  
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- port: 53
protocol: UDP
- port: 53
protocol: TCP

我重新创建了您的部署和最终的网络策略(出口到kube-system的DNS解析)为我解决了这个问题。请确保在应用最后一个网络策略之后,测试到服务端口(8080)的连接,该端口是您在直接访问pod(80)时在wget命令中更改的。

由于网络策略管理起来很麻烦,我和我的团队想让它们的创建自动化,并开源一个你可能感兴趣的工具:https://docs.otterize.com/quick-tutorials/k8s-network-policies。

这是一种管理网络策略的方法,你可以在一个单独的、人类可读的资源中声明你的访问需求,并且标签为你即时完成。

最新更新