流量管理常見問題
如何查看我使用 Istio 配置的目前路由規則?
可以使用 kubectl get virtualservice -o yaml
查看規則
邊車代理 (sidecar proxy) 在哪些埠上捕獲入站流量?
預設情況下,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 和無頭服務 (headless Services) 一起使用嗎?
可以,從 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
)提供路由和指標等功能。
如需所有協定列表,以及有關如何設定協定的資訊,請檢視協定選擇文件。