【发布时间】:2022-12-09 20:23:24
【问题描述】:
我正在使用 ingress-nginx v1.3.0(与 Helm chart v4.2.3 一起安装)作为 DigitalOcean 的 Kubernetes 上的负载均衡器。在 Kubernetes 集群中,我正在运行 istio v1.15.0 服务网格。网格在对等身份验证 mTLS 模式设置为“严格”的情况下运行(需要正确加密流量)。
我能够成功地将 nginx 与 istio 服务网格连接起来以获取 HTTP/HTTPS 流量,但我没有找到如何对 TCP 流量执行相同操作的方法。
当 nginx 转发 HTTP 流量时,它可以直接将它发送到 K8s pod(这是默认行为),或者它可以配置为使用 nginx.ingress.kubernetes.io/service-upstream: "true" 和 nginx.ingress.kubernetes.io/upstream-vhost: "..." 对象上的注释 nginx.ingress.kubernetes.io/service-upstream: "true" 和 nginx.ingress.kubernetes.io/upstream-vhost: "..." 对象(如记录here)。
如果没有这些注释,nginx pod 上的 istio 的 Envoy sidecar 会将指向上游 pod 的流量视为网状流量(它将流量发送到PassthroughCluster)并且不会正确加密,因此上游 Envoy sidecar 不会由于 mTLS 模式设置为“严格”而接受流量。通过注释,Envoy 将流量识别为网状流量并对其进行正确加密。
我正在尝试为 TCP 流量解决同样的问题。似乎 nginx 将 TCP 流量直接发送到 pod,与 HTTP/HTTPS 流量的默认行为相同(= 未设置注释时)。但是,TCP 流量转发未在 Ingress 对象中定义,因此无法应用上述注释。如上所述,这会导致 TCP 流量在未加密的情况下通过,并且上游 Envoy 最终将其丢弃。
一种解决方案是指示 nginx 将 TCP 流量发送到服务端点,就像使用 HTTP/HTTPS 流量一样。但是,我找不到任何方法来实现这一目标。
也许另一种解决方案是告诉 istio 将 pod 到 pod 的流量(而不是 pod 到服务到 pod 的流量)也视为网格流量,指示 Envoy 也对其进行加密。
有什么想法可以在将 mTLS 设置保持为 STRICT 的同时实现这一目标吗?更具体地说,加密流量对我来说是必须的,因此我不能接受将更改 mTLS 设置作为解决方案。
谢谢!
【问题讨论】:
-
我还在
ingress-nginx项目的 Github 问题跟踪器中问了这个问题:github.com/kubernetes/ingress-nginx/issues/9060。如果有人知道如何访问他们的 Slack 以获得更好的支持,我将不胜感激一些提示。谢谢!
标签: kubernetes istio nginx-ingress mtls istio-sidecar