本文实验访问网络内的应用,并根据路由规则访问不同版本。
访问链路:istio-springboot-demo-a > istio-springboot-demo-b
一、应用准备
istio-springboot-demo-a 的代码如下:
@RestController
@RequestMapping("/test")
public class TestEndpoint {
private RestTemplate restTemplate = new RestTemplate();
@GetMapping("/request-b")
public String requestb(@RequestParam("a") String a, @RequestParam(value = "forward", required = false) String forward) {
String result = restTemplate.getForObject("http://" + forward + "/test/get?a=" + a, String.class);
return PREFIX + " demo-a request " + forward + ": parameter a:" + a + "\n demo-b response:" + result;
}
}
istio-springboot-demo-b 分v1版本和latest版本,代码分别如下。
istio-springboot-demo-b:v1
@RestController
@RequestMapping("/test")
public class TestEndpoint {
private static final String PREFIX = "Latest";
@GetMapping("/get")
public String get(@RequestParam("a") String a) {
return PREFIX + " demo-b: test get and the parameter a is : " + a;
}
}
istio-springboot-demo-b:latest
@RestController
@RequestMapping("/test")
public class TestEndpoint {
private static final String PREFIX = "V";
@GetMapping("/get")
public String get(@RequestParam("a") String a) {
return PREFIX + " demo-b: test get and the parameter a is : " + a;
}
}
打包成镜像,具体方法参考:Java应用打包成Docker镜像
二、通过kubernetes Service访问
istio-springboot-demo-a 的部署过程参考 istio gateway入口流量路由管控
部署 istio-springbbot-demo-b
关于istio-springbbot-demo-b的部署过程也是类似的,创建部署istio-springbbot-demo-b需要的yaml文件,内含Service和Deployment。
demo-b-vault.yaml:
apiVersion: v1
kind: Service
metadata:
name: istio-springboot-demo-b
labels:
app: istio-springboot-demo-b
service: istio-springboot-demo-b
spec:
ports:
- name: http
port: 80
targetPort: 8081
selector:
app: istio-springboot-demo-b
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: istio-springboot-demo-b-v1
spec:
replicas: 1
selector:
matchLabels:
app: istio-springboot-demo-b
version: v1
template:
metadata:
labels:
app: istio-springboot-demo-b
version: v1
spec:
serviceAccountName: istio-demo
containers:
- image: demo-istio-springboot-demo-b:1.0-SNAPSHOT
imagePullPolicy: IfNotPresent
name: istio-springboot-demo-b
ports:
- containerPort: 8081
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: istio-springboot-demo-b-latest
spec:
replicas: 1
selector:
matchLabels:
app: istio-springboot-demo-b
version: latest
template:
metadata:
labels:
app: istio-springboot-demo-b
version: latest
spec:
serviceAccountName: istio-demo
containers:
- image: demo-istio-springboot-demo-b:latest
imagePullPolicy: IfNotPresent
name: istio-springboot-demo-b
ports:
- containerPort: 8081
执行kubectl 命令进行部署
kubectl apply -f demo-b-vault.yaml -n istio-demos
访问 istio-springbbot-demo-b
本次实验通过istio-springboot-demo-a 访问网格内的istio-springboot-demo-b,没有配置istio的VirtualService,所以istio-springboot-demo-a 在访问istio-springboot-demo-b时,是随机路由istio-springboot-demo-b的两个版本。
访问url: http://demoa.istiodemos.com/test/request-b?forward=istio-springboot-demo-b.istio-demos.svc.cluster.local&a=av356
istio-springboot-demo-a和istio-springboot-demo-b是在同一个集群同一个namespace中,以下两个url也是一样可以访问的:
http://demoa.istiodemos.com/test/request-b?forward=istio-springboot-demo-b.istio-demos&a=av356
http://demoa.istiodemos.com/test/request-b?forward=istio-springboot-demo-b&a=av356
三、制定路由规则
创建VirtualService,管理istio-springboot-demo-b的路由规则
istio的VirtualService是在kubernetes 的Service 之上新增的一层,主要负责路由、流控、降级等。
demo-b-route-virtualservice.yaml 的配置如下 :
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: istio-springboot-demo-b-dr
spec:
host: istio-springboot-demo-b
trafficPolicy:
loadBalancer:
simple: LEAST_CONN
subsets:
- name: v1
labels:
version: v1
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
- name: latest
labels:
version: latest
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: istio-springboot-demo-b-vs
spec:
hosts:
- "istio-springboot-demo-b"
- "istio-springboot-demo-b.istio-demos"
- "istio-springboot-demo-b.istio-demos.svc.cluster.local"
http:
- match:
- queryParams:
a:
# exact: ad
regex: ae\d+$
route:
- destination:
host: istio-springboot-demo-b
subset: v1
- route:
- destination:
host: istio-springboot-demo-b
subset: latest
路由规则定义如下:
当queryString a 以ae加数字结尾(例如:ae32, fade32)时,路由到v1版本
否则都路由到latest版本
执行kubectl 命令在kubernetes集群内创建VirtualService。
kubectl apply -f demo-b-route-virtualservice.yaml -n istio-demos
访问 istio-springboot-demo-b 的不同版本
根据上面对istio-springboot-demo-b的路由规则定义:
当queryString a 以ae加数字结尾(例如:ae32, fade32)时,路由到v1版本
否则都路由到latest版本
请求URL : http://demoa.istiodemos.com/test/request-b?forward=istio-springboot-demo-b&a=ae356 必定会被路由到istio-springboot-demo-b的v1版本。
请求URL : http://demoa.istiodemos.com/test/request-b?forward=istio-springboot-demo-b&a=ae356f 必定会被路由到istio-springboot-demo-b的latest版本。
接下来的实验也确实如下
http://demoa.istiodemos.com/test/request-b?forward=istio-springboot-demo-b&a=ae356:
http://demoa.istiodemos.com/test/request-b?forward=istio-springboot-demo-b&a=ae356f: