Istio官方提供了一个非常好的实战项目,来使开发者能够更加快速上手Istio,以及通过示例来了解Istio的特性。

bookinfo介绍

这是Istio官方提供的一个bookinfo微服务项目,bookinfo使用了python、java、ruby、node四种语言开发了四个微服务,充分证明Istio可以在不受限于语言的环境下工作。

bookinfo微服务分为四个单独的微服务:

  • productpage:这个微服务主要调用details和reviews微服务,用来生成页面

  • details:包含书籍信息

  • reviews:书籍相关评论,调用ratings微服务

  • ratings:书籍评级信息

reviews微服务有3个版本:

v1版本不会调用ratings服务,也就是页面不会显示星级评分

v2版本调用ratings服务,使用黑色星级图标评分

v3版本调用ratings服务,使用红色星级图标评分

实行注入

我们这边来使用默认名称空间default来部署我们的bookinfo微服务,所以我们需要对default名称空间下的资源实行istio注入,我们就使用自动注入把,当然你也可以手工的注入这些资源。

kubectl label namespace default istio-injection=enabled

部署bookinfo

在istio的安装目录下samples/bookinfo/platform/kube/bookinfo.yaml,我们需要使用kubectl部署应用

kubectl apply -f bookinfo.yaml

等待一会,等pod和svc起来

kubectl get pods
kubectl get svc

查看bookinfo微服务是否正在运行

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>"

部署ingress网关

在istio的安装目录下samples/bookinfo/networking/bookinfo-gateway.yaml,我们需要使用kubectl部署应用

kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

确定NodePort端口

export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
#查看端口
env | grep 'INGRESS_PORT'

测试

通过k8s的一个node ip + INGRESS_PORT访问,例如http://192.168.1.110:31514/productpage

可以发现现在页面是正常轮询显示 review1、 review2、 review3的