概述
Bookinfo示例应用是模仿在线书店的一个分类,显示一本书的信息。页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。
Bookinfo 应用分为四个单独的微服务:
- productpage:这个微服务会调用
details
和reviews
两个微服务,用来生成页面。 - details:这个微服务中包含了书籍的信息。
- reviews:这个微服务中包含了书籍相关的评论。它还会调用
ratings
微服务。 - ratings:这个微服务中包含了由书籍评价组成的评级信息。
reviews 微服务有 3 个版本:
- v1 版本不会调用
ratings
服务。 - v2 版本会调用
ratings
服务,并使用 1 到 5 个黑色星形图标来显示评分信息。 - v3 版本会调用
ratings
服务,并使用 1 到 5 个红色星形图标来显示评分信息。
Bookinfo 应用中的几个微服务是由不同的语言编写的。 这些服务对 Istio 并无依赖,但是构成了一个有代表性的服务网格的例子:它由多个服务、多个语言构成,并且 reviews
服务具有多个版本。
部署示例
# 为命名空间添加标签,指示 Istio 在部署应用的时候,自动注入 Envoy 边车代理
[root@k8s-master01 istio-1.10.6]# kubectl label namespace default istio-injection=enabled
namespace/default labeled
[root@k8s-master01 istio-1.10.6]# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created
# 查看已创建的Service
[root@k8s-master01 istio-1.10.6]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.96.0.244 <none> 9080/TCP 3m49s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 51d
productpage ClusterIP 10.96.2.236 <none> 9080/TCP 3m48s
ratings ClusterIP 10.96.1.94 <none> 9080/TCP 3m49s
reviews ClusterIP 10.96.2.113 <none> 9080/TCP 3m48s
# 查看已创建的Pod
[root@k8s-master01 istio-1.10.6]# kubectl get pods
NAME READY STATUS RESTARTS AGE
details-v1-79f774bdb9-p8f9q 2/2 Running 0 3m55s
productpage-v1-6b746f74dc-x2cvz 2/2 Running 0 3m54s
ratings-v1-b6994bb9-trb6r 2/2 Running 0 3m53s
reviews-v1-545db77b95-242jm 2/2 Running 0 3m53s
reviews-v2-7bf8c9648f-vz8sq 2/2 Running 0 3m54s
reviews-v3-84779c7bbc-pk8lq 2/2 Running 0 3m54s
# 访问Demo检查是否异常
[root@k8s-master01 istio-1.10.6]# kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -s productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
部署ISTIO-Gateway
示例部署完毕后,但是不能被外部访问,所以需要创建Istio-ingress-Gateway进行暴漏,它会在网格边缘把一个路径映射到路由。
[root@k8s-master01 istio-1.10.6]# 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
[root@k8s-master01 istio-1.10.6]# kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created
# 确保配置文件没有问题
[root@k8s-master01 istio-1.10.6]# istioctl analyze
✔ No validation issues found when analyzing namespace: default.
验证外部访问
http://192.168.1.101:30895/productpage
评论区