4.3.3 创建用于Istio流量镜像的服务

在此任务中,将首先强制所有流量到v1版本的服务。然后,将使用规则将一部分流量镜像到v2版本。首先部署两个版本的示例服务。

注意

执行以下kubectl命令之前,请先创建命名空间diffy,并为命名空间diffy打上标签istio-injection=enabled。例如,可以通过命令kubectl create ns diffy来创建命令空间,通过命令kubectl label ns diffy istio-injection=enabled设置标签。下载本书所使用的示例代码之后,切换到目录traffic-sample3可以查看所有相关的代码文件。

版本1的部署使用了Docker镜像httpbin,提供常见的http请求访问,具体参见sample-service.yaml中的定义:


apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mirrorservice-sample-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: mirrorservice-sample
        version: v1
    spec:
      containers:
      - image: docker.io/kennethreitz/httpbin
        imagePullPolicy: IfNotPresent
        name: mirrorservice-sample
        command: ["gunicorn", "--access-logfile", "-", "-b", "0.0.0.0:44134", "httpbin:app"]
        ports:
        - containerPort: 44134

版本2的部署使用了自定义的Docker镜像,对应的Dockerf ile如下:


FROM nginx:latest
COPY default.conf /etc/nginx/conf.d/
EXPOSE 80

所需的nginx配置文件:


server {
    listen       44134;
    server_name  localhost;

    location / {
        proxy_pass http://httpbin-diffy.diffy:8880/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";   
    }
}

版本2的部署作为Istio的流量镜像目标,在接收到流量之后会转发到Diffy的代理中。当前没有直接将Diffy代理作为Istio流量镜像目标,原因是Diffy代理与Envoy代理目前本身有冲突,无法正常流量转发,因此需要此部署中转一下。


apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mirrorservice-sample-v2
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: mirrorservice-sample
        version: v2
    spec:
      containers:
      - name: mirrorservice-sample
        image: registry.cn-beijing.aliyuncs.com/istio-samples/mirrorservice:0.1
        imagePullPolicy: Always
        ports:
        - containerPort: 44134

对应的Kubernetes service,具体参见sample-service.yaml中的定义:


apiVersion: v1
kind: Service
metadata:
  name: mirrorservice-sample
spec:
  type: ClusterIP
  ports:
  - name: http
    port: 44134
  selector:
    app: mirrorservice-sample

最后,通过执行命令kubectl apply-n diffy-f sample-service.yaml,创建示例服务以及相应的pod。