网络弹性介绍

网络弹性也称为运维弹性,是指网络在遇到灾难事件时快速恢复和继续运行的能力。灾难事件的范畴很广泛,比如长时间停电、网络设备故障、恶意入侵等。


超时时间

工作中常常会碰到这样的开发、测试场景,比如:“对方处理请求时间过长,没有及时响应,我们的程序要怎么处理来确保不会无限期地等待”。常见的处理方式是被调用方使用 sleep 语句模拟响应时间过长,调用方设定请求超时时间过短,来造成请求超时的结果。但是这种处理方法有很多的弊端,第一:本属于网络弹性层的东西,却需要在代码中体现;第二:超时时间设置过长可能导致过多的延迟、设置过短可能导致不必要的失败,因此超时时间需要动态调整。基于上面两个弊端,Istio 使用虚拟服务来优雅实现超时处理。


Istio 超时实例

本实例需要结合 Istio 故障注入模拟被调用方响应请求慢的场景,有关 Istio 失败注入之延迟请参考本人的另外一篇博文,简单到让你分分钟轻松完爆。

该实例的架构图如下:

架构说明如下,本实例就是模拟客户端调用 nginx,nginx 将请求转发给 tomcat 的常见功能。tomcat 响应请求设置为 5s(通过故障注入实现,相当于 sleep 5s 逻辑),nginx 设置 client 的请求超时时间为 2s。因为 nginx 需要在 2s 内返回给 client,而 nginx 请求 tomcat 却需要 5s,因此模拟 client 调用 nginx 超时的情景。

该实例资源文件一共有 4 个,分别如下:

client.yaml # 客户端资源

deploy.yaml # nginx、tomcat 的 deployment 资源

svc.yaml # nginx、tomcat 的 service 资源

vs.yaml # Istio 虚拟资源

client.yaml 文件

资源内容如下图所示:

apiVersion: apps/v1
kind: Deployment
metadata:
name: client
spec:
replicas: 1
selector:
matchLabels:
app: client
template:
metadata:
labels:
app: client
spec:
containers:
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c", "sleep 3600"]

deploy.yaml

资源内容如下图所示:

---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
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: nginx:1.14-alpine
imagePullPolicy: IfNotPresent
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
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

svc.yaml

资源内容如下图所示:

---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
server: nginx
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
spec:
selector:
server: tomcat
ports:
- name: http
port: 8080
targetPort: 8080
protocol: TCP

vs.yaml

Istio 虚拟服务资源内容如下所示:

---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: jiuxi-nginx-vs
spec:
hosts:
- nginx-svc
http:
- route:
- destination:
host: nginx-svc
timeout: 2s
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: jiuxi-tomcat-vs
spec:
hosts:
- tomcat-svc
http:
- fault:
delay:
percentage:
value: 100
fixedDelay: 5s
route:
- destination:
host: tomcat-svc

此虚拟服务有两个知识点。

第一:故障注入:

http:
- fault:
delay:
percentage:
value: 100
fixedDelay: 5s

该设置说明每次调用 tomcat-svc 的 k8s service,都会延迟 5s 才会调用。

第二:调用超时:

hosts:
- nginx-svc
http:
- route:
- destination:
host: nginx-svc
timeout: 2s

该设置说明调用 nginx-svc 的 k8s service,请求超时时间是 2s。


超时实例部署

在上面我们编写完样例,下面准备部署。

Istio 注入

需要对 client 和 deploy 资源文件进行 Istio 注入,将 client、nginx、tomcat 都放入到网格中。本人是手工注入 Istio 方式,如果你设置了自动 Istio 注入不会影响,一样可以轻松完爆。

istioctl kube-inject -f client.yaml | kubectl apply -f -

istioctl kube-inject -f deploy.yaml | kubectl apply -f -

执行成功后,通过 kubectl get pods 查看 Istio 注入情况:

部署 k8s service

部署 svc.yaml:

kubectl apply -f svc.yaml

部署 Istio 虚拟服务

部署 vs.yaml:

kubectl apply -f vs.yaml


超时实例设置

因为要用到 nginx 对 tomcat 的转发功能,因此需要对 nginx 做一些设置:

登录 nginx pod:

kubectl exec -it nginx-7559f7d487-djzbb -- sh

编辑 nginx 配置文件:

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

添加和修改如下内容:

编辑完后,再执行如下语句验证配置和让配置生效:

自此,整个样例配置和部署完毕。


超时实例验证

登录 client,执行如下语句:

kubectl exec -it client-5b77d5949f-nzdtl -- sh

执行如下语句:

wget -q -O - http://nginx-svc

执行结果如下所示:

/ # time wget -q -O - http://nginx-svc
wget: server returned error: HTTP/1.1 504 Gateway Timeout
Command exited with non-zero status 1
real 0m 2.02s
user 0m 0.00s
sys 0m 0.00s

说明 timeout 样例运行成功。

也可以同样验证故障注入效果,执行如下语句:

/ # time wget -q -O - http://tomcat-svc
<!DOCTYPE html>
<html lang="en">
...
</html>
real 0m 5.01s
user 0m 0.00s
sys 0m 0.00s

执行效果是请求 5s 后才会返回,说明 Istio 故障注入(延迟 5s)运行成功。

Istio 网络弹性 实践 之 故障注入 和 调用超时的更多相关文章

  1. Istio 网络弹性 实践 之 故障注入 和 调用重试

    网络弹性介绍 网络弹性也称为运维弹性,是指网络在遇到灾难事件时快速恢复和继续运行的能力.灾难事件的范畴很广泛,比如长时间停电.网络设备故障.恶意入侵等. 重试(attempts) Istio 重试机制 ...

  2. Istio技术与实践02:源码解析之Istio on Kubernetes 统一服务发现

    前言 文章Istio技术与实践01: 源码解析之Pilot多云平台服务发现机制结合Pilot的代码实现介绍了Istio的抽象服务模型和基于该模型的数据结构定义,了解到Istio上只是定义的服务发现的接 ...

  3. <网络攻防实践> 课程总结20169216

    课程总结20169216 每周作业链接汇总 第一周作业:Linux基础入门(1-5).基本概念及操作 第二周作业:linux基础入门(6-11).网络攻防技术概述网络攻防试验环境搭构.Kali教学视频 ...

  4. 20169214 2016-2017-2 《网络攻防实践》第十一周实验 SQL注入

    20169214 2016-2017-2 <网络攻防实践>SQL注入实验 SQL注入技术是利用web应用程序和数据库服务器之间的接口来篡改网站内容的攻击技术.通过把SQL命令插入到Web表 ...

  5. PHP网络爬虫实践:抓取百度搜索结果,并分析数据结构

    百度的搜索引擎有反爬虫机制,我先直接用guzzle试试水.代码如下: <?php /** * Created by Benjiemin * Date: 2020/3/5 * Time: 14:5 ...

  6. connect调用超时的实现方式

    第二种更通用的.使connect调用超时的方法是使套接字成为无阻塞的,然后用select等待它完成.这种方法避免了使用alarm时遇到的很多问题,但我们必须承认,即使是在UNIX实现中,这种方法还是存 ...

  7. feign调用超时

    Feign调用超时 feign调用超时 默认feign调用超时是1秒,断点调试是否调用成功肯定超时 feign.hystrix.enabled=true #feign调用默认是1000毫秒=1秒 ad ...

  8. 客户端设置WebService调用超时时间

    刚接触WebService,对如何在客户端设置WebService调用超时时间查阅了一些资料,现总结如下: ============================================== ...

  9. Dubbo启动,调用方法失败【问题:调用超时】

    今天,启动dubbo,开始写项目. 在一个调用dubbo里面的一个方法时,程序一直调用,每次显示报红. 很难搞. 问题代码 com.alibaba.dubbo.rpc.RpcException: Fa ...

随机推荐

  1. 郭神的关于git软件和http的文章

    https://blog.csdn.net/guolin_blog/article/details/17482095

  2. JavaScript基础内容

    javascript:是个脚本语言,需要有宿主文件,他的宿主文件是html文件.用来交互的 Javascript基础  写法分类: 1.内联(行内):写在标签里面,以事件属性表现 属性名就是事件属性名 ...

  3. Alink漫谈(十五) :多层感知机 之 迭代优化

    Alink漫谈(十五) :多层感知机 之 迭代优化 目录 Alink漫谈(十五) :多层感知机 之 迭代优化 0x00 摘要 0x01 前文回顾 1.1 基本概念 1.2 误差反向传播算法 1.3 总 ...

  4. 安装fiddler 谷歌插件

    移动 .crx 插件无法安装问题 解决方案: 修改后缀名为 .zip 文件 进行解压后,使用浏览器扩展程序加载已解压的文件进行扩展 添加插件 2020-06-20

  5. 使用types库修改函数

    import types class ppp: pass p = ppp()#p为ppp类实例对象 def run(self): print("run函数") r = types. ...

  6. PHP array_merge_recursive() 函数

    实例 把两个数组合并为一个数组: <?php$a1=array("a"=>"red","b"=>"green&q ...

  7. PHP log10() 函数

    实例 返回不同数的以 10 为底的对数: <?phpecho(log10(2.7183) . "<br>");echo(log10(2) . "< ...

  8. PHP xml_parser_create_ns() 函数

    定义和用法 xml_parser_create_ns() 函数创建带有命名空间支持的 XML 解析器.高佣联盟 www.cgewang.com 如果成功,该函数则返回可被其它 XML 函数使用的资源句 ...

  9. Ubuntu chmod 命令修改文件chmod读写权限

    Ubuntu chmod 命令可以用来修改文件或文件夹的读写权限 chmod 命令有两种使用方式 一. chmod [u/g/o/a] [+/-/=] [r/w/x] filename [ ]里都代表 ...

  10. luogu P2607 [ZJOI2008]骑士 tarjan dp

    LINK:骑士 本来是不打算写的 发现这道题在tarjan的时候有一个坑点 所以写出来记录一下. 可以发现图可能是不连通的 且一个连通块中是一个奇环树. 做法:类似tarjan找割点 然后把环给拉出来 ...