zoukankan      html  css  js  c++  java
  • Istio 网络弹性 实践 之 故障注入 和 调用超时

    网络弹性介绍

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


    超时时间

    工作中常常会碰到这样的开发、测试场景,比如:“对方处理请求时间过长,没有及时响应,我们的程序要怎么处理来确保不会无限期地等待”。常见的处理方式是被调用方使用 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

    添加和修改如下内容:

    spacer.gifclipboard10.png

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

    spacer.gifclipboard11.png

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


    超时实例验证

    登录 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)运行成功。

  • 相关阅读:
    eclipse优化与标准化记录
    eclipse easyexplorer openexplorer
    java获取class所在jar
    ajax提交复杂对象数据
    bootstrap dialog自行控制窗口的关闭
    jquery重置html form
    html button自动提交表单问题
    jquery TypeError: 'undefined' is not a function (evaluating 'elem.nodeName.toLowerCase()') [jquery.js:1904]错误原因
    推荐两个很好用的javascript模板引擎
    API的非向后兼容性无论如何通常代表着一种比较差的设计
  • 原文地址:https://www.cnblogs.com/Serverlessops/p/13540121.html
Copyright © 2011-2022 走看看