排空

排空(Draining)是 Envoy 相应各种事件试图优雅地关闭连接的过程。例如,在服务器关闭期间,可以阻止现有请求,并将监听器设置为停止接受,以减少服务器关闭时打开的连接数。除个别监听器配置外,服务器选项还定义了排空行为。

排空发生在以下时机:

默认情况下,Envoy 服务器将在服务器关闭时立即关闭监听器。监听器将被直接停止,而没有任何优雅的排空行为,并立即停止接受新的连接。若要在服务器关闭之前的一段时间内排空监听器,可以在服务器关闭之前使用 drain_listeners

若要在关闭监听器之前添加一个优雅的排空周期,请使用查询参数 drain_listeners?graceful 。默认情况下,Envoy 会在一段时间(由 --drain-time-s 确定)内阻止请求。请求阻止的行为由排空管理器确定。

请注意,尽管排空是监听器级别的概念,但前提是必须要在网络过滤器层面支持它。目前,支持优雅排空的过滤器只有 RedisMongoHTTP 连接管理器

默认情况下,HTTP 连接管理器 过滤器会向 HTTP1 请求添加 “Connection: close” ,发送 HTTP2 GOAWAY,并在请求完成时(在延迟的关闭时间之后)终止连接。

每个 已配置监听器 都有一个 drain_type 设置,用来控制排空何时发生。目前支持的值有:

default

Envoy 将在上述三种情况(健康检查失败、热重启和 LDS 更新/删除)发生时排空监听器。这是默认设置。

modify_only

Envoy 只会在上述第二和第三种情况(热重启和 LDS 更新/删除)发生时排空监听器。如果 Envoy 同时托管了 ingress 和 egress 监听器,此设置会很有用。可能需要在 egress 监听器上设置 modify_only,以便它们仅在修改期间排空,而在尝试执行受控关闭时依靠 ingress 监听器排空来执行完整的服务器排空。