在ASM网关中实现会话保持

会话保持(Session Affinity)又称为粘性会话(Sticky Sessions),是一种负载均衡技术,能够确保来自同一用户(或会话)的所有请求均被发送到同一后端服务器。该技术适用于需要保持用户状态的应用,例如在线购物车、登录会话和个性化设置等。

前提条件

功能介绍

本文演示的会话保持基于一致性哈希算法实现。Envoy目前支持RingHash和Maglev两种一致性哈希算法。一致性哈希算法实现的负载均衡是一种软会话保持(Soft Session Affinity),在有端点变化时会有一小部分请求的会话保持失效。基于一致性哈希算法的会话保持能实现更好的负载均衡,对分布式系统更加友好。关于一致性哈希负载均衡的配置介绍,请参见LoadBalancerSettings.ConsistentHashLB

步骤一:将httpbin应用扩容至多副本

使用数据面的KubeConfig,执行以下命令,将httpbin应用扩容至3个副本,用于测试会话保持功能。

kubectl scale deployment/httpbin --replicas 3

步骤二:查看未启用会话保持的效果

  1. 在浏览器中访问http://${ASM网关地址}/status/418,访问成功后进行多次刷新。

    关于如何获取ASM网关地址,请参见获取入口网关地址

  2. 查看网关日志。

    1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

    2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择ASM网关 > 入口网关

    3. 入口网关页面,单击目标网关右侧的日志中心,在网关日志页签的搜索框中加入and 418的搜索条件,单击查询 / 分析,在左下方的原始日志页签,展开upstream_addr索引。

      您可以看到请求较为均匀地分布在3个httpbin Pod上。

      image

步骤三:部署目标规则

使用以下内容,创建目标规则。具体操作,请参见管理目标规则

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: httpbin
  namespace: default
spec:
  host: httpbin.default.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      consistentHash:
        httpCookie:
          name: sticky-session-key
          ttl: 0s

部署该目标规则后,通过网关访问httpbin服务时,如果请求没有携带该Cookie,网关就会根据请求来源和目的地的IP和端口得出一个哈希值,并且在请求返回时设置这个Cookie。之后的请求,如果携带这个Cookie,网关就不会重新生成这个值。这个Cookie会在一致性哈希算法中作为哈希函数的Key输入,进而计算出最终要访问的实际后端。

会话保持的有效性由具体的一致性哈希算法保证。本例中并没有明确配置使用哪个一致性哈希算法,默认使用RingHash算法。ASM从1.16版本开始支持Maglev算法,您可以根据实际需求进行选择。

步骤四:查看启用会话保持的效果

  1. 在浏览器中访问http://${ASM网关地址}/status/333,访问成功后进行多次刷新。

    关于如何获取ASM网关地址,请参见获取入口网关地址

  2. 查看网关日志。

    1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

    2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择ASM网关 > 入口网关

    3. 入口网关页面,单击目标网关右侧的日志中心,在网关日志页签的搜索框中加入and 333的搜索条件,单击查询 / 分析,在左下方的原始日志页签,展开upstream_addr索引。

      您可以看到所有的请求均被转发给同一个后端httpbin Pod。

      image

  3. 打开浏览器的开发人员工具,单击网络,刷新页面,查看并单击发出的请求。

    您可以看到该网站有一个Cookie。Cookie的名称即为DestinationRule中设置的名称。ASM网关会根据该Cookie实现会话保持。

    image