本文介紹定義的DestinationRule失效的問題現(xiàn)象、問題原因和解決方案。

問題現(xiàn)象

為服務部署DestinationRule后,使用客戶端調(diào)用服務,發(fā)現(xiàn)DestinationRule失效,調(diào)用服務失敗。

問題原因

ASM路由一個請求時,會根據(jù)固定查找過程查找DestinationRule去完成路由。如果您的DestinationRule部署在查找過程之外的命名空間,則DestinationRule會失效。查找過程如下所示:
  1. 從客戶端命名空間查找,即從發(fā)起調(diào)用的客戶端所在的命名空間查找是否存在相應的DestinationRule。
  2. 從服務命名空間查找,即從被調(diào)用的服務所在的命名空間查找是否存在相應的DestinationRule。
  3. 從ASM根命名空間(istio-system)查找,即從istio-system命名空間查找是否存在相應的DestinationRule。
例如,使用以下YAML文件在ns1命名空間中定義了myservice服務的DestinationRule。從host字段得知,myservice服務是部署在default命名空間。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: myservice
spec:
  host: myservice.default.svc.cluster.local
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100
  • 如果您在ns1命名空間發(fā)起對myservice服務的調(diào)用,由于myservice的DestinationRule也定義在ns1命名空間中,所以可以查找到可用于完成路由的DestinationRule,最終可以調(diào)通服務。
  • 如果您在ns2命名空間發(fā)起對myservice服務的調(diào)用,則對myservice服務的調(diào)用將會失敗。存在以下DestinationRule查找過程:
    1. 發(fā)起調(diào)用請求的客戶端位于ns2命名空間,因此會從ns2命名空間查找相應的DestinationRule,但是ns2命名空間中并不存在相應的DestinationRule,查找會失敗。
    2. 被調(diào)用的myservice服務是位于default命名空間,因此從default命名空間查找相應的DestinationRule,但是default命名空間中并不存在相應的DestinationRule,查找會失敗。
    3. ASM的根命名空間固定為istio-system,因此從istio-system命名空間查找相應的DestinationRule,但是istio-system命名空間中并不存在相應的DestinationRule,查找會失敗。

解決方案

部署DestinationRule時,您需要將DestinationRule部署在以下命名空間中:
  • ASM根命名空間。
  • 服務所在的命名空間。
  • 發(fā)起調(diào)用的客戶端所在的命名空間。
說明 VirtualService不存在命名空間的限制。VirtualService無論在哪個命名空間定義,默認在所有命名空間都可見,除非在YAML文件中通過exportTo改變這一默認行為。