2

我正在尝试在 AWS EKS 下工作的 Kubernetes 上编写网络策略。我想要实现的是允许来自同一命名空间的 pod/pod 的流量,并允许从 AWS ALB Ingress 转发的外部流量。

AWS ALB Ingress 是在同一个 NameSpace 下创建的,所以我认为只使用DENY 来自其他命名空间的所有流量就足够了,但是当我使用来自 ALB Ingress 负载均衡器的流量时(其内部 IP 地址与 pod/豆荚)是不允许的。然后,如果我添加来自外部客户端的 ALLOW 流量,它允许进入,但也允许其他命名空间。

所以我的例子是这样的:(这不能按预期工作)

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-from-other-namespaces
  namespace: os
spec:
  podSelector:
    matchLabels:
  ingress:
  - from:
    - podSelector: {}

---

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-external
  namespace: os
spec:
  podSelector:
    matchLabels:
      app: nginx
      tier: prod
      customer: os
  ingress:
  - ports:
    - port: 80
    from: []

当使用第一个策略 ALB 入口被阻止时,添加第二个其他命名空间也被允许,这是我不想要的。我只能允许 AWS ALB Ingress 的内部 IP 地址,但它会随着时间的推移而变化,并且是动态创建的。

4

1 回答 1

1

根据(Kubernetes NetworkPolicy API)的设计,如果一个端点可以从外部访问,那么阻止它以访问其他命名空间是没有意义的。(毕竟它也可以从其他命名空间通过公共 LB 访问,因此为已经公开访问的端点设置内部防火墙是没有意义的。)早在设计这个 API 的那一天,这个是我被告知的。

但是,您可能会发现某些 CNI 插件(Calico、Cilium 等)提供的非标准 CRD API 具有取代“允许”的明确“拒绝”操作。他们可以解决你的问题。

最后,答案取决于 CNI 插件的实现、AWS 如何在 Kubernetes 网络方面执行 ALB 以及 CNI 插件如何处理。除了询问 CNI 提供商(或他们的文档)之外,没有简单的答案。

于 2020-06-07T18:27:49.457 回答