流量管理的常见问题

怎样查看在 Istio 中已配置的当前路由规则?

可以使用这个命令查看 kubectl get virtualservice -o yaml

Sidecar 代理在哪些端口上截获入站流量?

Istio 默认截获所有端口的入站流量。 您可以通过 traffic.sidecar.istio.io/includeInboundPorts 这个 pod 注解指定一组端口来截获流量,或通过 traffic.sidecar.istio.io/excludeOutboundPorts 指定一组端口来放行流量,以更改这种默认行为。

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

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

Istio 可以与 StatefulSets 和 Headless Service 一起使用吗?

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

为什么我的 CORS 配置不起作用?

当应用了 CORS 配置后,您可能会发现看似什么也没发生,并想知道哪里出了问题。 CORS 是一个经常被误解的 HTTP 概念,在配置时经常会导致混淆。

要弄明白这个问题,有必要退后一步,看看 CORS 是什么,以及何时应该使用它。 默认情况下,浏览器对脚本发起的 “cross origin” 请求有限制。 例如,这可以防止网站 attack.example.combank.example.com 发出 JavaScript 请求,从而窃取用户的敏感信息。

为了允许这个请求, bank.example.com 必须允许 attack.example.com 执行跨源请求。 这就是 CORS 的作用所在。如果我们想在一个启用了 Istio 的集群内提供 bank.example.com 服务,我们可以通过配置一个 corsPolicy 来允许这样做:

apiVersion: networking.istio.io/v1beta1
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-* 头;如果响应不令人满意,则由客户端(浏览器)来拒绝请求。 在浏览器中,这是通过预检请求来完成的。

我可以不配置任何路由规则,使用 Ingress 的标准配置吗?

简单的 Ingress 规范开箱即用,通过 HostTLS 以及基本 Path 精确匹配就可以使用,无需配置路由规则。 请注意 Path 在使用 Ingress 资源时不应该有任何 . 字符。

比如,下面 Ingress 的资源匹配 Hostexample.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

然而,这下面的规则将不工作,因为它们在 Path 中使用了正则表达式,并且添加了 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
Istio 支持哪些协议?

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

对于所有协议列表以及协议配置信息,请查看文档协议选择