Istio 故障注入与重试的实验

news2024/9/30 23:28:21

故障注入


Istio流量治理有故障注入的功能,在接收到用户请求程序的流量时,注入故障现象,例如注入HTTP请求错误,当有流量进入Sidecar时,直接返回一个500的错误请求代码。

通过故障注入可以用来测试整个应用程序的故障恢复能力,注入各种故障现象,针对不同的故障现象做出应对措施。

故障注入有两种类型:

  • 延迟(Delay):注入延迟故障可以模拟出高负载时,模拟出系统响应很慢的一种现象。
  • 中止(abort):注入中止故障可以模拟出系统崩溃,直接返回HTTP错误代码或者TCP连接失败的现象

使用故障注入时,不可用启用超时和重试的配置,故障注入时在VirtualService资源中进行配置的。

两种故障注入的配置清单:

  • 故障注入-延迟配置清单
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: tomcat-vs
  namespace: istio-traffic 
spec:
  http:
  - fault:							#定义故障注入
      delay:						#定义故障注入的延迟配置
        percentage:						#配置要将流量注入故障的比例,这里为100%,也可以针对50%的流量进行故障注入,剩下50%的流量做一些其他路由匹配				
          value: 100
        fixedDelay: 10s					#故障注入延迟响应时间10秒
    route:						#将满足的流量路由到tomcat的service资源上
    - destination:
        host: tomcat-svc

注意:
	1.falut和route是同级参数,当满足故障注入条件的流量会被route进行路由分发。
	2.重试和超时的配置都是在route中设置的,当我们配置了故障注入后就无法再配置超时和重试了。
  • 故障注入-中止配置清单
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: tomcat-vs
  namespace: istio-traffic 
spec:
  http:
  - fault:							#定义故障注入
      abort:						#定义故障注入的中止配置
        percentage:						#配置要将流量注入故障的比例,这里为100%,也可以针对50%的流量进行故障注入,剩下50%的流量做一些其他路由匹配				
          value: 100

        httpStatus: 503
 					#注入的故障为返回一个503的HTTP状态码
    route:						#将满足的流量路由到tomcat的service资源上
    - destination:
        host: tomcat-svc

重试


重试是非常好理解的,如果请求超时那么就会进行重试。

在Istio服务网格中,Envoy代理在请求失败或者超时后,并不会尝试重新连接服务,不会去重试,需要我们来配置Istio的重试机制。重试和超时策略可以同时使用。

 VirtualService资源中重试配置清单:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
    retries:						#定义重试策略
      attempts: 3
					#重试的次数为3次
      perTryTimeout: 2s					#重试的间隔为2秒

在Istio服务网格中,Envoy代理在请求失败或者超时后,并不会尝试重新连接服务,不会去重试,需要我们来配置Istio的重试机制。

重试和超时策略可以同时使用。

VirtualService资源中重试配置清单:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
    retries:						#定义重试策略
      attempts: 3                   #重试的次数为3次
      perTryTimeout: 2s				#重试的间隔为2秒

 

 

 

配置Istio中应用程序的故障注入以及重试


案例描述

 

案例:Nginx反向代理Tomcat服务,Nginx服务的VirtualService开始重试机制,Tomcat服务的VirtualService配置故障注入,永不响应Nginx服务的请求,观察是否会触发重试机制。

大致实现思路:

  • 在Istio中部署一个Nginx服务和一个Tomcat服务,并配置Nginx反向代理Tomcat服务。

  • 通过VirtualService为Nginx服务设置重试次数,当请求失败后进行重试。

  • Tomcat服务通过VirtualService中的故障注入配置返回503错误代码,任何请求都将失败。

  • 此时Nginx再去反向代理Tomcat时,Tomcat只会返回503错误代码,观察是否有重试记录。

创建Namespace并开启Sidecar自动注入。

[root@k8s-master istio-traffic]# kubectl label ns istio-traffic istio-injection=enabled
namespace/istio-traffic labeled

[root@k8s-master istio-traffic]# kubectl create ns istio-traffic
namespace/istio-traffic created

 在Istio中部署Nginx服务

1)编写资源编排文件

[root@k8s-master istio-traffic]# vim nginx-k8s.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-proxy
  namespace: istio-traffic
  labels:
    server: nginx
    app: web
spec:
  replicas: 
1

  selector:
    matchLabels:
      server: nginx
      app: web
  template:
    metadata:
      name: nginx
      labels: 
        server: nginx
        app: web
    spec:
      containers:
      - name: nginx
        image: jiangxlrepo/know-system:v1		#knowsystem镜像中包含了Nginx
        imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: istio-traffic
spec:
  selector:
    server: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP

 2)创建资源并查看资源的状态

1.创建资源
[root@k8s-master istio-traffic]# kubectl apply -f nginx-k8s.yaml
deployment.apps/nginx-proxy created
service/nginx-svc created

2.查看资源的状态
[root@k8s-master istio-traffic]# kubectl get all -n istio-traffic 
NAME                               READY   STATUS    RESTARTS   AGE
pod/nginx-proxy-7c487c794d-wt6nq   2/2     Running   0          53s

NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/nginx-svc   ClusterIP   10.105.3.226   <none>        80/TCP    53s

NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-proxy   1/1     1            1           54s

NAME                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-proxy-7c487c794d   1         1         1       54s

2.3.在Istio中部署Tomcat服务

1)编写资源编排文件

[root@k8s-master istio-traffic]# vim tomcat-k8s.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat
  namespace: istio-traffic
  labels:
    server: tomcat
    app: web
spec:
  replicas: 
1

  selector:
    matchLabels:
      server: tomcat
      app: web
  template:
    metadata:
      name: tomcat
      labels: 
        server: tomcat
        app: web
    spec:
      containers:
      - name: tomcat
        image: docker.io/kubeguide/tomcat-app:v1 
        imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: tomcat-svc
  namespace: istio-traffic
spec:
  selector:
    server: tomcat
  ports:
  - name: http
    port: 8080
    targetPort: 8080
    protocol: TCP

2)创建资源并查看资源的状态

1.创建资源
[root@k8s-master istio-traffic]# kubectl apply -f tomcat-k8s.yaml 
deployment.apps/tomcat created
service/tomcat-svc created

2.查看资源的状态
[root@k8s-master istio-traffic]# kubectl get all -n istio-traffic 
NAME                               READY   STATUS    RESTARTS   AGE
pod/nginx-proxy-7c487c794d-wt6nq   2/2     Running   0          6m1s
pod/tomcat-86ddb8f5c9-7n2xj        2/2     Running   0          16s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/nginx-svc    ClusterIP   10.105.3.226   <none>        80/TCP     6m1s
service/tomcat-svc   ClusterIP   10.100.46.31   <none>        8080/TCP   16s

NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-proxy   1/1     1            1           6m1s
deployment.apps/tomcat        1/1     1            1           16s

NAME                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-proxy-7c487c794d   1         1         1       6m1s
replicaset.apps/tomcat-86ddb8f5c9        1         1         1       16s

2.4.配置Nginx反向代理Tomcat

1.配置Nginx反向代理
[root@nginx-proxy-76ccd8b9fc-8hqbq /]# vim /data/nginx/conf/conf.d/istio-tomcat.conf
server {
	listen 80;
	server_name _;

  	location / {
		proxy_pass http://tomcat-svc:8080;
		proxy_http_version 1.1;
  	}
}

2.重载Nginx配置
[root@nginx-proxy-76ccd8b9fc-8hqbq /]# /data/nginx/sbin/nginx -t
nginx: the configuration file /data/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /data/nginx/conf/nginx.conf test is successful
[root@nginx-proxy-76ccd8b9fc-8hqbq /]# /data/nginx/sbin/nginx -s reload

2.5.配置Nginx服务VirtualService资源中的重试

配置Nginx服务的VirtualService资源,设置超时时间。

1.编写资源编排文件
[root@k8s-master istio-traffic]# vim nginx-vs-att.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: nginx-vs
  namespace: istio-traffic 
spec:
  hosts:
  - nginx-svc					#虚拟主机列表中指定了Nginx的Service资源名称,用于内部调用,接收来自nginx-svc service资源的流量
  http:
  - route:						#将流量转发到nginx-svc Service资源上
    - destination: 
        host: nginx-svc				
    retries:					#定义重试策略
      attempts: 3           	#重试次数为3次
      perTryTimeout: 2s			#重试的间隔为2秒

 
2.创建资源编排文件
[root@k8s-master istio-traffic]# kubectl apply -f nginx-vs-att.yaml
virtualservice.networking.istio.io/nginx-vs created

3.查看资源
[root@k8s-master istio-traffic]# kubectl get vs -n istio-traffic 
NAME       GATEWAYS   HOSTS           AGE
nginx-vs              ["nginx-svc"]   58s

2.6.配置Tomcat服务VirtualService资源中的故障注入

配置Nginx服务的VirtualService资源,设置请求响应的延时时间,将延时时间设置的稍微长一些,经过这段时间后,再返回响应,就可以实现超时配置的效果了。

1.编写资源编排文件
[root@k8s-master istio-traffic]# vim tomcat-vs-att.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: tomcat-vs
spec:
  hosts:
  - tomcat-svc				#虚拟主机列表中指定了Tomcat的Service资源名称,用于内部调用,接收来自tomcat-svc service资源的流量
  http:
  - fault:							#定义故障注入策略
      abort:						#定义中止类型的故障注入
        percentage:						#配置要将流量注入故障的比例,这里为100%,也可以针对50%的流量进行故障注入,剩下50%的流量做一些其他路由匹配				
          value: 100
        httpStatus: 503				#注入的故障为返回一个503的HTTP状态码
    route:						#将满足的流量路由到tomcat的service资源上
    - destination:
        host: tomcat-svc
 
2.创建资源编排文件
[root@k8s-master istio-traffic]# kubectl apply -f tomcat-vs-att.yaml
virtualservice.networking.istio.io/tomcat-vs created

3.查看资源
[root@k8s-master istio-traffic]# kubectl get vs -n istio-traffic
NAME        GATEWAYS   HOSTS            AGE
nginx-vs               ["nginx-svc"]    6m42s
tomcat-vs              ["tomcat-svc"]   4s
3.验证Istio配置的流量重试效果

Tomcat服务配置了故障注入,所有流量请求都会返回503的错误代码,Nginx转发请求到Tomcat,Tomcat不会响应Nginx的请求,此时就会触发配置的重试机制,每隔2两秒进行一次重试,重试三次后退出。

[root@k8s-master istio-traffic]# kubectl run -it  busybox --image busybox:1.28 --restart=Never --rm busybox -n istio-traffic -- sh
/ # wget -q -O - http://nginx-svc
wget: server returned error: HTTP/1.1 503 Service Unavailable
/ # wget -q -O - http://nginx-svc
wget: server returned error: HTTP/1.1 503 Service Unavailable
/ # wget -q -O - http://nginx-svc
wget: server returned error: HTTP/1.1 503 Service Unavailable

我们可以在busybox容器中请求Nginx服务,由Nginx将请求转发到Tomcat中,由于Tomcat无法响应,Nginx发送一次请求后会接着重试3次,当我们执行一次wget的请求时,就会产生4条请求记录,而这4条请求记录会产生8条Envoy代理程序的日志,分别是出入流量的日志,我们可以在日志中清晰的看到每次请求或者重试都会有2条日志记录。

当我们看到日志中一次请求连带了3次重试,就表示重试配置已经生效。

[root@k8s-master ~]# kubectl logs -f nginx-proxy-76ccd8b9fc-8hqbq -c istio-proxy -n istio-traffic 

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

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

相关文章

DYLD--动态链接器

概念 dyld&#xff08;the dynamic link editor&#xff09;是苹果的动态链接器&#xff0c;是苹果操作系统一个重要组成部分&#xff0c;在系统内核 XNU 完成 Mach-O 文件的加载&#xff0c;做好程序准备工作之后&#xff0c;交由 dyld 负责余下的工作。在 macOS 系统中&…

vue2引入lottie动画

说明下&#xff1a;如果你是vue3的话请移步&#xff1a;https://blog.csdn.net/qq_67801847/article/details/128386661&#xff0c;这里只针对vue2. 同时动画官网链接&#xff1a;lottie官网 实现思路&#xff1a; 1. 安装lottie-web (版本无所谓) 2. 在使用的页面引入组件 #…

一起来看看音频转文字怎么弄吧

从前有一个名叫小明的学生&#xff0c;他在学校里总是很喜欢录制各种有趣的音频&#xff0c;包括老师的讲课、同学们的笑声&#xff0c;以及校园里的各种声音。有一天&#xff0c;他在课堂上录下了老师的授课内容&#xff0c;想着晚上回家后再将它们转换成文字&#xff0c;便于…

网络安全(黑客)学习手册

1.什么是网络安全&#xff1f; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一是市场需求量高&#xff1b; 二则是发展…

Python+大数据开发拿到25k的offer!

随着95后、00后的登场&#xff0c;80后好似成为“古早”的存在&#xff0c;看似被生活磨平了棱角的他们&#xff0c;其实也在渴望重新“支棱”起来。今天分享的这位80后的逆袭故事&#xff0c;希望你能感受到他的力量…… 学科 | Python大数据开发 校区 | 北京 薪资 | 25k 我…

【深度学习之YOLO8】视频流推断

官方V8模型下载 需要准备两个东西 simsun.ttc字体包YOLOv8官方模型成品 ScreenCapture屏幕图像类 import cv2 import mss import numpy as npclass ScreenCapture:"""parameters----------screen_resolution : Tuple[int, int]屏幕宽高&#xff0c;分别为x&a…

5.2.11.添加读写接口

5.2.11.添加读写接口 5.2.11.1、在驱动中添加 5.2.11.2、在应用中添加 5.2.11.3、测试 1. app.c #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>#define FILE "/dev/test" // 刚才mknod创建的设…

K8S中网络如何通信

Kubernetes 提出了一个自己的网络模型“IP-per-pod”&#xff0c;能够很好地适应集群系统的网络需求&#xff0c;它有下面的这 4 点基本假设&#xff1a; 集群里的每个 Pod 都会有唯一的一个 IP 地址。Pod 里的所有容器共享这个 IP 地址。集群里的所有 Pod 都属于同一个网段。…

WT588F02B-8S 血压计语音芯片如何选型?低功耗语音ic方案

一、血压计语音提示方案需求设计&#xff1f; 血压计语音提示方案的需求设计是为了实现在测量血压过程中&#xff0c;通过语音提示用户操作指引、测量结果和健康建议等功能。以下是血压计语音提示方案需求设计的主要需求&#xff1a; &#xff08;1&#xff09;测量操作引导 …

QT---day1(QT的介绍、常用类及组件)

代码&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//设置窗口尺寸this->setFixedSize(600,500);//设置窗口标题this->setWindowTitle(&q…

【MySQL】库和表的操作

目录 一、库的操作 1.1创建数据库 1.2创建数据库案例 1.3字符集和校验规则 &#xff08;1&#xff09;查看系统默认字符集以及校验规则 &#xff08;2&#xff09;查看数据库支持的字符集 &#xff08;3&#xff09;查看数据库支持的字符集校验规则 &#xff08;4&…

万向节死锁

要理解万向节死锁的产生原因&#xff0c;首先要理解欧拉角变换&#xff0c;欧拉角变换是基于最初始的坐标进行变换而非变换后的坐标进行变换。 欧拉角变换需要空间中的三个角&#xff08;即变换后每个轴的偏移量&#xff09;&#xff0c;另外还有每个轴的变换顺序。值得注意的…

SpringSecurity6--认证和授权的原理

SpringSecurity6–认证和授权的原理&#xff0c;项目gitee地址在文章末尾。 文章目录 一、Spring Security简介二、Spring Security框架中认证流程中几个非常重要的类1、 FilterChainProxy2、 AbstractAuthenticationProcessingFilter3、 UsernamePasswordAuthenticationFilter…

打开Android device monitor

X:\assdk\tools monitor.bat 双击 更新到最新

如何优雅地下载huggingface上模型,以llama2模型下载为例

背景 由于llama2模型的下载需要经过官方的授权&#xff0c;这就需要登陆hugging face的&#xff0c;对模型页面进行申请。等待审核通过后&#xff0c;才能够下载。如果在单纯用 git lfs 的方式进行下载&#xff0c;需要输入账号和密码。为了更快速地进行下载&#xff0c;既能够…

Java刷题记录(小白边刷边学)7.25

Java刷题记录&#xff08;小白边刷边学&#xff09;7.25 1 最长公共前缀 题目分析: 首先一定需要创建一个数组存储最长公共前缀的值 为了方便比较&#xff0c;先把strs的第一个字符串放进新的数组中即strs[0] 因此比较时从strs【1】开始 数字j需要小于两个被比较的字符串的长度…

视频超分新方法--助力实现高清wav2lip数字人

文章目录 前言一、解决方案详解总结前言 ` 随着人工智能的不断发展,数字人技术也越来越重要,很多人都开启了学习模型 但是使用神级模型wav2lip生成的数字人嘴部不清晰怎么办。 很影响使用效果,接下来教大家如何优化这个问题,如下图所示: 一、解决方案详解 因为wav2lip是…

Centos8+Jenkins+微信小程序前端自动发布体验版

文章目录 **一、 实现&#xff1a;****二、项目&#xff1a;****三、环境配置&#xff1a;****四、步骤&#xff1a;****五、遇到的问题** 一、 实现&#xff1a; jenkins打通微信开发平台&#xff0c;自动上传代码 二、项目&#xff1a; 微信小程序原生开发 三、环境配置&…

PowerPoint如何修改“默认保存路径”?

很多时候&#xff0c;我们做好PPT后都要保存&#xff0c;一般会保存在创建PPT的文件夹里&#xff0c;或者另外设置保存的路径。 如果经常需要制作PPT&#xff0c;又不想每次都要重新选择保存位置&#xff0c;我们可以创建或修改“默认保存路径”&#xff0c;这样每次关闭PPT后…

集群及LVS简介、LVSNAT模式原理、LVSNAT模式配置、LVSDR模式原理、LVSDR模式配置、LVS错误排查

day01 day01集群LVS配置LVS NAT模式配置LVS NAT模式步骤LVS DR模式配置LVS DR模式 集群 将很多机器组织到一起&#xff0c;作为一个整体对外提供服务 集群在扩展性、性能方面都可以做到很灵活 集群分类&#xff1a; 负载均衡集群&#xff1a;Load Balance高可用集群&#x…