Bookinfo
应用Bookinfo
应用Bookinfo
是一个模拟的在线书店应用,只有一个页面,由图书列表、图书详细信息、评论和评分4个部分组成,这些部分分别由对应的微服务来实现。Bookinfo
应用是一个异构应用,不同的服务使用不同的程序语言编写,共同组成了一个微服务系统服务 | 功能 | 实现 |
---|---|---|
productpage | 图书列表 | Python |
details | 图书详细信息 | Ruby |
reviews | 评论 | Java |
ratings | 评分 | Node.js |
reviews
服务有3个版本,可以用来测试流量控制的相关功能。各版本对应的特性下表所示不会调用ratings服务
Istio
来管理这个应用的网络通信,需要把Sidecar
(Istio
架构中的Envoy
代理)注入每个服务中,并把网络流量托管给Envoy
代理。这对服务是无侵入的,不需要修改微服务,只需要配置和运行一些命令Bookinfo
应用Istio
安装目录default
命名空间打上标签istio-injection
=enabled
kubectl label namespace default istio-injection=enabled
Kubernetes1.9
版本后引入的新功能,本质上是通过Kubernetes
中的admission webhook
实现的。开启自动注入会给部署在当前命名空间的服务都自动添加一个Sidecar
代理default
命名空间已经打上了istio-injection
的标签istio
安装包里的samples
目录下获取bookinfo
的清单文件,并使用命令部署,文件在samples/bookinfo/platform/kube/bookinfo.yaml
Service
和Deployment
。每个服务都能够从Istio
官方提供的地址拉取相应的容器镜像。其中不太一样的是,reviews
服务有3个版本,并启动了3个Deployment
bookinfo
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
service/details unchanged
serviceaccount/bookinfo-details unchanged
deployment.apps/details-v1 unchanged
service/ratings unchanged
serviceaccount/bookinfo-ratings unchanged
deployment.apps/ratings-v1 unchanged
service/reviews unchanged
serviceaccount/bookinfo-reviews unchanged
deployment.apps/reviews-v1 unchanged
deployment.apps/reviews-v2 unchanged
deployment.apps/reviews-v3 unchanged
service/productpage unchanged
serviceaccount/bookinfo-productpage unchanged
deployment.apps/productpage-v1 unchanged
Ingress Gateway
)。因为需要从外部(如浏览器)来访问Kubernetes
集群里的服务,所以要通过网关实现请求的转发$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created
bookinfo-gateway
的网关,使用Istio
默认的ingressgateway
,并对外提供HTTP
请求进行访问。第二部分定义了VirtualService
,它是一种配置资源,主要负责定义路由规则,将请求路由到对应的服务上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
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
bookinfo-gateway
的网关,使用Istio
默认的ingressgateway
,并对外提供HTTP
请求进行访问。第二部分定义了VirtualService
,它是一种配置资源,主要负责定义路由规则,并将请求路由到对应的服务上$ kubectl get gateway
NAME AGE
bookinfo-gateway 48s
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.101.254.33 <none> 9080/TCP 76m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d23h
productpage ClusterIP 10.109.69.236 <none> 9080/TCP 76m
ratings ClusterIP 10.96.172.219 <none> 9080/TCP 76m
reviews ClusterIP 10.111.140.121 <none> 9080/TCP 76m
pod
都正常运行$ kubectl get pods
NAME READY STATUS RESTARTS AGE
details-v1-74f858558f-j2nkq 2/2 Running 0 76m
productpage-v1-8554d58bff-jj4k9 2/2 Running 0 76m
ratings-v1-7855f5bcb9-crv8g 2/2 Running 0 76m
reviews-v1-59fd8b965b-glfks 2/2 Running 0 76m
reviews-v2-d6cfdb7d6-cl6d9 2/2 Running 0 76m
reviews-v3-75699b5cfb-fpqwk 2/2 Running 0 76m
http://localhost/productpage
,来浏览应用的Web
页面Kiali
系统(http://localhost:20001/
)选择命名空间为default
,查看服务之间调用链$ kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
destinationrule.networking.istio.io/productpage created
destinationrule.networking.istio.io/reviews created
destinationrule.networking.istio.io/ratings created
destinationrule.networking.istio.io/details created
mTLS
的版本,即服务间的通信不需要安全验证。可以使用下面的命令查看目标规则,-o代表-output
,后面输出格式$ kubectl get destinationrules -o yaml
apiVersion: v1
items:
- apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"networking.istio.io/v1alpha3","kind":"DestinationRule","metadata":{"annotations":{},"name":"details","namespace":"default"},"spec":{"host":"details","subsets":[{"labels":{"version":"v1"},"name":"v1"},{"labels":{"version":"v2"},"name":"v2"}]}}
creationTimestamp: "2020-02-26T12:59:22Z"
generation: 1
name: details
namespace: default
Bookinfo
的页面中会调用jquery
文件,需要网络环境可以访问ajax.googleapis.com
地址