kubernetes實踐之七十三:Istio之配置請求路由
一:簡介
由於 Bookinfo 示例部署了三個版本的 reviews 微服務,因此我們需要設定預設路由。 否則,如果您當多次訪問應用程式,您會注意到有時輸出包含星級評分,有時又沒有。 這是因為沒有為應用明確指定預設路由時,Istio 會將請求隨機路由到該服務的所有可用版本上。
二:路由配置
-
說明: 此任務假定您尚未設定任何路由。 如果您已經為示例應用程式建立了存在衝突的路由規則,則需要在下面的命令中使用 replace代替 create
-
將所有微服務的預設版本設定為 v1
istioctl create -f samples/bookinfo/networking/destination-rule-all.yaml
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: productpage spec: host: productpage subsets: - name: v1 labels: version: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: reviews spec: host: reviews subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 - name: v3 labels: version: v3 --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: ratings spec: host: ratings subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 - name: v2-mysql labels: version: v2-mysql - name: v2-mysql-vm labels: version: v2-mysql-vm --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: details spec: host: details subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 ---
istioctl create -f
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: productpage spec: hosts: - productpage http: - route: - destination: host: productpage subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings spec: hosts: - ratings http: - route: - destination: host: ratings subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: details spec: hosts: - details http: - route: - destination: host: details subset: v1 ---
3.使用 istioctl get destinationrules -o yaml來顯示路由規則對應的 subset 定義
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: creationTimestamp: null name: details namespace: default resourceVersion: "14675502" spec: host: details subsets: - labels: version: v1 name: v1 - labels: version: v2 name: v2 --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: creationTimestamp: null name: productpage namespace: default resourceVersion: "14675499" spec: host: productpage subsets: - labels: version: v1 name: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: creationTimestamp: null name: ratings namespace: default resourceVersion: "14675501" spec: host: ratings subsets: - labels: version: v1 name: v1 - labels: version: v2 name: v2 - labels: version: v2-mysql name: v2-mysql - labels: version: v2-mysql-vm name: v2-mysql-vm --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: creationTimestamp: null name: reviews namespace: default resourceVersion: "14675500" spec: host: reviews subsets: - labels: version: v1 name: v1 - labels: version: v2 name: v2 - labels: version: v3 name: v3 ---
4.透過將來自 productpage 的流量路由到 reviews:v2 例項,為測試使用者 “jason” 啟用 ratings 服務。
istioctl replace -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - match: - headers: end-user: exact: jason route: - destination: host: reviews subset: v2 - route: - destination: host: reviews subset: v1
在 productpage 網頁上以使用者 “jason” 身份登入。現在應該在每次評論旁邊看到評分(1-5顆星)。 請注意,如果您以任何其他使用者身份登入,您將會繼續看到 reviews:v1 版本服務,即不包含星級評價的頁面。
三:原理
首先使用 Istio 將 100% 的請求流量都路由到了 Bookinfo 服務的 v1 版本。 然後再設定了一條路由規則,該路由規則在 productpage 服務中新增基於請求的 “end-user” 自定義 header 選擇性地將特定的流量路由到了 reviews 服務的 v2 版本。
為了利用 Istio 的 L7 路由功能,Kubernetes 中的服務(如本任務中使用的 Bookinfo 服務)必須遵守某些特定限制。
1.需要給埠正確命名:服務埠必須進行命名。埠名稱只允許是<協議>[-<字尾>-]模式,其中<協議>部分可選擇範圍包括 http、http2、grpc、mongo 以及 redis,Istio 可以透過對這些協議的支援來提供路由能力。例如 name: http2-foo 和 name: http 都是有效的埠名,但 name: http2foo 就是無效的。如果沒有給埠進行命名,或者命名沒有使用指定字首,那麼這一埠的流量就會被視為普通 TCP 流量(除非顯式的用 Protocol: UDP 宣告該埠是 UDP 埠)。
2.關聯服務:Pod 必須關聯到 Kubernetes 服務,如果一個 Pod 屬於多個服務,這些服務不能再同一埠上使用不同協議,例如 HTTP 和 TCP。
3.Deployment 應帶有 app 以及 version 標籤:在使用 Kubernetes Deployment 進行 Pod 部署的時候,建議顯式的為 Deployment 加上 app 以及 version 標籤。每個 Deployment 都應該有一個有意義的 app 標籤和一個用於標識 Deployment 版本的 version 標籤。app 標籤在分散式跟蹤的過程中會被用來加入上下文資訊。Istio 還會用 app 和 version 標籤來給遙測指標資料加入上下文資訊。
四:清除路由
istioctl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2212555/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- kubernetes實踐之七十二:Istio之策略與遙測
- kubernetes實踐之七十:Istio之流量管理(上)
- kubernetes實踐之六十七:Istio介紹
- kubernetes實踐之七十一:Istio之流量管理(下)
- kubernetes實踐之五十五:kubectl之配置kubeconfig
- kubernetes實踐之六十六:Istio實現金絲雀釋出原理
- kubernetes實踐之六十九:istio-1.0.0部署和試用
- kubernetes實踐之十一:EFK
- kubernetes實踐之六十:Cabin-Manage Kubernetes
- Kubernetes+Docker+Istio 容器雲實踐Docker
- 阿里雲Kubernetes容器服務Istio實踐之整合日誌服務Log Service阿里
- kubernetes實踐之五十七:PodPreset
- kubernetes實踐之五十八:CronJob
- kubernetes實踐之五十二:Helm
- kubernetes實踐之五十九:NetworkPolicy
- kubernetes實踐之十九:API概述API
- kubernetes實踐之十七:架構架構
- kubernetes實踐之八:TLS bootstrappingTLSbootAPP
- GitOps實踐之kubernetes安裝argocdGitGo
- kubernetes實踐之四十二:StatefulSet
- kubernetes實踐之六十四:CoreDNSDNS
- kubernetes實踐之五十六:雲原生
- kubernetes實踐之五:網路模型模型
- kubernetes實踐之十二:部署Traefik Ingress
- kubernetes實踐之九:kube-dnsDNS
- kubernetes實踐之十:Kubernetes-dashboard+Heapster+InfluxDB+GrafanaUXGrafana
- Istio技術與實踐03:最佳實踐之sidecar自動注入IDE
- Spring Cloud Zuul API服務閘道器之請求路由SpringCloudZuulAPI路由
- 如何用istio實現請求超時管理
- kubernetes生產實踐之redis-clusterRedis
- kubernetes實踐之十四:Service Account與Secret
- kubernetes實踐之四十七:ResourceQuota ControllerController
- kubernetes實踐之六十五:Service Mesh
- kubernetes實踐之六十二:Secret 使用
- kubernetes實踐之六十三:使用技巧
- 網路請求優化之取消請求優化
- web開發安全之請求及返回流資料加解密實踐Web解密
- kubernetes實踐之十六:RBAC 角色訪問控制