主頁 > 後端開發 > Istio VirtualService 虛擬服務

Istio VirtualService 虛擬服務

2020-09-12 03:13:49 後端開發

概念及示例

VirtualService 描述了一個或多個用戶可尋址目標到網格內實際作業負載之間的映射 , 虛擬服務讓您配置如何在服務網格內將請求路由到服務,這基于 Istio 和平臺提供的基本的連通性和服務發現能力,每個虛擬服務包含一組路由規則,Istio 按順序評估它們,Istio 將每個給定的請求匹配到虛擬服務指定的實際目標地址,您的網格可以有多個虛擬服務,也可以沒有,取決于您的使用場景,

虛擬服務在增強 Istio 流量管理的靈活性和有效性方面,發揮著至關重要的作用,通過對客戶端請求的目標地址與真實回應請求的目標作業負載進行解耦來實作,虛擬服務同時提供了豐富的方式,為發送至這些作業負載的流量指定不同的路由規則,

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  gateways:
  - bookinfo-gateway
  - mesh
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v3

gateways欄位

通過將 VirtualService 系結到同一 Host 的 Gateway 配置(如前一節所述 ),可向網格外部暴露這些 Host,

gateways:
  - bookinfo-gateway
  - mesh

網格內部通信存在一個默認的mesh 保留字, mesh 用來指代網格中的所有 Sidecar,當這一欄位被省略時,就會使用預設值(mesh),也就是針對網格中的所有 Sidecar 生效,如果提供了 gateways 欄位,這一規則就只會應用到宣告的 Gateway 之中,要讓規則同時對 Gateway 和網格內服務生效,需要顯式的將 mesh 加入 gateways 串列,

Hosts欄位

VirtualServicehosts 欄位列舉虛擬服務的目標主機 ——即用戶指定的目標或是路由規則設定的目標,這是客戶端向服務發送請求時使用的一個或多個地址 ,

hosts:
    - bookinfo.com

虛擬服務目的地可以是 IP 地址、DNS 名稱,或者依賴于平臺的一個簡稱(例如 Kubernetes 服務的短名稱),隱式或顯式地指向一個完全限定域名(FQDN),您也可以使用通配符(“*”)前綴,讓您創建一組匹配所有服務的路由規則,虛擬服務的 hosts 欄位實際上不必是 Istio 服務注冊的一部分,它只是虛擬的目標地址,這讓您可以為沒有路由到網格內部的虛擬主機建模,

路由規則

http 欄位包含了虛擬服務的路由規則,用來描述匹配條件和路由行為,它們把 HTTP/1.1、HTTP2 和 gRPC 等流量發送到 hosts 欄位指定的目標(您也可以用 tcptls 片段流量設定路由規則),一個路由規則包含了指定的請求要流向哪個目標地址,具有 0 或多個匹配條件,取決于您的使用場景,

匹配條件

示例中的第一個路由規則有一個條件,因此以 match 欄位開始,在本例中,您希望此路由應用于來自 ”jason“ 用戶的所有請求,所以使用 headersend-userexact 欄位選擇適當的請求,

- match:
   - headers:
       end-user:
         exact: jason
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - match:
    - headers:
        end-user:
          exact: jason
      uri:
        prefix: "/ratings/v2/"
      ignoreUriCase: true
    route:
    - destination:
        host: ratings.prod.svc.cluster.local

Destination

route 部分的 destination 欄位指定了符合此條件的流量的實際目標地址,與虛擬服務的 hosts 不同,destination 的 host 必須是存在于 Istio 服務注冊中心的實際目標地址,否則 Envoy 不知道該將請求發送到哪里,可以是一個有代理的服務網格,或者是一個通過服務入口被添加進來的非網格服務,本示例運行在 Kubernetes 環境中,host 名為一個 Kubernetes 中運行著Service 的名稱:

route:
- destination:
    host: reviews
    subset: v2

請注意,在該示例和本頁其它示例中,為了簡單,我們使用 Kubernetes Service的短名稱設定 destination 的 host,在評估此規則時,Istio 會添加一個基于虛擬服務命名空間的域后綴,這個虛擬服務包含要獲取主機的完全限定名的路由規則,在我們的示例中使用短名稱也意味著您可以復制并在任何喜歡的命名空間中嘗試它們,

只有在目標主機和虛擬服務位于相同的 Kubernetes 命名空間時才可以使用這樣的短名稱 , 建議您在生產環境中指定完全限定的主機名,

destination 片段還指定了 Kubernetes 服務的子集,將符合此規則條件的請求轉入其中,在本例中子集名稱是 v2,您可以在DestinationRule章節中看到如何定義服務子集,

Subset欄位

subset 不屬于 Istio 創建的 CRD,但是它是一條重要的配置資訊,有必要單獨說明下,subset 是服務端點的集合,可以用于 A/B 測驗或者分版本路由等場景,另外在 subset 中可以覆寫服務級別的即 VirtualService 中的定義的流量策略,

以下是subset 的配置資訊,對于 Kubernetes 中的服務,一個 subset 相當于使用 label 的匹配條件選出來的 Service

Field Type Description Required
name string 服務名和 subset 名稱可以用于路由規則中的流量拆分 Yes
labels map 使用標簽對服務注冊表中的服務端點進行篩選 No
trafficPolicy TrafficPolicy 應用到這一 subset 的流量策略,預設情況下 subset 會繼承 DestinationRule 級別的策略,這一欄位的定義則會覆寫預設的繼承策略 No

路由規則優先級

路由規則按從上到下的順序選擇,虛擬服務中定義的第一條規則有最高優先級,本示例中,不滿足第一個路由規則的流量均流向一個默認的目標,該目標在第二條規則中指定,因此,第二條規則沒有 match 條件,直接將流量導向 v3 子集, 我們建議提供一個默認的“無條件”或基于權重的規則作為每一個虛擬服務的最后一條規則,從而確保流經虛擬服務的流量至少能夠匹配一條路由規則,

VirtualService配置

Field Type Description Required
hosts string[] 流量的目標主機,可以是帶有通配符前綴的 DNS 名稱,也可以是 IP 地址,根據所在平臺情況,還可能使用短名稱來代替 FQDN,這種場景下,短名稱到 FQDN 的具體轉換程序是要靠下層平臺完成的,一個主機名只能在一個 VirtualService 中定義,同一個 VirtualService 中可以用于控制多個 HTTP 和 TCP 埠的流量屬性,Kubernetes 用戶注意:當使用服務的短名稱時(例如使用 reviews,而不是 reviews.default.svc.cluster.local),Istio 會根據規則所在的命名空間來處理這一名稱,而非服務所在的命名空間,假設 “default” 命名空間的一條規則中包含了一個 reviewshost 參考,就會被視為 reviews.default.svc.cluster.local,而不會考慮 reviews 服務所在的命名空間,為了避免可能的錯誤配置,建議使用 FQDN 來進行服務參考, hosts 欄位對 HTTP 和 TCP 服務都是有效的,網格中的服務也就是在服務注冊表中注冊的服務,必須使用他們的注冊名進行參考;只有 Gateway 定義的服務才可以使用 IP 地址, Yes
gateways string[] Gateway 名稱串列,Sidecar 會據此使用路由,VirtualService 物件可以用于網格中的 Sidecar,也可以用于一個或多個 Gateway,這里公開的選擇條件可以在協議相關的路由過濾條件中進行覆寫,保留字 mesh 用來指代網格中的所有 Sidecar,當這一欄位被省略時,就會使用預設值(mesh),也就是針對網格中的所有 Sidecar 生效,如果提供了 gateways 欄位,這一規則就只會應用到宣告的 Gateway 之中,要讓規則同時對 Gateway 和網格內服務生效,需要顯式的將 mesh 加入 gateways 串列, No
http HTTPRoute[] HTTP 流量規則的有序串列,這個串列對名稱前綴為 http-http2-grpc- 的服務埠,或者協議為 HTTPHTTP2GRPC 以及終結的 TLS,另外還有使用 HTTPHTTP2 以及 GRPC 協議的 ServiceEntry 都是有效的,進入流量會使用匹配到的第一條規則, No
tls TLSRoute[] 一個有序串列,對應的是透傳 TLS 和 HTTPS 流量,路由程序通常利用 ClientHello 訊息中的 SNI 來完成,TLS 路由通常應用在 https-tls- 前綴的平臺服務埠,或者經 Gateway 透傳的 HTTPS、TLS 協議埠,以及使用 HTTPS 或者 TLS 協議的 ServiceEntry 埠上,注意:沒有關聯 VirtualService 的 https- 或者 tls- 埠流量會被視為透傳 TCP 流量, No
tcp TCPRoute[] 一個針對透傳 TCP 流量的有序路由串列,TCP 路由對所有 HTTP 和 TLS 之外的埠生效,進入流量會使用匹配到的第一條規則, No
exportTo string[] 當前vritual service要匯出的 namespace 串列, 應用于 vritual service 的決議發生在 namespace 層次結構的背景關系中, vritual service 的匯出允許將其包含在其他 namespace 中的服務的決議層次結構中, 此功能為服務所有者和網格管理員提供了一種機制,用于控制跨 namespace 邊界的 vritual service 的可見性
如果未指定任何 namespace,則默認情況下將 vritual service rule 匯出到所有 namespace
. 被保留,用于定義匯出到 vritual service 被宣告所在的相同 namespace ,類似的值*保留,用于定義匯出到所有 namespaces
NOTE:在當前版本中,exportTo值被限制為.*(即, 當前namespace或所有namespace)

HTTPRoute配置

Field Type Description Required
name string 為route分配給路由的名稱 No
match HTTPMatchRequest[] 匹配要激活的規則要滿足的條件,單個匹配塊內的所有條件都具有AND語意,而匹配塊串列具有OR語意,如果任何一個匹配塊成功,則匹配該規則, No
route HTTPRouteDestination[] http規則可以重定向或轉發(默認)流量 No
redirect HTTPRedirect http規則可以重定向或轉發(默認)流量. 如果在規則中指定了流量通過選項,則將忽略路由/重定向,重定向原語可用于將HTTP 301重定向發送到其他URI或Authority, No
rewrite HTTPRewrite 重寫 HTTP URIs and Authority header. 重寫不能與重定向原語一起使用 No
timeout Duration Timeout for HTTP requests. No
retries HTTPRetry Retry policy for HTTP requests. No
fault HTTPFaultInjection 故障注入策略,適用于客戶端的HTTP通信,請注意,如果在客戶端啟用了故障注入策略,則不會啟用超時或重試, No
mirror Destination 除了將請求轉發到預期目標之外,還可以將HTTP流量鏡像到另一個目標, No
mirrorPercent UInt32Value mirror 欄位是設定流量的百分比,如果不存在該欄位,則將鏡像所有流量(100%),最大值為100, No
corsPolicy CorsPolicy 有關跨源資源共享的更多詳細資訊,請參考 CORS No
headers Headers Header 規則 No
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
    - bookinfo.com
  http:
  - match:
    - uri:
        prefix: /reviews
    route:
    - destination:
        host: reviews
  - match:
    - uri:
        prefix: /ratings
    route:
    - destination:
        host: ratings
        ...

TCPRoute配置

Field Type Description Required
match L4MatchAttributes[] 匹配要激活的規則要滿足的條件,單個匹配塊內的所有條件都具有AND語意,而匹配塊串列具有OR語意,如果任何一個匹配塊成功,則匹配該規則, No
route RouteDestination[] 連接應轉發到的目的地 No
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo-Mongo
spec:
  hosts:
  - mongo.prod.svc.cluster.local
  tcp:
  - match:
    - port: 27017
    route:
    - destination:
        host: mongo.backup.svc.cluster.local
        port:
          number: 5555

TLSRoute配置

Type Type Description Required
match TLSMatchAttributes[] 匹配要激活的規則要滿足的條件,單個匹配塊內的所有條件都具有AND語意,而匹配塊串列具有OR語意,如果任何一個匹配塊成功,則匹配該規則, Yes
route RouteDestination[] 連接應轉發到的目的地 No
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo-sni
spec:
  hosts:
  - "*.bookinfo.com"
  gateways:
  - mygateway
  tls:
  - match:
    - port: 443
      sniHosts:
      - login.bookinfo.com
    route:
    - destination:
        host: login.prod.svc.cluster.local
  - match:
    - port: 443
      sniHosts:
      - reviews.bookinfo.com
    route:
    - destination:
        host: reviews.prod.svc.cluster.local

具體細節的引數明細可查閱:https://preliminary.istio.io/zh/docs/reference/config/networking/virtual-service/#VirtualService

參考文獻

https://preliminary.istio.io/zh/docs/concepts/traffic-management/#virtual-services

https://preliminary.istio.io/zh//blog/2018/v1alpha3-routing/

https://preliminary.istio.io/zh/docs/reference/config/networking/virtual-service/#VirtualService

https://jimmysong.io/istio-handbook/concepts/traffic-management-basic.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/9992.html

標籤:Go

上一篇:go語言獲取命令列引數

下一篇:Istio DestinationRule 目標規則

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more