0

我已经从这里在 EKS 上安装了 Calico 。

我有两个命名空间,foo 和 bar,都标有“目的”标签,并且每个都包含一个应用程序 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在出口中添加条目会破坏它。

集群上没有其他网络策略。

如果没有直接明显的原因说明为什么会发生这种情况;除了在工作节点上搜索 netfilter 规则之外:有没有有效的方法来调试这个?

4

2 回答 2

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。您可以阅读一篇非常不错的 Kubernetes 网络策略简介,供安全人员使用

如果这仍然是一个问题,请提供有关运行 pod 的位置的详细信息,以及您想要实施的规则。

您还可以在 GitHub - ahmetb/kubernetes-network-policy-recipesDeclare Network Policy中查看 Ingress 和 Egress 的一些很好的示例。

于 2020-03-02T15:31:21.913 回答
-1

您的最后一个网络策略同时解决了 Egress 和 Ingress。我会将 Egress 和 Ingress 拆分为两个不同的 yaml 文件(如果有多个不同的 Ingress/Egress 策略,我也会将它们拆分为不同的文件),并且我会一一应用它们。这种方式更容易阅读。另外,如果您使用拒绝规则,我会先应用它,然后再应用其他规则。

于 2020-03-01T15:16:38.867 回答