【问题标题】:Kubernetes Ingress network policy working as expected, egress is blocking all trafficKubernetes Ingress 网络策略按预期工作,egress 阻塞了所有流量
【发布时间】:2020-06-13 16:56:30
【问题描述】:

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

【问题讨论】:

  • 您的 yaml 错误。你为什么打开0.0.0.0/0?与不创建NetworkPolicy 相同。我不知道为什么它有时会阻塞,因为它不应该。

标签: kubernetes amazon-eks calico kubernetes-networkpolicy


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-07-09
      • 2021-10-03
      • 2019-02-04
      • 2022-01-23
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 2020-11-21
      相关资源
      最近更新 更多