Bookinfo示例简介
Bookinfo
是istio
官网示例,应用程序分为四个单独的微服务:
productpage
。该productpage
微服务调用details
和reviews
微服务来填充页面。details
。该details
微服务包含图书信息。reviews
。该reviews
微服务包含了书评。它们调用ratings
微服务。ratings
。该ratings
微服务包含预定伴随书评排名信息。
reviews
微服务有3个版本:
- 版本
v1
不会调用该ratings
服务。 - 版本
v2
调用该ratings
服务,并将每个等级显示为1到5个黑星★。 - 版本
v3
调用该ratings
服务,并将每个等级显示为1到5个红色星号★。
Bookinfo
在Istio
中架构
如果想要在Istio
中运行Bookinfo
,Bookinfo
本身不需要任何改动,只需要为Bookinfo
的微服务注入Istio
的Sidecar
。最终架构图如下:
所有的微服务都与Envoy
边车打包在一起,该Envoy
边车拦截对服务的出/入请求,并与Istio
控制面交互,提供路由、采集、实施各种策略等。
启动Bookinfo
服务,参考官网
进入istio目录
[root@k8s-master istio-1.4.2]# pwd
/root/istio/istio-1.4.2
设置namespace自动注入sidecar
kubectl label namespace default istio-injection=enabled
部署bookinfo服务
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
你也可以手动为这个yaml注入sidecar再部署,参考Istio使用【sidecar注入】
kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
确定启动完成
[root@k8s-master istio-1.4.2]# kubectl get pod
NAME READY STATUS RESTARTS AGE
details-v1-74f858558f-7gx6r 2/2 Running 0 31h
productpage-v1-8554d58bff-fwcj4 2/2 Running 0 31h
ratings-v1-7855f5bcb9-r7z5l 2/2 Running 0 31h
reviews-v1-59fd8b965b-jppqr 2/2 Running 0 31h
reviews-v2-d6cfdb7d6-rx648 2/2 Running 0 31h
reviews-v3-75699b5cfb-qpdjm 2/2 Running 0 31h
[root@k8s-master istio-1.4.2]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.102.10.128 <none> 9080/TCP 31h
productpage ClusterIP 10.110.251.239 <none> 9080/TCP 31h
ratings ClusterIP 10.99.146.247 <none> 9080/TCP 31h
reviews ClusterIP 10.102.77.22 <none> 9080/TCP 31h
确定程序运行正常
kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
定义应用的入口网关
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
确认网关已创建
[root@k8s-master istio-1.4.2]# kubectl get gateway
NAME AGE
bookinfo-gateway 30h
下面可以通过Isito
的入口网关来访问了,在访问前,需要确定Isito网关IP和端口
。
获取Istio入口网关IP和端口:参考官网
kubectl get svc istio-ingressgateway -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway LoadBalancer 10.110.94.234 <pending> 15020:32344/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:31933/TCP,15030:30470/TCP,15031:31361/TCP,15032:31151/TCP,15443:31081/TCP 2d2h
如果EXTERNAL-IP
设置了该值,则您的环境具有可用于入口网关的外部负载平衡器。如果EXTERNAL-IP
值是<none>
(或永久<pending>
),则您的环境不为入口网关提供外部负载平衡器。在这种情况下,您可以使用服务的节点端口来访问网关。
确定端口
这里
80
对应的端口是Http
服务的端口,映射的主机端口31380
;这里
443
对应的端口是Https
服务的端口,映射的主机端口31390
;
确定IP
可以通过下面命令找个hostIP
[root@k8s-master istio-1.4.2]# kubectl get po -l istio=ingressgateway -n istio-system -o yaml | grep hostIP: -C3
---
state:
running:
startedAt: "2019-12-24T06:46:29Z"
hostIP: 192.168.1.212
phase: Running
podIP: 10.244.3.136
qosClass: Burstable
---
也可以通过下面的命令找到Ingress部署的节点。
[root@k8s-master istio-1.4.2]# kubectl get po -l istio=ingressgateway -n istio-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
istio-ingressgateway-6b7bfd7459-wljhh 1/1 Running 0 2d2h 10.244.3.136 k8s-02 <none> <none>
访问Bookinfo应用
浏览器访问刚刚或者的IP
+端口
+/productpage
,例如我的是http://192.168.1.212:31380/productpage
不停的刷新页面,可以看到返回的Reviewer
是不同的版本。
简单分析下
针对samples/bookinfo/networking/bookinfo-gateway.yaml
,我们可以看看默认配置做了啥。
[root@k8s-master istio-1.4.2]# cat samples/bookinfo/networking/bookinfo-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
首先创建一个
Gateway
,这是Istio
的一个自定义资源类型(CRD
),它创建了这个bookinfo
应用的网关bookinfo-gateway
,使用了istio
默认的controller——ingressgateway
,如上文,istio
的ingress
网关定义了很多类型端口,这里bookinfo-gateway
使用了80
端口,域名使用的通配符*
。定义
VirtualService
,这里需要绑定刚刚创建的bookinfo-gateway
,定义了匹配的URI
和后台服务。