在此任务中,将首先强制所有流量到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。