5个 Istio 访问外部服务流量控制最常用的例子,你知道几个?

news/2024/10/30 11:31:03/

5 个 Istio 访问外部服务的流量控制常用例子,强烈建议收藏起来,以备不时之需。

环境准备

部署 sleep 服务,作为发送请求的测试源:

kubectl apply -f samples/sleep/sleep.yaml

在 Istio 外部,使用 Nginx 搭建 duckling 服务的v1和v2两个版本,访问时显示简单的文本:

> curl -s http://192.168.1.118/
This is the v1 version of duckling.
> curl -s http://192.168.1.119/
This is the v2 version of duckling.

访问外部服务

执行如下命名访问外部服务 httpbin.org :

export SLEEP_POD=$(kubectl get pods -l app=sleep -o 'jsonpath={.items[0].metadata.name}')
kubectl exec "$SLEEP_POD" -c sleep -- curl -s http://httpbin.org/headers

返回结果如下:

{"headers": {"Accept": "*/*", "Host": "httpbin.org", "User-Agent": "curl/7.81.0-DEV", "X-Amzn-Trace-Id": "Root=1-62bbfa10-3237e3b9662c65ae005148ab", "X-B3-Sampled": "0", "X-B3-Spanid": "9e650093bf7ae862", "X-B3-Traceid": "1da46d7fafa5d71c9e650093bf7ae862", "X-Envoy-Attempt-Count": "1", "X-Envoy-Peer-Metadata": "......", "X-Envoy-Peer-Metadata-Id": "sidecar~......"}
}

此时的方法,没有通过Service Entry,没有 Istio 的流量监控和控制特性。创建 Service Entry :

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:name: httpbin-ext
spec:hosts:- httpbin.orgports:- number: 80name: httpprotocol: HTTPresolution: DNSlocation: MESH_EXTERNAL
EOF

再此次访问,返回结果如下:

{"headers": {"Accept": "*/*", "Host": "httpbin.org", "User-Agent": "curl/7.81.0-DEV", "X-Amzn-Trace-Id": "Root=1-62bbfbd6-254b05344b3cde2c0c41b3b8", "X-B3-Sampled": "0", "X-B3-Spanid": "307c0b106c8b262e", "X-B3-Traceid": "f684a50776c088ac307c0b106c8b262e", "X-Envoy-Attempt-Count": "1", "X-Envoy-Decorator-Operation": "httpbin.org:80/*", "X-Envoy-Peer-Metadata": "......", "X-Envoy-Peer-Metadata-Id": "sidecar~......"}
}

可以发现由 Istio 边车添加的请求头:X-Envoy-Decorator-Operation

设置请求超时

向外部服务 httpbin.org 的 /delay 发出请求:

export SLEEP_POD=$(kubectl get pods -l app=sleep -o 'jsonpath={.items[0].metadata.name}')
kubectl exec "$SLEEP_POD" -c sleep -- time curl -o /dev/null -sS -w "%{http_code}\n" http://httpbin.org/delay/5

返回结果如下:

200
real    0m 5.69s
user    0m 0.00s
sys     0m 0.00s

请求大约在 5 秒后返回 200 (OK)。

创建虚拟服务,访问外部服务 httpbin.org 时, 请求超时设置为 3 秒:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: httpbin-ext
spec:hosts:- httpbin.orghttp:- timeout: 3sroute:- destination:host: httpbin.orgweight: 100
EOF

再此次访问,返回结果如下:

504
real    0m 3.01s
user    0m 0.00s
sys     0m 0.00s

可以看出,在 3 秒后出现了 504 (Gateway Timeout)。 Istio 在 3 秒后切断了响应时间为 5 秒的 httpbin.org 服务。

注入 HTTP 延迟故障

向外部服务 httpbin.org 的 /get 发出请求:

export SLEEP_POD=$(kubectl get pods  -l app=sleep -o 'jsonpath={.items[0].metadata.name}')
kubectl exec "$SLEEP_POD" -c sleep -- time curl -o /dev/null -sS -w "%{http_code}\n" http://httpbin.org/get

返回结果如下:

200
real  0m 0.45s
user  0m 0.00s
sys 0m 0.00s

请求不到 1 秒就返回 200 (OK)。

创建虚拟服务,访问外部服务 httpbin.org 时, 注入一个 3 秒的延迟:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: httpbin-ext
spec:hosts:- httpbin.orghttp:- fault:delay:fixedDelay: 3spercentage:value: 100route:- destination:host: httpbin.org
EOF

再此次访问 httpbin.org 的 /get ,返回结果如下:

200
real  0m 3.43s
user  0m 0.00s
sys 0m 0.00s

可以看出,在 3 秒后出现了 200 (OK)。

流量转移

访问duckling服务时,所有流量都路由到v1版本,具体配置如下:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:name: duckling
spec:hosts:- duckling.comports:- number: 80name: httpprotocol: HTTPlocation: MESH_EXTERNALresolution: STATICendpoints:- address: 172.24.29.118ports:http: 80labels:version: v1- address: 172.24.29.119ports:http: 80labels:version: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: duckling
spec:hosts:- duckling.comhttp:- route:- destination:host: duckling.comsubset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: duckling
spec:host: duckling.comsubsets:- labels:version: v1name: v1- labels:version: v2name: v2
EOF

执行如下命名访问外部服务 duckling.com :

export SLEEP_POD=$(kubectl get pods -l app=sleep -o 'jsonpath={.items[0].metadata.name}')
kubectl exec "$SLEEP_POD" -c sleep -- curl -s http://duckling.com/

多次访问后,返回结果一直是:This is the v1 version of duckling.

访问duckling服务时,把50%流量转移到v2版本,具体配置如下:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: duckling
spec:hosts:- duckling.comhttp:- route:- destination:host: duckling.comsubset: v1weight: 50- destination:host: duckling.comsubset: v2weight: 50
EOF

多次访问外部服务 duckling.com ,有时返回This is the v1 version of duckling.,有时返回This is the v2 version of duckling.

访问duckling服务时,所有流量都路由到v2版本,具体配置如下:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: duckling
spec:hosts:- duckling.comhttp:- route:- destination:host: duckling.comsubset: v2
EOF

多次访问外部服务 duckling.com ,一直返回This is the v2 version of duckling.

基于请求头的路由

请求头end-user为OneMore的所有流量都路由到v2版本,其他流量都路由到v1版本,具体配置如下:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:name: duckling
spec:hosts:- duckling.comports:- number: 80name: httpprotocol: HTTPlocation: MESH_EXTERNALresolution: STATICendpoints:- address: 172.24.29.118ports:http: 80labels:version: v1- address: 172.24.29.119ports:http: 80labels:version: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: duckling
spec:hosts:- duckling.comhttp:- match:- headers:end-user:exact: OneMoreroute:- destination:host: duckling.comsubset: v2- route:- destination:host: duckling.comsubset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: duckling
spec:host: duckling.comsubsets:- labels:version: v1name: v1- labels:version: v2name: v2
EOF

执行如下命名访问外部服务 duckling.com :

export SLEEP_POD=$(kubectl get pods -l app=sleep -o 'jsonpath={.items[0].metadata.name}')
kubectl exec "$SLEEP_POD" -c sleep -- curl -s http://duckling.com/

多次访问的返回结果一直是:This is the v1 version of duckling.

设置请求头end-user为OneMore,访问外部服务 duckling.com :

kubectl exec "$SLEEP_POD" -c sleep -- curl -H "end-user:OneMore" -s http://duckling.com/

多次访问的返回结果一直是:This is the v2 version of duckling.


http://www.ppmy.cn/news/307918.html

相关文章

基于Java+Springboot+Vue的二次元商城网站设计与实现

博主介绍&#xff1a;✌擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案…

c# 从零到精通-创建一个属性的操作

c# 从零到精通-创建一个属性的操作 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test01 { class MyClass { private string id “”; //定义一个string类型的变量&#xff0c;用来记录用户编号 /// ///定义用户编号属…

android吧 iphone6,还有人认为苹果6比现在的安卓手机流畅?旗舰机型用户:快醒醒吧...

原标题&#xff1a;还有人认为苹果6比现在的安卓手机流畅&#xff1f;旗舰机型用户&#xff1a;快醒醒吧 说起来&#xff0c;安卓手机到现在已经和苹果手机没有太大的差距了&#xff0c;但实际上&#xff0c;还是有一部分“果粉”的思维还停留在安卓手机在前几年的时间&#xf…

苹果刷机未知错误75_苹果iPhone6用iTunes刷机报错未知错误53解决方法

看点:iPhone X原装屏与国产屏有哪些区别?看点:换7P、8P屏幕:C11和DTP和DKH的区别狮淘:不锈钢拆机片5个只需9.9元!包邮!每天10名关于因iPhone Touch ID损坏,使用iTunes恢复iPhone时会出现Error 53,导致iPhone变砖,无法使用的问题一直深受关注。目前苹果已经正式发布了…

苹果6怎么截屏_iPhone怎么设置双击截屏 苹果手机双击截屏图文教程

对于经常需要截屏的iPhone用户来说,经常会羡慕安卓手机的各种截屏小技巧,如指关节截屏、手势截屏、隔空截屏等等,这些安卓手机内置的截屏功能,在iPhone上往往体验不上。尤其是iPhone X以上机型,截屏默认只能通过「电源键」+「音量上键」组合快捷键来实现,不仅操作上比较单…

机器学习笔记 - EANet 外部注意论文简读及代码实现

一、论文简述 论文作者提出了一种新的轻量级注意力机制&#xff0c;称之为外部注意力。如图所示&#xff0c;计算自注意力需要首先通过计算自查询向量和自关键字向量之间的仿射关系来计算注意力图&#xff0c;然后通过用该注意力图加权自值向量来生成新的特征图。外部关注的作用…

记录一下idea黄色警戒线问题

记录一下idea黄色警戒线问题 一、通用文件中解决黄色波浪线问题1.选中File中的Settings进入2.点击Editor&#xff0c;选中Inspections&#xff0c;找到General&#xff0c;找到Dulicated code fragment点击取消 二、SQL文件中黄色警告线 一、通用文件中解决黄色波浪线问题 1.选…

uni-app APP、html引入html2canvas截图以及截长图

下载安装html2canvas 方式一&#xff0c;https://www.bootcdn.cn/ CDN网站下载html2canvas插件 这里下载后放在测项目目录common下面 页面中引入 方式二、npm方式安装html2canvas 1、npm方式下载 npm i html2canvas2、引入html2canvas import html2canvas from html2can…