我已经从here在EKS上安装了Calico。
我有两个名称空间foo和bar,它们都标有“目的”标签,并且每个名称空间都包含一个应用程序容器。
当我将以下仅Ingress策略导入foo名称空间时,它的工作原理与预期完全相同;其他测试Pod无法连接到foo-app,但是bar-app可以连接。
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: foo
namespace: foo
spec:
podSelector:
matchLabels:
app: foo-app
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
purpose: bar
- from:
- ipBlock:
cidr: 0.0.0.0/0
ports:
- protocol: TCP
port: 53
- protocol: UDP
port: 53
但是,当我导入同时包含入口和出口规则的策略时,它将完全关闭到Pod的网络连接。我什至无法从bar-app ping foo-app pod IP。
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: foo
namespace: foo
spec:
podSelector:
matchLabels:
app: foo-app
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
purpose: bar
- from:
- ipBlock:
cidr: 0.0.0.0/0
ports:
- protocol: TCP
port: 53
- protocol: UDP
port: 53
egress:
- to:
- namespaceSelector:
matchLabels:
purpose: bar
- to:
- ipBlock:
cidr: 0.0.0.0/0
ports:
- protocol: TCP
port: 53
- protocol: UDP
port: 53
在删除并系统地重新添加了部分策略之后,肯定是在出口中添加了namespaceSelector
条目才能破坏它。
群集上没有其他网络策略。
如果没有直接明显的原因可以说明为什么会发生这种情况;除了在工作节点上通过netfilter规则进行拖网之外:是否有任何有效的方法来调试它?
答案 0 :(得分:1)
我认为您Network Policy
的书写正确。
我认为你应该改变
egress:
- to:
- namespaceSelector:
matchLabels:
purpose: bar
- to:
- ipBlock:
cidr: 0.0.0.0/0
ports:
- protocol: TCP
port: 53
- protocol: UDP
port: 53
到
egress:
- to:
- namespaceSelector:
matchLabels:
purpose: bar
- to:
ports:
- protocol: TCP
port: 53
- protocol: UDP
port: 53
这是因为您可能阻止了用于将服务名称解析为其IP地址的DNS。您可以阅读非常好的Introduction to Kubernetes Network Policies for Security People。
如果这仍然是一个问题,请提供有关在何处运行Pod的吊舱的详细信息,以及要实施的规则。
您还可以在GitHub上查看一些不错的Ingress和Egress示例-ahmetb/kubernetes-network-policy-recipes和Declare Network Policy。
答案 1 :(得分:-1)
您的最后一个网络策略同时针对出口和入口。我会将Egress和Ingress分成两个不同的yaml文件(如果有几个不同的Ingress / Egress策略,我也会将它们分为不同的文件),然后将它们一一应用。这样更容易阅读它们。另外,如果您使用拒绝规则,我会先应用它,然后再应用其他规则。