我已经从here在EKS上安装了Calico。
我有两个名称空间,foo和bar,这两个名称空间都标有“purpose”标签,每个都包含一个应用程序pod。
当我将以下Ingress only策略导入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条目破坏了它。
群集上没有其他网络策略。
如果没有直接明显的原因来解释为什么会发生这种情况;除了在worker节点上搜索netfilter规则之外:有没有什么有效的方法来调试它?
发布于 2020-03-02 23:31:22
我不认为你写的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 - ahmetb/kubernetes-network-policy-recipes和Declare Network Policy上查看入口和出口的一些很好的例子。
发布于 2020-03-01 23:16:39
您的上一个网络策略同时解决了出口和入口问题。我会把出口和入口分成两个不同的yaml文件(如果有几个不同的入口/出口策略,我也会把它们分成不同的文件),然后一个接一个地应用它们。这种方式更容易阅读。另外,如果您使用拒绝规则,我会先应用它,然后再应用其他规则。
https://stackoverflow.com/questions/60471173
复制相似问题