Istio实现AB测试

1、简介

A/B测试是一种用于比较两个或多个版本的应用程序以确定哪一个版本在用户中表现更好的技术。通过将用户随机分配到不同版本的应用程序,我们可以收集和分析数据,以做出更好的业务决策。

2、前提条件

部署Istio:确保Istio已经在你的Kubernetes集群中部署并运行。

示例应用:集群中已有一个正在运行的示例应用,以供灰度发布演示。

3、部署示例应用

该应用由四个单独的微服务构成。这个应用模仿在线书店的一个分类,显示一本书的信息。页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。

$ kubectl create namespace bookinfo
$ kubectl -n bookinfo create -f samples/bookinfo/platform/kube/bookinfo.yaml
$ kubectl -n bookinfo get po
NAME READY STATUS RESTARTS AGE
details-v1-5974b67c8-wclnd 1/1 Running 0 34s
productpage-v1-64794f5db4-jsdbg 1/1 Running 0 33s
ratings-v1-c6cdf8d98-jrfrn 1/1 Running 0 33s
reviews-v1-7f6558b974-kq6kj 1/1 Running 0 33s
reviews-v2-6cb6ccd848-qdg2k 1/1 Running 0 34s
reviews-v3-cc56b578-kppcx 1/1 Running 0 34s
Bookinfo 应用分为四个单独的微服务:

productpage. 这个微服务会调用 details 和 reviews 两个微服务,用来生成页面。

details. 这个微服务中包含了书籍的信息。

reviews. 这个微服务中包含了书籍相关的评论。它还会调用 ratings 微服务。

ratings. 这个微服务中包含了由书籍评价组成的评级信息。

reviews 微服务有 3 个版本:

v1 版本不会调用 ratings 服务。

v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。

v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。

Bookinfo 是一个异构应用,几个微服务是由不同的语言编写的。这些服务对 Istio 并无依赖,但是构成了一个有代表性的服务网格的例子:它由多个服务、多个语言构成,并且 reviews 服务具有多个版本。

4、使用ingress访问productpage服务

Ingress对象主要用于定义从外部访问集群内部服务的路由规则,而无法直接对流量进行细粒度的管控

[root@mast01 istio]# vim ingress-productpage.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: productpage
namespace: bookinfo
spec:
rules:

  • host: productpage.bookinfo.com http: paths:
    • backend:
      serviceName: productpage
      servicePort: 9080
      path: /
      status:
      loadBalancer: {}
      5、注入sidecar容器

使用istioctl kube-inject

$ kubectl -n bookinfo apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
为命名空间打label

给命名空间打标签,这样部署在该命名空间的服务会自动注入sidecar容器

$ kubectl label namespace dafault istio-injection=enabled
6、AB测试

[root@mast01 istio]# vim productpage-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: productpage-gateway
namespace: bookinfo
spec:
selector:
istio: ingressgateway # use istio default controller
servers:

  • port:
    number: 80
    name: http
    protocol: HTTP
    hosts:
  • productpage.bookinfo.com
    [root@mast01 istio]# vim destination-rule-reviews.yaml
    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
    name: reviews
    namespace: bookinfo
    spec:
    host: reviews
    trafficPolicy:
    loadBalancer:
    simple: RANDOM
    subsets:
  • name: v1
    labels:
    version: v1 #subset v1指向具有version=v1的pod
  • name: v2
    labels:
    version: v2 #subset v2指向具有version=v2的pod
  • name: v3
    labels:
    version: v3 #subset v3指向具有version=v3的pod
    所谓AB测试,就是限制指定用户访问新版本,待新版本无问题且反馈较好时,才会让所有用户使用新版本。这里我们将huqi用户指向v2,其他用户仍旧使用v3版本

[root@mast01 istio]# vim virtual-service-reviews-header.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
namespace: bookinfo
spec:
hosts:

  • reviews
    http:
  • match:
  • headers:
    end-user:
    exact: huqi
    route:
  • destination:
    host: reviews
    subset: v2
  • route:
  • destination:
    host: reviews
    subset: v3
    nginx新增配置

[root@work01 ~]# docker exec -it istio-nginx sh

/ # cd /etc/nginx/conf.d/

/etc/nginx/conf.d # vi productpage.conf
upstream bookinfo-productpage {
server 192.168.58.116:31927;
}
server {
listen 80;
listen [::]:80;
server_name productpage.bookinfo.com;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_pass http://bookinfo-productpage;
}
}

/etc/nginx/conf.d # nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

/etc/nginx/conf.d # nginx -s reload
2024/07/08 08:00:09 [notice] 37#37: signal process started
访问

声明:文中观点不代表本站立场。本文传送门:http://eyangzhen.com/418716.html

(0)
联系我们
联系我们
分享本页
返回顶部