所有的微服务都和Envoy sidecar 集成在⼀起,被集成服务所有的出⼊流量都被sidecar 所劫持,这样就为外部控制准备了所需的Hook,然后就可以利⽤Istio 控制平⾯为应⽤提供服务路由、遥测数据收集以及策略实施等功能。
启动服务进⼊Istio 安装⽬录。
Istio 默认⾃动注⼊Sidecar. 请为 default 命名空间打上标签 istio-injection=enabled:
$ kubectl label namespace default istio-injection=enabled使⽤ kubectl 部署应⽤:
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml如果您在安装过程中禁⽤了Sidecar ⾃动注⼊功能⽽选择⼿动注⼊Sidecar,请在部署应⽤之前使⽤ istioctl kube-inject 命令修改 bookinfo.yaml ⽂件。
$ kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)上⾯的命令会启动全部的四个服务,其中也包括了reviews 服务的三个版本(v1、v2 以及v3)。在实际部署中,微服务版本的启动过程需要持续⼀段时间,并不是同时完成的。
确认所有的服务和Pod 都已经正确的定义和启动:
$ kubectl getservices NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE details 10.0.0.31 <none> 9080/TCP 6m kubernetes 10.0.0.1 <none> 443/TCP 7d productpage 10.0.0.120 <none> 9080/TCP 6m ratings 10.0.0.15 <none> 9080/TCP 6m reviews 10.0.0.170 <none> 9080/TCP 6m还有:
$ kubectl getpods NAME READY STATUS RESTARTS AGE details-v1-1520924117-48z17 2/2 Running 0 6m productpage-v1-560495357-jk1lz 2/2 Running 0 6m ratings-v1-734492171-rnr5l 2/2 Running 0 6m reviews-v1-874083890-f0qf0 2/2 Running 0 6m reviews-v2-1343845940-b34q5 2/2 Running 0 6m reviews-v3-1813607990-8ch52 2/2 Running 0 6m要确认Bookinfo 应⽤是否正在运⾏,请在某个Pod 中⽤ curl 命令对应⽤发送请求,例如ratings:
$ kubectlexec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -cratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>" <title>Simple Bookstore App</title>确定Ingress 的IP
现在Bookinfo 服务启动并运⾏中,您需要使应⽤程序可以从外部访问Kubernetes 集群,例如使⽤浏览器。可以⽤Istio Gateway 来实现这个⽬标。
为应⽤程序定义Ingress ⽹关:
$ kubectlapply -fsamples/bookinfo/networking/bookinfo-gateway.yaml
确认⽹关创建完成:
$ kubectl getgateway NAME AGE bookinfo-gateway 32s
设置访问⽹关的 INGRESS_HOST 和 INGRESS_PORT 变量。确认并设置。
#设置ingress 端⼝ export INGRESS_PORT=$(kubectl -n istio-system get service istioingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}') export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istioingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}') #设置ingress IP export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istiosystem -o jsonpath='{.items[0].status.hostIP}')
设置 GATEWAY_URL:
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT可以⽤浏览器打开⽹址 $GATEWAY_URL/productpage,来浏览应⽤的Web ⻚⾯。如果刷新⼏次应⽤的⻚⾯,就会看到 productpage ⻚⾯中会随机展示 reviews 服务的不同版本的效果(红⾊、⿊⾊的星形或者没有显示)。reviews 服务出现这种情况是因为我们还没有使⽤Istio 来控制版本的路由。
应⽤默认⽬标规则
在使⽤Istio 控制Bookinfo 版本路由之前,您需要在⽬标规则中定义好可⽤的版本,命名为 subsets 。
#设置 kubectl apply -fsamples/bookinfo/networking/destination-rule-all.yaml #查询 kubectl getdestinationrules -oyaml⾄此,Istio 完成了全部的接管
体验Istio按照版本路由
reviews有三个版本,默认情况下,会进⾏轮询,也就是我们看到的,每⼀次刷新都会有不同的效果。如果,我们需要将请求全部切换到某⼀个版本,需要Istio是⾮常简单的,只需要添加虚拟服务即可。示例:
经过测试,发现reviews不再切换样式。
还可以将部分流量转移到v3版本,基于此可以实现灰度发布、A/B测试等:
#将50%的流程转移到v3 kubectl apply -fsamples/bookinfo/networking/virtual-service-reviews-50-v3.yaml刷新浏览器中的/productpage ⻚⾯,⼤约有50% 的⼏率会看到⻚⾯中出带 红⾊ 星级的评价内容。这是因为v3 版本的reviews 访问了带星级评级的ratings 服务,但v1 版本却没有。
如果认为reviews:v3 微服务已经稳定,可以通过应⽤此virtual service 规则将100% 的流量路由到reviews:v3:
这样,所有的请求都转向到了v3了。
如果需要删除虚拟⽹络,可以执⾏: