流量管理常见问题解答
如何查看我使用 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.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-*
标头;如果响应不令人满意,则由客户端(浏览器)来拒绝请求。在浏览器中,这是通过 预检请求 完成的。
Istio 支持哪些协议?
目前,Istio 支持基于 TCP 的协议。此外,Istio 还为其他协议(如 http
和 mysql
)提供路由和指标等功能。
有关所有协议的列表以及如何配置协议的信息,请查看 协议选择 文档。