ASM网关在缩容或滚动重启时,会删除网关Pod而导致少量流量损失。启用优雅下线功能后,即使删除网关Pod,现有连接在一定时间内仍能正常传输,流量将不会有损失。本文介绍如何使用优雅下线功能。
适用范围
已创建ASM实例,且版本为企业版或旗舰版。具体操作,请参见创建ASM实例。
步骤一:启用优雅下线功能
已有网关启用功能
从ASM的1.26版本开始,变更优雅下线配置会导致网关重启,请在低峰期操作。
控制台
登录ASM控制台,在左侧导航栏,选择。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择。
在入口网关页面,单击目标网关的名称。
在网关详情页面,单击高级选项,单击优雅下线右侧的
图标,选中优雅下线,配置连接超时时间(秒),然后单击确认。
YAML配置(ASM版本低于1.26)
为网关YAML配置添加注解(serviceAnnotations)。
apiVersion: istio.alibabacloud.com/v1
kind: IstioGateway
metadata:
name: ingressgateway
namespace: istio-system
spec:
gatewayType: ingress
serviceAnnotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain: 'on' # 开启负载均衡连接排空功能,即优雅下线
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain-timeout: '10' # 连接排空超时时长,取值范围[10, 30]
...YAML配置(ASM版本为1.26及以上)
为网关YAML配置添加注解(annotations)。
apiVersion: istio.alibabacloud.com/v1
kind: IstioGateway
metadata:
annotations:
# 如果是CLB、NLB类型的网关,取值范围[10, 890]
# 如果是ClusterIP和NodePort类型,不设上限。
asm.alibabacloud.com/gateway-drain-timeout-seconds: "30"
name: ingressgateway
namespace: istio-system
...新建网关时启用功能
登录ASM控制台,在左侧导航栏,选择。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择。
在入口网关页面,单击创建。
在创建页面,选择部署集群,设置负载均衡CLB类型为公网访问,在新建负载均衡CLB下选择负载均衡规格,设置网关副本数为10,其他配置项保持默认。
关于配置项的说明,请参见创建入口网关。
单击高级选项,选中优雅下线,配置连接超时时间(秒),然后单击创建。
配置项
说明
优雅下线
选中后,当网关Pod滚动重启时,CLB会平滑排空现有连接,从而最大限度减少对业务的影响。能更好地支持配置变更、网关升级等场景。
连接超时时间(秒)
CLB移除网关Pod后,会等待配置的连接超时时间,然后再断开与Pod的连接。配置该参数,可以给网关Pod提供一个缓冲时间,来处理现有的连接。网关Pod默认优雅下线时间为30秒,CLB侧配置的超时时间通常不应该超过30秒。
1.26版本开始支持最长890秒的超时配置。
步骤二:部署示例应用
使用以下内容,创建httpbin.yaml。
部署httpbin应用。
kubectl apply -f httpbin.yaml -n default
步骤三:创建虚拟服务和网关规则
创建虚拟服务。
登录ASM控制台,在左侧导航栏,选择。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择,然后单击使用YAML创建。
在创建页面,选择命名空间和任意场景模板,配置以下YAML,然后单击创建。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: httpbin namespace: default spec: gateways: - httpbin-gateway hosts: - '*' http: - route: - destination: host: httpbin port: number: 8000
创建网关规则。
在网格详情页面左侧导航栏,选择,然后在右侧页面,单击使用YAML创建。
在创建页面,选择命名空间和任意场景模板,配置以下YAML,然后单击创建。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: httpbin-gateway namespace: default spec: selector: istio: ingressgateway servers: - hosts: - '*' port: name: http number: 80 protocol: HTTP
验证路由配置是否成功。
获取ASM网关地址,具体操作,请参见创建入口网关。
在浏览器地址栏中,输入http://<ASM网关地址>。
显示如下,说明路由配置成功。

步骤四:验证启用优雅下线功能的效果
根据您使用的操作系统,下载并安装轻量级压测工具hey的对应版本。具体操作,请参见hey。
缩容ASM网关。
登录ASM控制台,在左侧导航栏,选择。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择。
在入口网关页面,单击目标网关右侧的查看YAML。
在编辑对话框,将
replicaCount的参数值设置为1,然后单击确定。
执行以下命令,以200并发、50000请求数请求httpbin应用,查看启用优雅下线功能前后的流量损失情况。
hey -c 200 -n 50000 -disable-keepalive http://<ASM网关地址>/类型
结果分析
未启用优雅下线功能
输出结果如下:
Status code distribution: [200] 49747 responses Error distribution: [253] Get "http://47.55.2xx.xx": dial tcp 47.55.2xx.xx:80: connect: connection refused50000个请求中仅49747个请求返回200状态码,说明仅49747个请求访问成功,流量有少量损失。
启用优雅下线功能
输出结果如下:
............ Status code distribution: [200] 50000 responses50000个请求全部返回200状态码,说明50000个请求都访问成功,流量没有损失。