在使用 Istio 控制 Bookinfo 版本路由之前运行以下命令为 Bookinfo 服务创建默认目标规则:
kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
下来来看下yaml文件内容:
bookinfo.yaml
##以Productpage为例,剩下的Reviews、Ratings、Details都同理
##################################################################################################
# Productpage services
##################################################################################################
apiVersion: v1 ##api版本
kind: Service
metadata:
name: productpage ##svc的名字
labels:
app: productpage ##svc的标签,两种标签
service: productpage
spec:
ports:
- port: 9080 ##svc暴露的端口
name: http ##端口形式
selector:
app: productpage ##将svc绑定到具有app=productpage标签的deploy上
---
apiVersion: v1
kind: ServiceAccount ##准入控制
metadata:
name: bookinfo-productpage
labels:
account: productpage
---
apiVersion: apps/v1
kind: Deployment ##创建deploy
metadata:
name: productpage-v1 ##deploy的名字
labels:
app: productpage ##deploy的标签
version: v1
spec:
replicas: 1 ##副本数
selector: ##容器需要绑定到相应的标签上
matchLabels:
app: productpage ##标签选择了两个就说明这个容器选择了名为productpage-v1的deploy
version: v1
template:
metadata:
labels:
app: productpage
version: v1
spec:
serviceAccountName: bookinfo-productpage ##选择准入控制器
containers:
- name: productpage
image: docker.io/istio/examples-bookinfo-productpage-v1:1.16.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080 ##容器内部暴露端口
volumeMounts: ##挂载项
- name: tmp
mountPath: /tmp
securityContext:
runAsUser: 1000
volumes:
- name: tmp
emptyDir: {} ##临时挂载
---
创建完服务后再创建入口gateway
bookinfo.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway ##创建gateway的类型
metadata:
name: bookinfo-gateway ##创建gateway的名字
spec:
selector:
istio: ingressgateway # use istio default controller ##选择的是istio的默认控制器
servers:
- port:
number: 80 ##选择端口
name: http
protocol: HTTP ##服务形式
hosts:
- "*" ##这个host可以允许任何域名访问80端口
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService ##创建vsvc
metadata:
name: bookinfo ##vsvc名字
spec:
hosts: ##现在这个host也不进行选择,允许任何域名
- "*"
gateways:
- bookinfo-gateway ##选择相应的gateway
http:
- match: ##匹配规则
- uri:
exact: /productpage ##exact精确匹配
- uri:
prefix: /static ##prefix前置匹配
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage ##这里选择的是svc也可以写全部的路径productpage.default.svc.cluster.local
port:
number: 9080
目的地路由创建
destination-rule-all.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule ##类型是DestinationRule
metadata:
name: productpage ##DestinationRule的名称
spec:
host: productpage ##这个和vsvc的host字段相同
subsets:
- name: v1
labels:
version: v1 ##标签v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
---
下来进入今天的正题,因为一开始reviews有v1、v2、v3三个版本,使用svc进行调用的时候会进行负载均衡,但是如果我只想将流量打到固定的地方该如何进行更改呢?
在DR后再创建svc
virtual-service-all-v1.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: productpage
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1 ##现在限制reviews是只走DR的v1路线
基于用户身份修改路由
virtual-service-reviews-test-v2.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
...
spec:
hosts:
- reviews
http:
- match: ##vsvc的规则
- headers: ##头信息
end-user:
exact: jason ##精准匹配jason用户
route:
- destination: ##如果匹配到了就走v2版本
host: reviews
subset: v2
- route:
- destination: ##没有匹配到就走v1版本
host: reviews
subset: v1
设置完成后刷新页面并登录
登录完成出现黑色星星表示v2版本生效了