Istio 服務(wù)模型與流量治理要點(diǎn)
引言
Istio的服務(wù)模型是怎么樣的?通過什么方式進(jìn)行流量治理
一、Istio服務(wù)模型
服務(wù)(Service)與版本(Version):Istio中的服務(wù)在kubernetes中以service形式存在,可定義不同的服務(wù)版本。通過Deployment創(chuàng)建工作負(fù)載,通過Service關(guān)聯(lián)這些負(fù)載,域名或者虛擬IP訪問后端Pod。
服務(wù)實(shí)例(ServiceInstance): 一個(gè)服務(wù)可以包含一組實(shí)例,在Kubernetes中用Endpoints實(shí)現(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)建一個(gè)名稱為helloworld的Service,指向“app: helloworld”的Pods,Kubernetes會(huì)自動(dòng)創(chuàng)建一個(gè)和Service同名的Endpoints對(duì)象,Selector會(huì)持續(xù)跟蹤映射屬于helloworld的Pods。
工作負(fù)載示例:
- 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)建工作負(fù)載,關(guān)聯(lián)的版本與鏡像。
二、Istio流量治理
治理原理
通過Isito中VirtualService、DestinationRule、ServiceEntry等配置實(shí)現(xiàn)流量治理,即Istio將流量配置通過xDS下發(fā)給Enovy,通過攔截Inbound和Outbound流量,在流量經(jīng)過時(shí)執(zhí)行規(guī)則,實(shí)現(xiàn)流量治理。
通常流量治理有:動(dòng)態(tài)變更負(fù)載均衡策略、不同版本灰度發(fā)布、服務(wù)治理限流熔斷和故障注入演練等。
概念說明
1.VirtualService
含義:形式上為虛擬服務(wù),將流量轉(zhuǎn)發(fā)到對(duì)應(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兩個(gè)字段
 - http 用于處理HTTP流量
 - tls 用于處理非終結(jié)的TLS和HTTPS流量
 - tcp 用于處理TCP流量,如果未定義http和tls所有流量將走tcp路由
 - exportTo 用于控制命名空間的可見性,可以控制一個(gè)命名空間下的VirtualService是否被其他命名SideCar和Gateway使用,未賦值表示全局可見
 
備注:VirtualService規(guī)則是一個(gè)數(shù)組,當(dāng)?shù)谝粋€(gè)規(guī)則生效后將會(huì)跳出,不再檢查后面的規(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描述到達(dá)后端了如何處理,類似于方法內(nèi)部邏輯。
2.1 重要參數(shù)說明
- hosts 必填,表示規(guī)則使用的對(duì)象
 - trafficPolicy 規(guī)則具體內(nèi)容,可包括負(fù)載均衡策略、異常點(diǎn)檢查、連接池策略等
 - subsets 服務(wù)子集,常用于定義服務(wù)的版本
 - exportTo 用于控制命名空間的可見性,未賦值全局可見
 
2.2 DestinationRule典型應(yīng)用
- 負(fù)載均衡策略規(guī)則
 - 不同版本灰度流量,例如:通過subSet
 - 服務(wù)熔斷限流,例如:通過請(qǐng)求量和請(qǐng)求超時(shí)等
 
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)的主機(jī)名,主要用于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)部,不能直接注冊(cè)到網(wǎng)格注冊(cè)中心的服務(wù)
 - resolution 服務(wù)發(fā)現(xiàn)的方式,NONE、STATIC、DNS等
 - SubjectAltNames 表示這個(gè)服務(wù)負(fù)載的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
 
















 
 
 












 
 
 
 