Kubernetes NetworkPolicy,仅允许来自相同名称空间和ALB入口的流量

时间:2020-06-06 22:27:28

标签: amazon-web-services kubernetes kubernetes-ingress kubernetes-networkpolicy

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

AWS ALB Ingress是在同一NameSpace下创建的,因此我认为仅使用DENY all traffic from other namespaces就足够了,但是当我使用来自ALB Ingress Load Balancer的流量(其内部IP地址与豆荚)。然后,如果我添加ALLOW traffic from external clients,它允许进入,但ALSO也允许其他名称空间。

所以我的示例就像:(这不能按预期工作)

---
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 Ingress被阻止,添加第二个其他名称空间也被允许,这也是我所不希望的。我只能允许AWS ALB Ingress的内部IP地址,但是它可以随时间变化并且是动态创建的。

1 个答案:

答案 0 :(得分:1)

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

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

最后,答案取决于CNI插件的实现,AWS如何根据Kubernetes网络进行ALB以及CNI插件如何处理。除了询问CNI提供者(或其文档)之外,没有简单的答案。