Kubernetes 出口网络策略不适用于所选的 pod
Kubernetes Egress Network Policy is not working on a pod selected
我在 kube 集群上设置出口网络策略时遇到了一个奇怪的问题。
基本上我希望我的 pod A 只访问 pod B。
我有两个 pods:
- 你好-k8s-部署
- nginx
hello-k8s-deploy pod 通过 NodePort 在端口 8080
上公开了一个 API。
我的 nginx pod 只是一个访问 API.
的图像
所以让我们尝试登录到 nginx pod 并访问 hello-k8s-deploy pod 公开的 API。
以上显示 API 回复的消息以 Hello K8s!
开头
现在让我们在我的 nginx pod 上应用网络策略,这样它就只能访问这个 API,没有别的。
网络策略:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: app
spec:
podSelector:
matchLabels:
run: nginx
egress:
- to:
- podSelector:
matchLabels:
app: hello-k8s-deploy
policyTypes:
- Egress
以上政策将应用于标签为 run: nginx
的广告连播
并且规则是允许流量流向带有标签 app: hello-k8s-deploy
的 pod
让我们通过查看 pods nginx 和 hello-k8s-deploy
的定义来验证它
nginx:
hello-k8s-deploy
我们可以看到两个标签都符合网络策略。
在我应用网络策略并再次访问 nginx 后,我希望能以同样的方式工作并从 API 获得响应,但我收到以下错误。
注意:
- 所有资源都在同一个命名空间中
app
- 我的网络插件是 weave-net,根据文档支持网络策略。
- 我什至尝试指定名称空间选择器并添加端口 8080。
我终于解决了这个问题,基本上我遇到的问题是could not resolve host hello-k8s-svc
。这意味着 k8s 正在尝试使用此主机连接并通过 dns 名称(服务名称)解析。
并且因为我的 pod 只允许出口到 hello-k8s-deploy,所以它失败了,因为它还需要连接到 kube-dns 来解析 dns。因此,在您应用出口之前,请确保您的命名空间中的 pod 或所有 pods 允许连接到 kube-dns 以进行 dns 解析。
修复只是为所有 pods 创建一个出口资源,以连接到 pod 特定出口配置之上的 kube-dns。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all-egress
spec:
podSelector: {}
egress:
- to:
- namespaceSelector:
matchLabels:
networking/namespace: kube-system
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- protocol: TCP
port: 53
- protocol: UDP
port: 53
policyTypes:
- Egress
在我的例子中,我标记了 kube-system 命名空间:
kubectl label namespace kube-system networking/namespace=kube-system
我在 kube 集群上设置出口网络策略时遇到了一个奇怪的问题。
基本上我希望我的 pod A 只访问 pod B。
我有两个 pods:
- 你好-k8s-部署
- nginx
hello-k8s-deploy pod 通过 NodePort 在端口 8080
上公开了一个 API。
我的 nginx pod 只是一个访问 API.
所以让我们尝试登录到 nginx pod 并访问 hello-k8s-deploy pod 公开的 API。
以上显示 API 回复的消息以 Hello K8s!
现在让我们在我的 nginx pod 上应用网络策略,这样它就只能访问这个 API,没有别的。
网络策略:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: app
spec:
podSelector:
matchLabels:
run: nginx
egress:
- to:
- podSelector:
matchLabels:
app: hello-k8s-deploy
policyTypes:
- Egress
以上政策将应用于标签为 run: nginx
并且规则是允许流量流向带有标签 app: hello-k8s-deploy
让我们通过查看 pods nginx 和 hello-k8s-deploy
的定义来验证它nginx:
hello-k8s-deploy
我们可以看到两个标签都符合网络策略。
在我应用网络策略并再次访问 nginx 后,我希望能以同样的方式工作并从 API 获得响应,但我收到以下错误。
注意:
- 所有资源都在同一个命名空间中
app
- 我的网络插件是 weave-net,根据文档支持网络策略。
- 我什至尝试指定名称空间选择器并添加端口 8080。
我终于解决了这个问题,基本上我遇到的问题是could not resolve host hello-k8s-svc
。这意味着 k8s 正在尝试使用此主机连接并通过 dns 名称(服务名称)解析。
并且因为我的 pod 只允许出口到 hello-k8s-deploy,所以它失败了,因为它还需要连接到 kube-dns 来解析 dns。因此,在您应用出口之前,请确保您的命名空间中的 pod 或所有 pods 允许连接到 kube-dns 以进行 dns 解析。
修复只是为所有 pods 创建一个出口资源,以连接到 pod 特定出口配置之上的 kube-dns。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all-egress
spec:
podSelector: {}
egress:
- to:
- namespaceSelector:
matchLabels:
networking/namespace: kube-system
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- protocol: TCP
port: 53
- protocol: UDP
port: 53
policyTypes:
- Egress
在我的例子中,我标记了 kube-system 命名空间:
kubectl label namespace kube-system networking/namespace=kube-system