Nginx Kubernetes出口网络策略在选定的pod上不起作用
我在kube集群上设置出口网络策略时遇到了一个奇怪的问题 基本上我只想让我的A舱进入B舱 我有两个豆荚:Nginx Kubernetes出口网络策略在选定的pod上不起作用,nginx,kubernetes,weave,Nginx,Kubernetes,Weave,我在kube集群上设置出口网络策略时遇到了一个奇怪的问题 基本上我只想让我的A舱进入B舱 我有两个豆荚: hello-k8s-deploy nginx hello-k8s-deploy pod通过NodePort在端口8080上公开API。 我的nginx pod只是一个访问API的映像 因此,让我们尝试登录到nginx pod并访问hello-k8s-deploy pod公开的API 上面显示了API的响应消息以Hello K8s开始 现在,让我们在我的nginx pod上应用网络策略,以便
8080
上公开API。
我的nginx pod只是一个访问API的映像
因此,让我们尝试登录到nginx pod并访问hello-k8s-deploy pod公开的API
上面显示了API的响应消息以Hello K8s开始代码>
现在,让我们在我的nginx pod上应用网络策略,以便它只能访问此API,而不能访问其他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
上述策略将应用于带有标签的podrun:nginx
规则是允许流量通过标签app:hello-k8s-deploy
让我们通过查看pods nginx和hello-k8s-deploy的定义来验证它
nginx:
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
hello-k8s-deploy
正如我们所看到的,两个标签都与网络策略相匹配
在我应用了网络策略并再次访问nginx之后,我希望能以同样的方式工作,并从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
所有资源都位于同一名称空间app
我的网络插件是weave net,它根据文档支持网络策略
我甚至尝试指定名称空间选择器并添加端口8080
我终于解决了这个问题,基本上我遇到的问题是无法解决主机hello-k8s-svc
。这意味着k8s正在尝试使用此主机进行连接,并通过dns名称(服务名称)进行解析
由于我的pod只允许hello-k8s-deploy的出口,所以它失败了,因为它还需要连接到kube dns来解析dns。因此,在应用出口之前,请确保命名空间中的pod或所有pod都允许连接到kube dns进行dns解析
修复方法只是为所有吊舱创建一个出口资源,以便在吊舱特定出口配置的基础上连接到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系统名称空间标记为:
kubectl label namespace kube-system networking/namespace=kube-system
我终于解决了这个问题,基本上我遇到的问题是无法解决主机hello-k8s-svc
。这意味着k8s正在尝试使用此主机进行连接,并通过dns名称(服务名称)进行解析
由于我的pod只允许hello-k8s-deploy的出口,所以它失败了,因为它还需要连接到kube dns来解析dns。因此,在应用出口之前,请确保命名空间中的pod或所有pod都允许连接到kube dns进行dns解析
修复方法只是为所有吊舱创建一个出口资源,以便在吊舱特定出口配置的基础上连接到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系统名称空间标记为:
kubectl label namespace kube-system networking/namespace=kube-system