istio - 无法使用拒绝所有 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 和命名空间,它就可以工作。所以我想我只是错过了命名空间中的其他一些入口,有没有办法将它限制为负载均衡器?
解决方案
首先,您的allow-istio-system-to-ns
yaml 中有一个错字:
namespaceSelector: projectcalico.org/namespace == 'istio-system
'
该行的末尾应该有另一个。
其次,这可能是由于 istio 版本中策略和混合器的更改引起的1.5
。
根据Istio文档:
混合器策略在 Istio 1.5 中已弃用,不推荐用于生产环境。
速率限制:考虑使用 Envoy 原生速率限制 而不是混合器速率限制。Istio 将通过 Istio 扩展 API 添加对本机速率限制 API 的支持。
控制标头和路由:考虑使用 Envoy
ext_authz
过滤器、lua
过滤器或使用Envoy-wasm
沙箱编写过滤器 。拒绝和白/黑名单:请使用 授权策略 对工作负载实施访问控制。
istio 文档中有一个指南,它允许重新启用折旧的功能:
- 检查网格的策略执行状态。
$ kubectl -n istio-system get cm istio -o jsonpath="{@.data.mesh}" | grep disablePolicyChecks disablePolicyChecks: true
如果启用了策略实施(
disablePolicyChecks
为 false),则不需要进一步的操作。
- 更新
istio
配置以启用策略检查。从 Istio 根目录执行以下命令:
$ istioctl manifest apply --set values.global.disablePolicyChecks=false --set values.pilot.policy.enabled=true configuration "istio" replaced
- 验证策略实施现在已启用。
$ 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
希望能帮助到你。
推荐阅读
- node.js - 将 Sequelize 原始查询绑定到模型
- php - 在管理区域中的 WooCommerce 下方添加自定义链接作为子菜单
- java - 将参数传递给 jpa 转换器
- javascript - Discord.js 的角色反应
- python-3.x - Python如何创建一个按钮矩阵并将其放在我的一个框架内
- python - sqlalchemy 中自我引用的一对多父子模型上的 hybrid_property "is_parent"
- scala - 过滤导致 Spark 中数据类型解析问题的行
- authentication - 收到登录消息时,QuickFix 启动器应用程序注销
- x86 - 英特尔架构中的锁语义
- java - mvn jetty:运行失败原因:java.lang.RuntimeException:错误扫描条目META-INF/versions/9/javax/xml/bind/ModuleUtil.class