开发者社区> 问答> 正文

为什么注入Sidecar代理后,耗时较长的请求会丢失或失败

已解决

为Pod注入Sidecar代理后,当Pod停止时,存在以下两个问题:

  • 调用该Pod的一些耗时较长的请求会丢失。
  • 使用该Pod调用其他服务可能会失败。

展开
收起
游客rda5n5ukztvu2 2022-10-27 17:10:49 75 0
1 条回答
写回答
取消 提交回答
  • 采纳回答

    问题原因

    为Pod注入Sidecar代理后,业务Pod的流量会被istio-proxy代理。当Pod开始停止时,对应的Service不再转发流量给Pod。

    在Istio中,默认收到退出信号5秒后会强制停止istio-proxy,不再接收新的Inbound连接(入口流量),将会继续处理存量的Inbound连接,Outbound连接(出口流量)不受影响,可以正常发起。如果被停止的服务提供的接口调用的耗时较长,已有的Inbound连接和Outbound连接即使没有处理完成也会被终止。

    解决方案

    方案一:修改Sidecar代理终止等待时长

    您可以延长Sidecar代理终止等待时长,使得Inbound和Outbound连接可以在该时长内处理完成。

    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > Sidecar代理配置
    5. Sidecar代理配置页面单击命名空间页签。
    6. 选择命名空间,单击Sidecar代理终止等待时长,输入时间,单击更新设置

    方案二:配置Sidecar代理生命周期

    如果您无法预估请求的最大等待时长,建议配置Sidecar代理生命周期的preStop脚本。使用preStop脚本判断是否还存在请求连接,无请求连接后,将等待默认时长(5秒)再完成退出 。

    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > Sidecar代理配置
    5. Sidecar代理配置页面单击命名空间页签。
    6. 选择命名空间,单击Sidecar代理生命周期,将以下内容输入到文本框中,单击更新设置
    {  "postStart": {    "exec": {      "command": [        "pilot-agent",        "wait"      ]    }  },  "preStop": {    "exec": {      "command": [        "/bin/sh",        "-c",        "while [ $(netstat -plunt | grep tcp | grep -v envoy | wc -l | xargs) -ne 0 ]; do sleep 1; done"      ]    }  }}
    2022-10-27 17:18:53
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载