本文介紹定義的DestinationRule失效的問題現(xiàn)象、問題原因和解決方案。
問題現(xiàn)象
為服務部署DestinationRule后,使用客戶端調(diào)用服務,發(fā)現(xiàn)DestinationRule失效,調(diào)用服務失敗。
問題原因
ASM路由一個請求時,會根據(jù)固定查找過程查找DestinationRule去完成路由。如果您的DestinationRule部署在查找過程之外的命名空間,則DestinationRule會失效。查找過程如下所示:
- 從客戶端命名空間查找,即從發(fā)起調(diào)用的客戶端所在的命名空間查找是否存在相應的DestinationRule。
- 從服務命名空間查找,即從被調(diào)用的服務所在的命名空間查找是否存在相應的DestinationRule。
- 從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查找過程:
- 發(fā)起調(diào)用請求的客戶端位于ns2命名空間,因此會從ns2命名空間查找相應的DestinationRule,但是ns2命名空間中并不存在相應的DestinationRule,查找會失敗。
- 被調(diào)用的myservice服務是位于default命名空間,因此從default命名空間查找相應的DestinationRule,但是default命名空間中并不存在相應的DestinationRule,查找會失敗。
- ASM的根命名空間固定為istio-system,因此從istio-system命名空間查找相應的DestinationRule,但是istio-system命名空間中并不存在相應的DestinationRule,查找會失敗。
解決方案
部署DestinationRule時,您需要將DestinationRule部署在以下命名空間中:
- ASM根命名空間。
- 服務所在的命名空間。
- 發(fā)起調(diào)用的客戶端所在的命名空間。
說明 VirtualService不存在命名空間的限制。VirtualService無論在哪個命名空間定義,默認在所有命名空間都可見,除非在YAML文件中通過
exportTo
改變這一默認行為。