Istio 服務(wù)模型與流量治理要點
引言
Istio的服務(wù)模型是怎么樣的?通過什么方式進行流量治理
一、Istio服務(wù)模型
服務(wù)(Service)與版本(Version):Istio中的服務(wù)在kubernetes中以service形式存在,可定義不同的服務(wù)版本。通過Deployment創(chuàng)建工作負載,通過Service關(guān)聯(lián)這些負載,域名或者虛擬IP訪問后端Pod。
服務(wù)實例(ServiceInstance): 一個服務(wù)可以包含一組實例,在Kubernetes中用Endpoints實現(xiàn),一組域名或者IP地址。
服務(wù)(Service)示例:
- apiVersion: v1
- kind: Service
- metadata:
- name: helloworld
- labels:
- app: helloworld
- service: helloworld
- spec:
- ports:
- - port: 5000
- name: http
- selector:
- app: helloworld
備注:創(chuàng)建一個名稱為helloworld的Service,指向“app: helloworld”的Pods,Kubernetes會自動創(chuàng)建一個和Service同名的Endpoints對象,Selector會持續(xù)跟蹤映射屬于helloworld的Pods。
工作負載示例:
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: helloworld-v1
- labels:
- app: helloworld
- version: v1
- spec:
- replicas: 1
- selector:
- matchLabels:
- app: helloworld
- version: v1
- template:
- metadata:
- labels:
- app: helloworld
- version: v1
- spec:
- containers:
- - name: helloworld
- image: docker.io/istio/examples-helloworld-v1
- resources:
- requests:
- cpu: "100m"
- imagePullPolicy: IfNotPresent #Always
- ports:
- - containerPort: 5000
備注:以Deployment方式創(chuàng)建工作負載,關(guān)聯(lián)的版本與鏡像。
二、Istio流量治理
治理原理
通過Isito中VirtualService、DestinationRule、ServiceEntry等配置實現(xiàn)流量治理,即Istio將流量配置通過xDS下發(fā)給Enovy,通過攔截Inbound和Outbound流量,在流量經(jīng)過時執(zhí)行規(guī)則,實現(xiàn)流量治理。
通常流量治理有:動態(tài)變更負載均衡策略、不同版本灰度發(fā)布、服務(wù)治理限流熔斷和故障注入演練等。
概念說明
1.VirtualService
含義:形式上為虛擬服務(wù),將流量轉(zhuǎn)發(fā)到對應(yīng)的后端服務(wù)。
1.1 重要參數(shù)說明
- hosts 必選字段,用于匹配訪問地址,建議用字母的域名而不是IP地址
- gateways 流量規(guī)則網(wǎng)關(guān)Gateway,可作用于網(wǎng)格中的SideCar和入口處的Gateway 網(wǎng)格內(nèi)部訪問可以省略;網(wǎng)格外流量配置關(guān)聯(lián)的Gateway表示執(zhí)行該規(guī)則;網(wǎng)格內(nèi)外都需要訪問:需要配置Gateway和mesh兩個字段
- http 用于處理HTTP流量
- tls 用于處理非終結(jié)的TLS和HTTPS流量
- tcp 用于處理TCP流量,如果未定義http和tls所有流量將走tcp路由
- exportTo 用于控制命名空間的可見性,可以控制一個命名空間下的VirtualService是否被其他命名SideCar和Gateway使用,未賦值表示全局可見
備注:VirtualService規(guī)則是一個數(shù)組,當(dāng)?shù)谝粋€規(guī)則生效后將會跳出,不再檢查后面的規(guī)則
1.2 VirtualService典型應(yīng)用
不同服務(wù)組合通過不同路徑映射
不同版本映射通過不同URI映射到不同的服務(wù)版本
1.3 示例
- apiVersion: networking.istio.io/v1alpha3
- kind: VirtualService
- metadata:
- name: helloworld
- spec:
- hosts:
- - "*"
- gateways:
- - helloworld-gateway
- http:
- - match:
- - uri:
- exact: /hello
- route:
- - destination:
- host: helloworld
- port:
- number: 5000
2.DestinationRule
含義:通常和VirtualService結(jié)合使用,VirtualService描述滿足什么條件將流量轉(zhuǎn)發(fā)到后端服務(wù),DestinationRule描述到達后端了如何處理,類似于方法內(nèi)部邏輯。
2.1 重要參數(shù)說明
- hosts 必填,表示規(guī)則使用的對象
- trafficPolicy 規(guī)則具體內(nèi)容,可包括負載均衡策略、異常點檢查、連接池策略等
- subsets 服務(wù)子集,常用于定義服務(wù)的版本
- exportTo 用于控制命名空間的可見性,未賦值全局可見
2.2 DestinationRule典型應(yīng)用
- 負載均衡策略規(guī)則
- 不同版本灰度流量,例如:通過subSet
- 服務(wù)熔斷限流,例如:通過請求量和請求超時等
2.3 示例
- apiVersion: networking.istio.io/v1alpha3
- kind: DestinationRule
- metadata:
- name: bookinfo-ratings
- spec:
- host: ratings.prod.svc.cluster.local
- trafficPolicy:
- loadBalancer:
- simple: LEAST_CONN
- subsets:
- - name: testversion
- labels:
- version: v3
- trafficPolicy:
- loadBalancer:
- simple: ROUND_ROBIN
3.ServiceEntry
含義:將網(wǎng)格外服務(wù)納入istio網(wǎng)格。
3.1 重要參數(shù)說明
- hosts 必填,與ServiceEntry關(guān)聯(lián)的主機名,主要用于http協(xié)議,其他協(xié)議不生效
- address 表示與服務(wù)關(guān)聯(lián)的地址
- port 表示與服務(wù)關(guān)聯(lián)的端口
- Location 用于設(shè)置服務(wù)是在網(wǎng)格內(nèi)還是網(wǎng)格外 MESH_EXTERNAL:表示在網(wǎng)格外部,通過API訪問外部服務(wù) MESH_INTERNAL:表示在網(wǎng)格內(nèi)部,不能直接注冊到網(wǎng)格注冊中心的服務(wù)
- resolution 服務(wù)發(fā)現(xiàn)的方式,NONE、STATIC、DNS等
- SubjectAltNames 表示這個服務(wù)負載的SAN列表
- endpoints 表示與網(wǎng)格服務(wù)關(guān)聯(lián)的網(wǎng)絡(luò)地址,可以是IP或者域名
3.2 ServiceEntry典型應(yīng)用
配置訪問外部服務(wù)
3.3 示例
- apiVersion: networking.istio.io/v1alpha3
- kind: ServiceEntry
- metadata:
- name: baidu-external
- spec:
- hosts:
- - www.baidu.com
- ports:
- - number: 80
- name: HTTP
- protocol: HTTP
- resolution: DNS
- location: MESH_EXTERNAL