流量管理常见问题解答

如何查看我使用 Istio 配置的当前路由规则?

可以使用 kubectl get virtualservice -o yaml 查看规则

边车代理在哪些端口捕获入站流量?

Istio 默认捕获所有端口上的入站流量。您可以使用 traffic.sidecar.istio.io/includeInboundPorts pod 注释来指定要捕获的端口的显式列表,或使用 traffic.sidecar.istio.io/excludeOutboundPorts 来指定要绕过的端口列表,来覆盖此行为。

MUTUAL 和 ISTIO_MUTUAL TLS 模式有什么区别?

这两种 DestinationRule 设置都将发送双向 TLS 流量。使用 ISTIO_MUTUAL 时,Istio 证书将自动使用。对于 MUTUAL,必须配置密钥、证书和受信任的 CA。这允许与非 Istio 应用程序启动双向 TLS。

Istio 可以与 StatefulSets 和无头服务一起使用吗?

是的,从 Istio 1.10 开始,Istio 完全支持这些工作负载。

我可以使用标准的 Ingress 规范,而无需任何路由规则吗?

简单的 Ingress 规范,使用主机、TLS 和基于精确路径的匹配,将开箱即用,无需路由规则。但是,请注意,Ingress 资源中使用的路径不应包含任何 . 字符。

例如,以下 Ingress 资源匹配针对 example.com 主机的请求,其 URL 为 /helloworld。

$ kubectl create -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-ingress
  annotations:
    kubernetes.io/ingress.class: istio
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /helloworld
        pathType: Prefix
        backend:
          service:
            name: myservice
            port:
              number: 8000
EOF

但是,以下规则将不起作用,因为它们在路径中使用正则表达式,并且使用 ingress.kubernetes.io 注释

$ kubectl create -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: this-will-not-work
  annotations:
    kubernetes.io/ingress.class: istio
    # Ingress annotations other than ingress class will not be honored
    ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /hello(.*?)world/
        pathType: Prefix
        backend:
          service:
            name: myservice
            port:
              number: 8000
EOF
为什么我的 CORS 配置不起作用?

在应用 CORS 配置 后,您可能会发现似乎没有任何变化,并想知道哪里出了问题。CORS 是一个常见的误解的 HTTP 概念,在配置时经常导致混淆。

要理解这一点,有助于退一步看看 什么是 CORS 以及何时应该使用它。默认情况下,浏览器对脚本发起的“跨域”请求有限制。例如,这将阻止网站 attack.example.combank.example.com 发出 JavaScript 请求并窃取用户的敏感信息。

为了允许此请求,bank.example.com 必须允许 attack.example.com 执行跨域请求。这就是 CORS 发挥作用的地方。如果我们在启用 Istio 的集群中提供 bank.example.com,我们可以配置一个 corsPolicy 来允许此请求

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: bank
spec:
  hosts:
  - bank.example.com
  http:
  - corsPolicy:
      allowOrigins:
      - exact: https://attack.example.com
...

在这种情况下,我们明确地允许单个来源;通配符对于非敏感页面很常见。

完成此操作后,一个常见的错误是发送像 curl bank.example.com -H "Origin: https://attack.example.com" 这样的请求,并期望请求被拒绝。但是,curl 和许多其他客户端将不会看到被拒绝的请求,因为 CORS 是浏览器的约束。CORS 配置只是在响应中添加 Access-Control-* 标头;如果响应不令人满意,则由客户端(浏览器)来拒绝请求。在浏览器中,这是通过 预检请求 完成的。

Istio 支持哪些协议?

目前,Istio 支持基于 TCP 的协议。此外,Istio 还为其他协议(如 httpmysql)提供路由和指标等功能。

有关所有协议的列表以及如何配置协议的信息,请查看 协议选择 文档。