流量管理常見問題

如何查看我使用 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.combank.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 還為其他協定(例如 httpmysql)提供路由和指標等功能。

如需所有協定列表,以及有關如何設定協定的資訊,請檢視協定選擇文件。