Kubernetes入口网络策略按预期工作,出口阻止所有流量

时间:2020-03-01 01:20:37

标签: kubernetes eks calico kubernetes-networkpolicy

我已经从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规则进行拖网之外:是否有任何有效的方法来调试它?

2 个答案:

答案 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-recipesDeclare Network Policy

答案 1 :(得分:-1)

您的最后一个网络策略同时针对出口和入口。我会将Egress和Ingress分成两个不同的yaml文件(如果有几个不同的Ingress / Egress策略,我也会将它们分为不同的文件),然后将它们一一应用。这样更容易阅读它们。另外,如果您使用拒绝规则,我会先应用它,然后再应用其他规则。