流量管理的常见问题
怎样查看在 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
)
提供路由和指标等功能。
对于所有协议列表以及协议配置信息, 请查看文档协议选择。