Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >5个 Istio 访问外部服务流量控制最常用的例子,你知道几个?

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

作者头像
万猫学社
发布于 2022-12-01 08:06:37
发布于 2022-12-01 08:06:37
36600
代码可运行
举报
运行总次数:0
代码可运行

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

环境准备

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f samples/sleep/sleep.yaml

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> 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 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

返回结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "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 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: httpbin-ext
spec:
  hosts:
  - httpbin.org
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: DNS
  location: MESH_EXTERNAL
EOF

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "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 发出请求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

返回结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
200
real    0m 5.69s
user    0m 0.00s
sys     0m 0.00s

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin-ext
spec:
  hosts:
    - httpbin.org
  http:
  - timeout: 3s
    route:
      - destination:
          host: httpbin.org
        weight: 100
EOF

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 发出请求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

返回结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
200
real  0m 0.45s
user  0m 0.00s
sys 0m 0.00s

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin-ext
spec:
  hosts:
    - httpbin.org
  http:
    - fault:
        delay:
          fixedDelay: 3s
          percentage:
            value: 100
      route:
        - destination:
            host: httpbin.org
EOF

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
200
real  0m 3.43s
user  0m 0.00s
sys 0m 0.00s

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

流量转移

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: duckling
spec:
  hosts:
  - duckling.com
  ports:
  - number: 80
    name: http
    protocol: HTTP
  location: MESH_EXTERNAL
  resolution: STATIC
  endpoints:
  - address: 172.24.29.118
    ports:
      http: 80
    labels:
      version: v1
  - address: 172.24.29.119
    ports:
      http: 80
    labels:
      version: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: duckling
spec:
  hosts:
  - duckling.com
  http:
  - route:
    - destination:
        host: duckling.com
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: duckling
spec:
  host: duckling.com
  subsets:
    - labels:
        version: v1
      name: v1
    - labels:
        version: v2
      name: v2
EOF

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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版本,具体配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: duckling
spec:
  hosts:
  - duckling.com
  http:
  - route:
    - destination:
        host: duckling.com
        subset: v1
      weight: 50
    - destination:
        host: duckling.com
        subset: v2
      weight: 50
EOF

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: duckling
spec:
  hosts:
  - duckling.com
  http:
  - route:
    - destination:
        host: duckling.com
        subset: v2
EOF

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

基于请求头的路由

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: duckling
spec:
  hosts:
  - duckling.com
  ports:
  - number: 80
    name: http
    protocol: HTTP
  location: MESH_EXTERNAL
  resolution: STATIC
  endpoints:
  - address: 172.24.29.118
    ports:
      http: 80
    labels:
      version: v1
  - address: 172.24.29.119
    ports:
      http: 80
    labels:
      version: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: duckling
spec:
  hosts:
  - duckling.com
  http:
  - match:
    - headers:
        end-user:
          exact: OneMore
    route:
    - destination:
        host: duckling.com
        subset: v2
  - route:
    - destination:
        host: duckling.com
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: duckling
spec:
  host: duckling.com
  subsets:
    - labels:
        version: v1
      name: v1
    - labels:
        version: v2
      name: v2
EOF

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl exec "$SLEEP_POD" -c sleep -- curl -H "end-user:OneMore" -s http://duckling.com/

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 万猫学社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
985 博士真的会舍弃华为年薪接近 100 万 offer,去选择年薪 20 万的公务员吗?
喜欢做学术并且博士期间学术做得比较有成就的同学会选择做学术,其他同学(也有学术巨牛逼的,比如手握十几篇顶会,一作大几篇的)基本上都会选择业界就职,包括华为,Google,MSRA 这种技术公司和量化(国内 top 量化九坤的创始人就是我们院前辈,所以我们去九坤的很多),还有前几年比较好的区块链币圈或者美元基金。当然今年就业形势很差,选择华为的会比较多
用户6983566
2023/01/14
3.5K0
985 博士真的会舍弃华为年薪接近 100 万 offer,去选择年薪 20 万的公务员吗?
【职场】112家IT公司薪水一览表
作者是西电通院2013届毕业硕士,根据今年找工作的情况以及身边同学的汇总,总结各大公司的待遇如下,吐血奉献,公司比较全。以下绝对是各大公司2013届校招的数据,少数几个是2011、2012的数据,都已经特别注明,数据真实重要性高于一切!选进来的都是已经确认的信息,放心参考。 这里所说的待遇全部为税前,另外,年薪不是简单的*12,因为有年终奖。而互联网公司的待遇package,都是包含了年终奖的。 以下待遇无特别说明,默认都是硕士,本科的话会特别说明,关注软件的多一些。 1、华为:研发、服务、销售多数岗位 本
小莹莹
2018/04/20
2.7K0
留美博士生涌现回流中国潮!一是因为工资,二是因为特朗普
根据教育部4月发布的最新统计数据,去年中国有大约60万学生在海外留学,其中一半以上在美国学习。
新智元
2018/09/25
7140
留美博士生涌现回流中国潮!一是因为工资,二是因为特朗普
申请CS博士学位前,布朗大学Jeff Huang团队这份师资、排名和奖学金统计值得参考
机器之心报道 编辑:蛋酱 这是一份申请 CS 博士学位前可以认真参考的统计资料。 哪些机构获得了 CS 领域最多的最佳论文奖?申请计算机科学领域的博士学位,各大院校的津贴水平如何?不同院校的 CS 学科水平究竟排名如何?这些问题,想必很多正打算申请 CS 博士学位的人都非常关心。 近日,布朗大学副教授 Jeff Huang 团队总结了一份与 CS 博士学位有关的数据统计,包含师资、排名和奖学金等事项。 这篇文章将介绍相关的亮点内容,如下: CS 教授构成与招聘分析 对 5000 多名计算机科学教授的分析
机器之心
2022/05/06
4830
申请CS博士学位前,布朗大学Jeff Huang团队这份师资、排名和奖学金统计值得参考
年薪50万的人的生活方式
税后五十来万,另有一年十万左右的利息收入和三万多房租。我们住内环两房,限购也无法再买房。
用户3477080
2019/03/09
7K0
2020 程序员找工作指南
offer,录取意向,offer 分为口头 offer 和书面 offer,一般书面 offer 才算是正式 offer,例句
cnguu
2020/10/23
7160
现在想读博以后去高校,还值得吗?
每天给你送来NLP技术干货! ---- 本文来源:学术志(ID:xueshuzhi001)综合整理自知乎、小红书等 在2022年学位与研究生教育发表的论文《我国博士毕业生去向及就业特征分析——基于2015—2020年博士毕业生数据的分析》中,高校以45%的比例位居博士就业单位第一。 从这里不难看出,博士毕业,进入高校工作是他们的首选,当然也有很多同学,读博的目的就是为了进高校。那么直到现在,读博进高校还值得吗? 高校待遇如何? 小红书@Zzzzzz 高校老师入职offer分以下几个部分. 1.协议工资 2
zenRRan
2022/09/28
1.2K0
现在想读博以后去高校,还值得吗?
offer选择,我要为了1000块放弃大厂的offer吗?
最近在知乎上看到一个很有意思的问题:毕业生,在薪资差别不大的情况下,比如500-1000,大公司好还是小公司好?
TechFlow-承志
2023/03/02
3340
offer选择,我要为了1000块放弃大厂的offer吗?
互联网这口饭,是越来越难吃了
往年这个时候,互联网行业都会出现“晒年终奖”的情况,特别是游戏行业,几十个月甚至上百个月的年终奖,都不算稀罕。这样的“土豪年终奖”,让很多人成了柠檬精。
罗超频道
2020/02/14
4600
互联网这口饭,是越来越难吃了
哈哈哈,发年终奖啦,我要去斗鱼打赏最喜欢的妹子~
为了让你们这些 lsp 少踩点坑,小方同学思索许久才想到这个标题,我真是煞费苦心啊。
范蠡
2021/04/25
9220
计算机应届生月薪大多是多少?
月薪4k,6k,8k,10k的各占百分之多少呢,好对自己有个定位,现在听听那些亲身经历者说一说。
磐创AI
2020/03/05
6K0
2021 年互联网大厂职级对应薪资一览表
声明:本文数据部分来自所涉公司官方微信公众号(如:字节范儿),部分来自脉脉各公司职言区,另有部分知乎网友整理内容。除官微数据外,其他内容均来自网络,我们整理于此供大家参考,如有错漏,欢迎指正。
@超人
2021/02/26
39.1K0
2021 年互联网大厂职级对应薪资一览表
微信全面支持“小号”;员工购买公司福利房,被裁员后遭巨额索赔;16岁少年孤身前往深圳腾讯总部解封QQ账号|Q资讯
据外媒消息称,美国将禁止供应商向华为提供任何产品;小米迎来“开年第一件大事”:组织架构调整,设立两个关键委员会;理想销量夺冠后,员工不满年终奖打折;OpenAI 开始将 ChatGPT 商业化,同时发布新工具对其“制裁”;百度出手,国产版 ChatGPT 要来了;微软回应苏州大裁员:不要把宝贵的时间浪费在这种毫无根据的谣言上;英特尔进行大规模降薪:CEO 最高降 25%,员工也受影响;Twitter 前 CEO 力推的 Web3 社交应用刷屏,但已在国内中国大陆 App Store 商店下架;为解封 QQ 空间,16 岁少年春节孤身前往深圳腾讯总部;“他们裁员,我们招聘” ,美国硅谷大裁员德国公司捡漏;春节后,IT 行业用工需求旺盛……
深度学习与Python
2023/02/10
8490
微信全面支持“小号”;员工购买公司福利房,被裁员后遭巨额索赔;16岁少年孤身前往深圳腾讯总部解封QQ账号|Q资讯
14家互联网公司裁员了(1-2月裁员清单)
2022年开年不久,已有14家公司裁员......  下面为未经完全证实消息。 1、微博裁员(2.17) 新浪微博裁员开始。经多方面与内部人士获取信息,相关情况如下: 坐标北京,批量约谈已经于本周开始,有多位员工已经谈完并签署协议; 目前人均有N+1,但本次被裁将无年终奖;另有工作10年的哺乳期员工也在优化范围内,而且赔偿同为N+1; 本次裁员绩效为D的员工全清; 前不久微博新HR负责人上任,本次人员成本的优化可看作“新官上任三把火”; 约谈还在进行中。 先前的一些公司裁员消息都会上微博热搜,这次还会上
张俊红
2022/03/14
3.3K0
作为一个中产阶级,我对国家有哪些不满意
我的文章,很多上面的人都能看到,有的在内部刊物发表,有的被相关领导批示过,也有政府部门联系过我,还有智库针对我的文章发表过评论。
纯洁的微笑
2018/08/16
1K0
作为一个中产阶级,我对国家有哪些不满意
黑掉多家大公司,7名青少年被逮捕;消息称钉钉将上线“下班勿扰”功能​;Java 18 正式发布 | EA周报
腾讯控股发布2021年度第四季度及全年财报。财报显示,2021年第四季度,腾讯营收1442亿元,同比增长 8%,略低于市场预期的1453亿元,No-IFRS净利润248.8亿元,同比大 25%,连续第二个季度负增长,而且幅度扩大了23个百分点。全年No-IFRS净利润1237.88亿元,同比增长仅1%,创近十年来的最低值。在腾讯内部,马化腾曾和员工调侃起自己腰椎不好的老毛病,经过了一年时间的锻炼,拍了部腰的片子,结果和腾讯2020年的业绩一样「突出」。这一次,在腾讯内部社区里,马化腾再次拿自己的「腰」来做调侃:游了一年泳,又拍了片子,结果发现自己的腰椎间盘跟腾讯2021年的情况差不多——不那么突出了,甚至还少了一块儿。(快科技)
yuanyi928
2022/04/19
6840
在 BAT 做三年,普通程序员能拿多少工资?
说到薪资,BAT 作为国内互联网三巨头,员工薪资相信很多人都很好奇。有人提出,按起薪 15k 算,在 BAT 工作了三年的普通员工,按照每年 20% 的增幅可以达到 15*1.2*1.2*1.2=25k。年薪 25k*14(百度),25k*16(腾讯),25k*15(阿里)。那么这个算法准确吗?
哲洛不闹
2018/09/18
2.7K0
在 BAT 做三年,普通程序员能拿多少工资?
运营商遭虚拟运营商挖角:传统企业难抗衡互联网
一个久未谋面的前运营商同事约我喝茶叙旧。聊的话题除了生活、创业之外,大多还是通信。最后这位朋友话锋一转,“你觉得虚拟运营商怎么样?”我立马反映过来,核心问题来了。 没错,他收到了虚拟运营商的猎头电话,正在纠结要不要离开为之奋斗近十年的公司和城市,到另一座城市寻找一个更好的前程。当人们遇到重大问题拿捏不定时,往往需要寻找外力,给自己潜意识已经做出的选择更多的支撑。我给了他一些说了等于没说的建议,因为你永远无法帮别人做决定。 能够影响一个人轨迹的重大选择并不多。升学、择偶,还有求职。在人
罗超频道
2018/04/28
1.4K1
将浪潮、曙光等 10 家告上法庭:索赔金额数百万
前两日,云头条发布了《郭某以恶意取消录用为由:将一公司告上法庭,索赔 100 万》、《反转、17900 元不用赔了》的内容。 经深度查询,郭某与10家企业存在劳动争议纠纷。 以上内容根据《裁决文书网》资料整理,云头条将以上案件主角郭某判断为一个人的原因为,姓名相同、生日相同、籍贯相同、职位类似,案件诉讼内容相近。 其与每家的劳动纠纷在 2~ 6 个之间,大多会二审,案由以违法解除劳动合同、竞业限制为主。 云头条选择浪潮、曙光两家比较典型的案例发布这里,供大家参考。云头条编辑过程中根据重要程度对裁决文书
云头条
2022/09/20
7770
将浪潮、曙光等 10 家告上法庭:索赔金额数百万
一个中科大差生的8年程序员工作总结
平时遇到自己觉得比较感兴趣的文章,如果我当时没有时间阅读,就会将其列为阅读代办。后面有时间了,抽出时间再细看。
Guide哥
2021/02/08
6650
推荐阅读
相关推荐
985 博士真的会舍弃华为年薪接近 100 万 offer,去选择年薪 20 万的公务员吗?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验