V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
idblife
V2EX  ›  Kubernetes

Kubernetes 中如何进行 AB 测试

  •  
  •   idblife · 2020-12-31 17:21:21 +08:00 · 2506 次点击
    这是一个创建于 1421 天前的主题,其中的信息可能已经有所发展或是发生改变。
    单个服务很好理解。
    现在是有 100 个服务,
    每个服务都有 AB 两个版本,
    如何实现 A 版本的只访问 A 版本的服务呢?
    14 条回复    2021-01-25 14:15:03 +08:00
    vemier
        1
    vemier  
       2020-12-31 17:27:56 +08:00
    istio 很好实现,service 加版本号就行
    idblife
        2
    idblife  
    OP
       2020-12-31 17:34:49 +08:00
    @vemier
    看了一下文档,没发现啊。
    所谓的 AB testing 也是针对单个服务的,但是服务间的调用就控制不了啦。
    除非是在服务级别要求复制上一层调用的 http header 传递给下一层调用
    vemier
        3
    vemier  
       2020-12-31 17:48:59 +08:00 via iPhone
    @idblife 有的,你看下 bookinfo 那个 demo,v1 版本的 service 只能调用 v1 版本的其它 service
    vemier
        4
    vemier  
       2020-12-31 17:50:53 +08:00 via iPhone
    @idbl 调用是由 istio 代理转发的,业务代码不用改动,很香
    idblife
        5
    idblife  
    OP
       2020-12-31 17:57:19 +08:00
    @vemier
    我再仔细看看,非常感谢
    eric96
        6
    eric96  
       2020-12-31 18:21:50 +08:00
    没用过 istio,想问下如果我服务间调用是走的 tcp,还能用 istio 吗
    yzbythesea
        7
    yzbythesea  
       2020-12-31 18:25:16 +08:00
    客户端请求加一个 header 标明版本,然后配置下 Load Balancer,按这个 header 分流。
    idblife
        8
    idblife  
    OP
       2020-12-31 18:29:27 +08:00
    @yzbythesea
    举个例子
    foo 这个服务接收到了客户端请求,
    根据客户端 header 里的标明版本访问了 v1 的 foo,
    v1 的 foo 去访问 bar 这个服务的时候如何控制访问 v1 的 bar 呢?
    idblife
        9
    idblife  
    OP
       2020-12-31 18:42:48 +08:00
    @vemier
    这位大哥,请指点下,我又看了遍文档还是没发现具体实现方法。。。
    idblife
        10
    idblife  
    OP
       2020-12-31 18:59:07 +08:00
    @yzbythesea
    istio 文档里有这个功能,coding 下肯定能实现了,就是还没找到#3 大哥提到的原生解决方案

    Headers.HeaderOperations
    Overwrite the headers specified by key with the given values
    Append the given values to the headers specified by keys (will create a comma-separated list of values)
    Remove a the specified headers
    vemier
        11
    vemier  
       2020-12-31 19:10:43 +08:00   ❤️ 1
    @idblife

    具体可以参考 bookinfo/networking 下的配置文件,这是其中一个例子
    https://istio.io/latest/docs/tasks/traffic-management/request-routing/#route-based-on-user-identity

    然后用 k8s 的方式直接调用
    https://stackoverflow.com/questions/53095459/invoke-a-service-from-a-multi-container-pod-with-a-istio-sidecar

    新项目用起来很方便,如果是老项目还是在已有框架的基础上修改吧。
    pythonee
        12
    pythonee  
       2021-01-04 20:57:14 +08:00
    这个是不是可以考虑在业务代码实现
    idblife
        13
    idblife  
    OP
       2021-01-05 10:54:49 +08:00
    @pythonee
    业务代码中可以实现,但是成本太高了
    9
        14
    9  
       2021-01-25 14:15:03 +08:00   ❤️ 1
    @idblife

    "v1 的 foo 去访问 bar 这个服务的时候如何控制访问 v1 的 bar 呢?"
    用 sourceLabels 保证 bar:v1 接受来自 foo:v1 的流量
    sourceLabels:
    version: v1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3007 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:14 · PVG 22:14 · LAX 06:14 · JFK 09:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.