ASM网关在缩容或滚动重启时,会删除网关Pod而导致少量流量损失。启用SLB连接优雅下线功能后,即使删除网关Pod,现有连接在一定时间内仍能正常传输,流量将不会有损失。本文介绍如何使用SLB连接优雅下线功能。

前提条件

步骤一:启用SLB优雅下线功能

您可以根据实际情况在新建网关时或为已有网关启用SLB优雅下线功能。

新建网关时启用SLB优雅下线功能

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏单击ASM网关,然后在右侧页面单击创建
  5. 创建页面选择集群,设置负载均衡类型公网访问,在新建负载均衡下选择负载均衡规格,设置网关副本数10,其他参数采用默认设置。
  6. 单击高级选项,选中SLB优雅下线,输入连接超时时间,单击创建

为已有网关启用SLB优雅下线功能

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏单击ASM网关
  5. ASM网关页面单击目标网关的名称。
  6. 网关详情页面高级选项区域单击SLB优雅下线右侧的修改图标,选中SLB优雅下线,输入连接超时时间,单击确认

步骤二:部署示例应用

  1. 通过kubectl工具连接集群
  2. 使用以下内容创建httpbin.yaml
    
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          serviceAccountName: httpbin
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
  3. 执行以下命令,部署httpbin应用。
    kubectl apply -f httpbin.yaml -n default

步骤三:创建虚拟服务和网关规则

  1. 创建虚拟服务。
    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 在网格详情页面左侧导航栏选择流量管理 > 虚拟服务,然后在右侧页面单击使用YAML创建
    5. 选择命名空间,选择任意场景模板,将以下内容替换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
  2. 创建网关规则。
    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 在网格详情页面左侧导航栏选择流量管理 > 网关规则,然后在右侧页面单击使用YAML创建
    5. 选择命名空间,选择任意场景模板,将以下内容替换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
  3. 验证路由配置是否成功。
    1. 获取ASM网关地址,具体操作,请参见添加入口网关服务
    2. 在浏览器地址栏中输入http://<ASM网关地址>
      httpbin

      显示如上页面,说明路由配置成功。

步骤四:验证启用SLB连接优雅下线功能后的效果

  1. 根据您使用的操作系统,安装并下载轻量级压测工具hey的对应版本。具体操作,请参见hey
    以下为各个操作系统对应的hey版本:
    • Linux 64-bit:hey-release.s3.us-east-2.amazonaws.com/hey_linux_amd64
    • Mac 64-bit:hey-release.s3.us-east-2.amazonaws.com/hey_darwin_amd64
    • Windows 64-bit:hey-release.s3.us-east-2.amazonaws.com/hey_windows_amd64
  2. 缩容ASM网关。
    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 在网格详情页面左侧导航栏单击ASM网关
    5. ASM网关页面单击目标网关右侧操作列下的查看YAML
    6. 编辑对话框设置replicaCount的参数值为1,然后单击确定
      缩容
  3. 查看启用SLB连接优雅下线功能后的流量损失情况。

    执行以下命令,以200并发,50000请求数请求httpbin应用。

    hey -c 200 -n 50000  -disable-keepalive   http://{ASM网关IP}/

    预期输出:

    ............
    Status code distribution:
      [200] 50000 responses

    可以看到,50000个请求全部返回200状态码,也就是说50000个请求都访问成功,流量没有损失。

    如果在没有启用SLB优雅下线功能情况下,在ASM网关Pod缩容时,以200并发,50000请求数请求httpbin应用。

    Status code distribution:
      [200] 49747 responses
    
    Error distribution:
      [253] Get "http://47.55.2xx.xx": dial tcp 47.55.2xx.xx:80: connect: connection refused

    50000个请求中仅49747个请求返回200状态码,也就是说仅49747个请求访问成功,流量有少量的损失。