首页 > 解决方案 > 无法使用拒绝所有 GlobalNetworkPolicy 通过 Istio 连接到 EKS 上的应用程序

问题描述

我的设置:使用 Calico 和 Istio 1.5 运行 EKS 1.14。

试图让示例 bookinfo 使用特定的 NetworkPolicies 运行。

我应用了拒绝所有流量的 GlobalNetworkPolicy:

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: default-deny
spec:
  selector: all()
  types:
  - Ingress
  - Egress

我还为 Istio 添加了一个 GlobalNetworkPolicy 到命名空间和命名空间内的流量:

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: allow-istio-system-to-ns
spec:
  selector: all()
  namespaceSelector: istio-injection == 'enabled'
  types:
  - Ingress
  - Egress
  ingress:
  - action: Allow
    source:
      selector: all()
      namespaceSelector: projectcalico.org/namespace == 'istio-system'
  - action: Allow
    source:
      selector: all()
      namespaceSelector: istio-injection == 'enabled'
  egress:
  - action: Allow

和一个允许 istio 系统上的所有入口和出口的 NetworkPolicy

apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
  name: allow-istio-system-all
  namespace: istio-system
spec:
  selector: all()
  types:
  - Ingress
  - Egress
  ingress:
  - action: Allow 
  egress:
  - action: Allow

还有一个 NetworkPolicy 允许流量到端口 80 和 443 上的入口网关。我知道这个是多余的,但我希望将前一个减少到只有必要的入口。

apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
  name: allow-istio-ingress-on-80-443
  namespace: istio-system
spec:
  selector: app == 'istio-ingressgateway'
  ingress:
    - action: Allow
      protocol: TCP
      destination:
        ports:
          - 80
          - 443

还有一些其他不相关的 NetworkPolicies(访问 kube-dns、metrics-server)。部署bookinfo可以使用和不使用策略,并且与部署网关相同。

组件之间的连接有效(我可以执行到一个 pod 并连接到其他 pod)。但是,当我尝试使用策略通过网关访问产品页面时,我什么也得不到,而不是没有策略的情况下我得到的 HTML。

我是否错过了一些应该允许的流量?我应该为主节点或其他地方的负载均衡器制定策略吗?

编辑:如果我允许所有进入 istio-system 和命名空间,它就可以工作。所以我想我只是错过了命名空间中的其他一些入口,有没有办法将它限制为负载均衡器?

标签: istioamazon-ekskubernetes-networkpolicy

解决方案


首先,您的allow-istio-system-to-nsyaml 中有一个错字:

      namespaceSelector: projectcalico.org/namespace == 'istio-system

'该行的末尾应该有另一个。


其次,这可能是由于 istio 版本中策略和混合器的更改引起的1.5

根据Istio文档:

混合器策略在 Istio 1.5 中已弃用,不推荐用于生产环境。

istio 文档中有一个指南,它允许重新启用折旧的功能:

对于现有的 Istio 网格

  1. 检查网格的策略执行状态。
$ kubectl -n istio-system get cm istio -o jsonpath="{@.data.mesh}" | grep disablePolicyChecks
disablePolicyChecks: true

如果启用了策略实施(disablePolicyChecks 为 false),则不需要进一步的操作。

  1. 更新 istio 配置以启用策略检查。

从 Istio 根目录执行以下命令:

$ istioctl manifest apply --set values.global.disablePolicyChecks=false --set values.pilot.policy.enabled=true
configuration "istio" replaced
  1. 验证策略实施现在已启用。
$ kubectl -n istio-system get cm istio -o jsonpath="{@.data.mesh}" | grep disablePolicyChecks
disablePolicyChecks: false

请注意,在calico文档中,它说它需要以下 istio 版本:

Istio v1.0、v1.1、v1.2 或 v1.3

希望能帮助到你。


推荐阅读