istio学习记录——VirtualService详解

news2024/11/21 2:25:45


上一篇使用VirtualService进行了简单的流量控制,并通过Gateway将流量导入到了集群内。这一篇将更加深入的介绍 VirtualService。

k8s中有service,service能够对流量进行负载均衡,那为什么istio又引入了VirtualService呢,因为service的负载均衡只有简单的轮询和会话亲和,istio需要更为细致的流量控制,所以有了VirtualService。

VirtualService特性

流量路由规则:通过 VirtualService,你可以定义一组规则,用于决定如何将请求路由到后端服务。这可以基于多种条件,包括请求的主机名、路径、请求头等

版本控制:VirtualService 允许你指定请求应该路由到哪个后端服务的哪个版本。这对于实现流量的分阶段发布(canary deployment)或蓝绿部署(blue-green deployment)等非常有用。

超时和重试策略:你可以在 VirtualService 中定义超时和重试策略,以控制在请求失败时的行为。这有助于增加服务的可靠性和弹性。

故障注入:Istio 允许你通过 VirtualService 在服务之间注入故障,以测试系统在异常情况下的表现。这对于测试容错性和恢复能力非常有用。

重定向和重写:通过 VirtualService,你可以配置请求的重定向或重写规则。这使得可以对请求进行转发、修改路径或重定向到不同的 URL。

下面将一一演示这些特性的配置,路由规则和版本控制,在前面的文章中有介绍,这里不再重新演示

环境准备

注:test-istio 已经设置了istio的sidecar注入

所有的演示均在test-istio 命名空间进行,因为只有都注入了istio的sidecar,客户端才可以接收到来自 Pilot server 端有关 virtual service 的配置

nginx的deployment

镜像使用: nginx:1.24-alpine版本,标准版没有vi命令,后续操作需要vi修改配置

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: test-istio
spec:
  selector:
    matchLabels:
      server: web
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        server: web
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24-alpine
        ports:
        - containerPort: 80

nginx应用service

apiVersion: v1
kind: Service
metadata:
  name: web-svc
  namespace: test-istio
spec:
  ports:
  - name: port
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    server: web
    app: nginx

httpd的deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: httpd
  name: httpd
  namespace: test-istio
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpd
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: httpd
        server: web
    spec:
      containers:
      - image: httpd:latest
        name: httpd

httpd应用的service


apiVersion: v1
kind: Service
metadata:
  name: web-httpd
  namespace: test-istio
spec:
  ports:
  - name: port
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    server: web
    app: httpd

一个curl的client端,用于请求使用

也可以直接用上面的nginx pod


apiVersion: apps/v1
kind: Deployment
metadata:
  name: curl-client
  namespace: test-istio
spec:
  selector:
    matchLabels:
      app: curl-client
  replicas: 1
  template:
    metadata:
      labels:
        app: curl-client
    spec:
      containers:
      - name: test
        image: curlimages/curl:latest
        command:
        - sleep
        - "36000"

故障注入

这里先介绍故障注入【因为后续的超时和重试需要借助故障注入进行演示】

VirtualService支持的故障注入:有延时注入,和中止注入

CRD代码


type HTTPFaultInjection struct {
  state         protoimpl.MessageState
  sizeCache     protoimpl.SizeCache
  unknownFields protoimpl.UnknownFields

  // Delay requests before forwarding, emulating various failures such as
  // network issues, overloaded upstream service, etc.
  Delay *HTTPFaultInjection_Delay `protobuf:"bytes,1,opt,name=delay,proto3" json:"delay,omitempty"`
  // Abort Http request attempts and return error codes back to downstream
  // service, giving the impression that the upstream service is faulty.
  Abort *HTTPFaultInjection_Abort `protobuf:"bytes,2,opt,name=abort,proto3" json:"abort,omitempty"`
}

注入延时

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: web-vs
  namespace: test-istio
spec:
  hosts:
  - test.com
  http:
  - fault:
      delay:
        percentage:
          value: 100
        fixedDelay: 5s
    route:
    - destination:
        host: web-svc
        port:
          number: 80

示例表示:100%的请求都将进行延时,延时时间5s

验证延时

kubectl -n test-istio exec -it client-curl sh 
# 执行命令
curl -w '\nTotal time: %{time_total}\n' -s test.com

注入中止

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: web-vs
  namespace: test-istio
spec:
  hosts:
  - test.com
  http:
  - fault:
      abort:
        percentage:
          value: 100
        httpStatus: 500
    route:
    - destination:
        host: web-svc
        port:
          number: 80

所有的请求都将请求失败,返回状态码 500

在将返回状态码修改为503试试

如果有兴趣,可以再尝试修改注入故障的百分比试试

超时和重试策略

超时

超时的示例将通过为nginx服务设置超时时间,然后为httpd注入超时时间,通过nginx转发请求到httpd来达到超时的效果【nginx服务需要在设置的超时时间内返回】


# httpd 的VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: web-httpd
  namespace: test-istio
spec:
  hosts:
  - example123.com
  http:
  - fault:
      delay:
        percentage:
          value: 100
        fixedDelay: 5s
    route:
    - destination:
        host: web-httpd
        port:
          number: 80

 # nginx 的 VirtualService      
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: web-vs
  namespace: test-istio
spec:
  hosts:
  - test.com
  http:
  - timeout: 3s
    route:
    - destination:
        host: web-svc
        port:
          number: 80

nginx超时时间 3是,httpd的延时注入 5s

配置之前client请求一下,正常返回

下面进入nginx,修改配置,以达成转发到httpd的需求


vi /etc/nginx/conf.d/default.conf
# 替换为自己的pod
kubectl -n test-istio exec -it nginx-v2-5d65f8f449-kqh5v sh

# 修改 web-httpd 是httpd的service
location / {
      #  root   /usr/share/nginx/html;
      #  index  index.html index.htm;
      proxy_pass http://example123.com;
 }
 # 查看配置是否正确
 nginx -t
 
 # 重载配置
 nginx -s relaod

请求httpd

请求nginx

把超时时间修改为6是,再次尝试 ,请求可以正常返回了

注意:如果你在验证过程中,出现无法解析域名,或者解析域名但是访问test.com 时,返回一些莫名的数据,那么请尝试更换 example123.com 为其他值,在学习时我尝试了很多域名,由于设置了延时导致,代理到了网络中真实的域名,返回了各种网站,

这里也可以直接用service的名称来代替,这样可以不用响应莫名的网站

重试

重试:分为两种情况,1、请求超时,2、服务端响应错误

- retries:
      attempts: 3 # 配置重试次数
      perTryTimeout: 1s # 超时重试时间, 超过1s则重试
      retryOn: 5xx # 重试策略

可配置策略:  x-envoy-retry-on

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: web-vs
  namespace: test-istio
spec:
  hosts:
  - test.com
  http:
  - retries:
      attempts: 3
      perTryTimeout: 1s
      retryOn: 5xx
    route:
    - destination:
        host: web-svc
        port:
          number: 80

示例配置重试三次,重试重试时间1s,重试策略所有5xx响应码

4s,本身1s+重试三次 3s

这里还是接着上面的配置进行的,就是nginx转发到httpd,httpd配置了5s延时,下面配置httpd的vs为故障注入——中止50% 


apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: web-httpd
  namespace: test-istio
spec:
  hosts:
  - example123.com
  http:
  - fault:
      abort:
        percentage:
          value: 50
        httpStatus: 503
    route:
    - destination:
        host: web-httpd
        port:
          number: 80

监听nginx的日志

 kubectl -n test-istio logs -f nginx-5d65f8f449-kqh5v -c istio-proxy

换个窗口访问一下

重定向和重写

重定向

Redirect 指的是将请求到原目标服务的流量重定向到给另外一个目标服务,客户端请求时不用更改任何方式从而访问到重定向后的目标服务。

type HTTPRedirect struct {
  state         protoimpl.MessageState
  sizeCache     protoimpl.SizeCache
  unknownFields protoimpl.UnknownFields

  // On a redirect, overwrite the Path portion of the URL with this
  // value. Note that the entire path will be replaced, irrespective of the
  // request URI being matched as an exact path or prefix.
  Uri string `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"`
  // On a redirect, overwrite the Authority/Host portion of the URL with
  // this value.
  Authority string `protobuf:"bytes,2,opt,name=authority,proto3" json:"authority,omitempty"`
  // Types that are assignable to RedirectPort:
  //
  //  *HTTPRedirect_Port
  //  *HTTPRedirect_DerivePort
  RedirectPort isHTTPRedirect_RedirectPort `protobuf_oneof:"redirect_port"`
  // On a redirect, overwrite the scheme portion of the URL with this value.
  // For example, `http` or `https`.
  // If unset, the original scheme will be used.
  // If `derivePort` is set to `FROM_PROTOCOL_DEFAULT`, this will impact the port used as well
  Scheme string `protobuf:"bytes,6,opt,name=scheme,proto3" json:"scheme,omitempty"`
  // On a redirect, Specifies the HTTP status code to use in the redirect
  // response. The default response code is MOVED_PERMANENTLY (301).
  RedirectCode uint32 `protobuf:"varint,3,opt,name=redirect_code,json=redirectCode,proto3" json:"redirect_code,omitempty"`
}

重定向的CRD定义,可以看出,支持配置

  • uri : 重定向路径

  • authority:重定向后的host

  • Scheme: 重定向的协议

  • RedirectCode:重定向的响应码

  • RedirectPort:重定向端口

这里将发送到nginx的请求重定向到httpd

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: web-vs
  namespace: test-istio
spec:
  hosts:
  - web-svc
  http:
  - match:
    - uri:
        prefix: /
    redirect:
      uri: /
      authority: web-httpd

将向ningx的service 的请求重定向到httpd的service的请求,【这里使用的是前缀匹配,所有物理是访问 web-svc,还是web-svc/123, web-svc/456 都会重定向到 web-httpd】

curl -i参数是打印 响应体, -L参数是跟随 重定向

重写

将请求转发给目标服务前修改HTTP请求中指定部分的内容,目标服务也可以是服务本身【既是只对请求路径进行调整】

重写服务自身的接口路径

进入nginx修改nginx的配置

vi /etc/nginx/conf.d/default.conf

location /home/ {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
   
    }

    location / {
       proxy_pass http://web-httpd;
       proxy_http_version 1.1;
    }

重载nginx配置 nginx -s reload

配置请求路径为 /home/ 前缀时跳转到 / 【根路径代理到了httpd服务】


apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: web-vs
  namespace: test-istio
spec:
  hosts:
  - web-svc
  http:
  - match:
    - uri:
        prefix: /home/
    rewrite:
      uri: /
    route:
    - destination:
        host: web-svc
        port:
          number: 80

进入client请求一下

重写到其他服务

将httpd服务重写到nginx

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: web-vs
  namespace: test-istio
spec:
  hosts:
  - web-httpd
  http:
  - match:
    - uri:
        prefix: /
    rewrite:
      uri: /
    route:
    - destination:
        host: web-svc
        port:
          number: 80

请求一下

到这里VirtualService的主要功能就演示完成了,后续回继续介绍istio其他相关资源,例如DestinationRule

参考:

Istio / Virtual Service

原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1475175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爆火的1分钟声音克隆GPT-SoVITS项目 linux系统 ubuntu22.04安装2天踩坑教程

原项目地址:https://github.com/RVC-Boss/GPT-SoVITS 1分钟素材,最后出来的效果确实不错。 1. cuda环境安装 cuda环境准备 根据项目要求在cuda11.8和12.3都测试了通过。我这里是用cuda11.8 cuda11.8安装教程: ubuntu 22.04 cuda多版本和…

《Large Language Models for Generative Information Extraction: A Survey》阅读笔录

论文地址:Large Language Models for Generative Information Extraction: A Survey 前言 映像中,比较早地使用“大模型“”进行信息抽取的一篇论文是2022年发表的《Unified Structure Generation for Universal Information Extraction》,也…

腾讯云4核8G的云服务器性能水平?使用场景说明

腾讯云4核8G服务器适合做什么?搭建网站博客、企业官网、小程序、小游戏后端服务器、电商应用、云盘和图床等均可以,腾讯云4核8G服务器可以选择轻量应用服务器4核8G12M或云服务器CVM,轻量服务器和标准型CVM服务器性能是差不多的,轻…

第十四天-网络爬虫基础

1.什么是爬虫 1.爬虫(又被称为网页蜘蛛,网络机器人),是按照一定规则,自动的抓取万维网中的程序或者脚本,是搜索引擎的重要组成;比如:百度、 2.爬虫应用:1.搜索引擎&…

谈谈高并发系统的设计方法论

谈谈高并发系统的设计方法论 何为高并发系统?什么是并发(Conurrent)?什么是高并发(Hight Concurrnet)?高并发的衡量指标有哪些? 实现高并发系统的两大板块高并发系统应用程序侧的设计…

Linux学习笔记11——用户组添加删除

Linux 是多用户多任务操作系统,换句话说,Linux 系统支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响。 例如,某台 Linux 服务器上有 4 个用户,分别是 root、www、ftp 和 mysql&…

编程遗产:祖传代码

在浩瀚的代码海洋中,隐藏着一段鲜为人知的遗产——祖传代码。这些代码不仅仅是冰冷的指令和逻辑,更是一代代程序员心血的结晶,充满了温情和趣味。 让我们在脑子里画一幅画,有位祖先是一位技艺高超的程序员,他们在那个…

11 Redis之高并发问题(读+写) + 缓存预热+分布式锁

8. 高并发问题 Redis做缓存虽减轻了DBMS的压力,减小了RT(Response Time),但在高并发情况下也是可能会出现各种问题的。 8.1 缓存穿透 当用户访问的数据既不在数据库中也不在缓存中,如id为“-1”的数据或id为特别大不存在的数据, 这时的用户…

单晶银粉在光伏发电和电子电气领域需求旺盛 我国市场国产化进程有望加快

单晶银粉在光伏发电和电子电气领域需求旺盛 我国市场国产化进程有望加快 单晶银粉指以单晶形式存在的银材料。与普通银粉相比,单晶银粉具有化学稳定性好、光学透过率高、导电性佳、导热性好、易于加工、纯度高等优势,在光伏发电、电子电气等领域拥有广阔…

【Python笔记-设计模式】中介者模式

一、说明 中介者模式是一种行为设计模式,减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。 (一) 解决问题 降低系统中对象之间的直接通信,将复杂的交互转化为通过中介者进行的间接交…

Django配置静态文件

Django配置静态文件 目录 Django配置静态文件静态文件配置调用方法 一般我们将html文件都放在默认templates目录下 静态文件放在static目录下 static目录大致分为 js文件夹css文件夹img文件夹plugins文件夹 在浏览器输入url能够看到对应的静态资源,如果看不到说明…

4核8G服务器选阿里云还是腾讯云?价格性能对比

4核8G云服务器多少钱一年?阿里云ECS服务器u1价格955.58元一年,腾讯云轻量4核8G12M带宽价格是646元15个月,阿腾云atengyun.com整理4核8G云服务器价格表,包括一年费用和1个月收费明细: 云服务器4核8G配置收费价格 阿里…

Ubuntu上Jenkins自动化部署Gitee上SpringBoot项目

文章目录 安装安装JDK安装Maven安装GitNodeJS安装(可选)安装Jenkins 配置Jenkins为Jenkins更换插件源设置jenkins时区安装插件全局工具配置添加Gitee凭证Gitee项目配置 部署后端1.新建任务2.配置源码管理3.构建触发器4.到Gitee中添加WebHook5.构建环境6.…

nodejs 实现pdf与图片互转

PDF转图片 效果图 代码 const path require(path); const pdf require(pdf-poppler); const fs require(fs); // PDF文件路径 const pdfFilePath ./path/test.pdf; // 转换选项 const opts { format: png, // 输出图片格式,可以是 jpeg, png, ppm…

绿色蔬菜销售管理系统

** 🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅** 一 、设计说明 1.1 研究…

Java毕业设计-基于springboot开发的漫画之家系统-毕业论文+PPT(有源代码)

文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1.开发说明2.需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、后台模块3、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的漫画之家系统-毕业论…

day03_登录注销(前端接入登录,异常处理, 图片验证码,获取用户信息接口,退出功能)

文章目录 1. 前端接入登录1.1 修改前端代码1.2 跨域请求1.2.1 跨域请求简介1.2.2 COSR概述CORS简介CORS原理 1.2.3 CORS解决跨域 2. 异常处理2.1 提示空消息分析2.2 系统异常分类2.3 异常处理2.2.1 方案一2.2.2 方案二 3. 图片验证码3.1 图片验证码意义3.2 实现思路3.3 后端接口…

4核8g服务器能支持多少人访问?

腾讯云4核8G服务器支持多少人在线访问?支持25人同时访问。实际上程序效率不同支持人数在线人数不同,公网带宽也是影响4核8G服务器并发数的一大因素,假设公网带宽太小,流量直接卡在入口,4核8G配置的CPU内存也会造成计算…

MQTT协议解析:揭秘固定报头、可变报头与有效载荷的奥秘

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种轻量级的通讯协议,常用于远程传感器和控制设备的通讯。MQTT协议基于发布/订阅模式,为大量计算能力有限且工作在低带宽、不可靠网络环境中的设备…

跨境支付介绍

1、跨境电商定义和分类; 2、国际贸易清结算; 3、跨境支付; 1、跨境电商定义和分类 跨境电商业务简单说就是指不同国家地域的主体通过电子商务进行交易的一种业务模式。同传统的电商不同,交易双方属于不同的国家。因此&#xff0…