首页 > 解决方案 > Kubernetes Ingress 网络策略按预期工作,egress 阻塞了所有流量

问题描述

我已经从这里在 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 规则之外:有没有有效的方法来调试这个?

标签: kubernetesamazon-ekscalicokubernetes-networkpolicy

解决方案


我不认为你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 的一些很好的示例。


推荐阅读