• 腾讯微服务平台TSF学习笔记(一)--如何使用TSF的Sidecar过滤器实现mesh应用的故障注入


    故障注入前世今生

    故障注入是一种系统测试方法,通过引入故障来找到系统的bug,验证系统的稳健性。istio支持延迟故障注入和异常故障注入。

    在服务网格和API网关等基础设施中,故障注入通常可以通过配置来实现,在Istio和Envoy中,可以使用EnvoyFilter或VirtualService资源来配置故障注入规则。通过这种方式,可以在不修改应用代码的情况下实现故障注入,便于测试和验证系统的健壮性。

    Envoy

    Envoy作为数据面代理,连接和流量处理的核心是网络过滤器(Network Filter),该过滤器一旦融合进过滤器链(Filter Chain),就可以实现访问控制、数据或协议转换、数据增强、审计等高级功能。通过添加新的过滤器,可以用来扩展Envoy的已有功能集。
    在istio中,可以直接设置故障注入配置信息:

    kubectl get vs xxx-svr -o yaml -n ns
    
    • 1
    spec:
      host:
      - xxx-svr
      http:
      - fault:
        abort:
          httpstatus: 500
          percent: 50
        delay:
          fixedDelay: 1s
          percent: 100
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    envoy官方对于故障注入的建议:https://cloudnative.to/envoy/configuration/http/http_filters/fault_filter.html
    腾讯云官对于sidecar过滤器的描述和使用建议:https://cloud.tencent.com/document/product/649/43495

    设置故障注入-延迟类型

    鉴于envoy的特点,我们可以用它来实现故障注入,新建一个sidecar过滤器,填写以下内容:
    过滤器名称:任意合法名称
    作用位置:作为服务端
    脚本内容:

    function envoy_on_request(request_handle)
        --自定义部分,定义延迟概率和延迟时间的请求头
        local delay_percent = tonumber(request_handle:headers():get("x-delay-percent"))
        local delay_duration = tonumber(request_handle:headers():get("x-delay-duration"))
    
        if delay_percent and delay_duration then
            local random_value = math.random(100)
            if random_value < delay_percent then
                request_handle:logInfo("Injecting delay for " .. delay_duration .. " ms")
                os.execute("sleep " .. tostring(delay_duration / 1000))
            end
        end
    end
    function envoy_on_response(response_handle)
        --自定义部分
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    随后,登录到其他mesh应用(user)所在的节点上,执行命令:

    持续请求,该脚本从HTTP请求头中读取x-delay-percent和x-delay-duration字段,然后根据这些字段的值决定是否注入延迟。如果随机数小于x-delay-percent,则注入延迟(单位:毫秒)
    while true;do curl shop:80/api/v6/shop/items -H "x-delay-percent: 50" -H "x-delay-duration: 1000";sleep 1;done
    
    • 1
    • 2

    然后我们就可以观察到,请求成功,进入调用链页面可以观察到,大概有50%的请求,被延迟了1000ms

    在这里插入图片描述
    查看envoy日志,可以查看到"Injecting delay for 1000ms "字样
    在这里插入图片描述

    设置故障注入-延迟类型并带有自定义状态码

    当延迟类型的异常发生时,返回自定义状态码567:

    function envoy_on_request(request_handle)
        --自定义部分
    end
    function envoy_on_response(response_handle)
        local delay_percent = 50 --50% 异常
        local delay_duration = 1000 --延迟1000ms
    
        local random_value = math.random(100)
        if random_value < delay_percent then
            response_handle:logInfo("Injecting delay for " .. delay_duration .. " ms")
            os.execute("sleep " .. tostring(delay_duration / 1000))
            response_handle:headers():replace(":status", "567")
        end
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    总结

    和阿里给的一模一样嘛!excited!
    在这里插入图片描述

  • 相关阅读:
    Intel-Hex , Motorola S-Record 格式详细解析
    MVP 聚技站|.NET C# 系列(三):向 C# 控制台应用程序添加逻辑
    南昌某高校遭黑客攻击被罚款,网络安全工作需真正重视起来!
    python性能分析
    vue下载xlsx表格
    如何在PostgreSQL中使用pg_stat_statements插件进行SQL性能统计和分析?
    Ubuntu关闭防火墙、关闭selinux、关闭swap
    MySQL主从复制与读写分离
    React 与 TS 结合使用 Hook 总结
    LST list删除与修改
  • 原文地址:https://blog.csdn.net/weixin_44988779/article/details/134491311