流量管理的常见问题

怎样查看在 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 可以与 StatefulSet 和 Headless Service 一起使用吗?

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

为什么我的 CORS(跨源资源共享)配置不起作用?

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

要弄明白这个问题,有必要退后一步,看看 CORS 是什么, 以及何时应该使用它。默认情况下,浏览器对脚本发起的 “cross origin” 请求有限制。 例如,这可以防止网站 attack.example.com 向 bank.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-* 头;如果响应不令人满意, 则由客户端(浏览器)来拒绝请求。在浏览器中, 这是通过预检请求来完成的。

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

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

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

然而,这下面的规则将不工作,因为它们在 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.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 还为其他协议(如 http 和 mysql) 提供路由和指标等功能。

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