概述

在上文中,我们完成了 Istio 的安装部署,那么 Istio 是否能正常工作了呢?
我们来通过一个 Demo 应用来快速体验 Istio 的相关功能。

示例项目介绍

在 Demo 中,我们以一个 Bookinfo 项目为例来演示 Istio 的功能使用。
image.png
在 Bookinfo 项目中,由以下四个微服务组成。
其中,productpage 是整个服务的访问入口,它调用了 reviews 和 details 两个服务,而 reviews 又调用了 ratings 服务。

StepByStep

创建测试 namespace 并添加自动注入 label

  1. kubectl create namespace istio-demo
  2. kubectl label namespace istio-demo istio-injection=enabled
  3. # namespace/istio-demo labeled

部署bookinfo应用

  1. kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n istio-demo

如下图所示,它创建了上述对应的四个服务的 deployment 、service 以及 serviceaccount。
image.png
下面,我们可以等待 Pod 启动完成:

  1. kubectl get pods -n istio-demo

image.png
此时,上述所有的 Pod 都已经启动成功了,每个 Pod 中都包含两个 Container,其中一个正是我们自动注入的 sidecar。

下面,我们来验证一下服务是否已经正常启动了吧:

  1. kubectl exec -n istio-demo "$(kubectl get pod -n istio-demo -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -s productpage:9080/productpage | grep -o "<title>.*</title>"
  2. # <title>Simple Bookstore App</title>

如果你能够看到打印出的 Simple Bookstore App 信息,那么说明 Bookinfo 服务已经正常启动啦~

安装gateway

为了让我们部署的服务可以正常在集群外部访问,我们需要安装一个 gateway,安装的方式如下:

  1. kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml -n istio-demo
  2. # gateway.networking.istio.io/bookinfo-gateway created
  3. # virtualservice.networking.istio.io/bookinfo created

其中,yaml 文件中创建了一个 Gateway 和 VirtualService,后续课程会进行详细介绍。
下面,我们来执行如下命令来检查一下相关的配置是否正常:

  1. istioctl analyze -n istio-demo
  2. # ✔ No validation issues found when analyzing namespace: istio-demo.

如果能够看到相关内容,说明相关的配置都是正常的。

找出对外暴露的 Ingress IP 和端口

我们知道,在 Istio 中,集群访问想要调用集群内部的服务,这时需要通过 Ingress 来访问,下面,我们来看看如何获取 Ingress 的 IP 和端口吧:

  1. # 获取 ingress 的 HostIP
  2. export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
  3. # 获取 ingress 的 HTTP Port
  4. export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
  5. # 获取 ingress 的 HTTPS Port
  6. export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
  7. # 具体的访问地址
  8. export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
  9. echo "$GATEWAY_URL"

访问一下看看吧!

  1. echo "http://$GATEWAY_URL/productpage"
  2. # 这个就是我们需要访问的 url

打开浏览器访问看看吧:
image.png
是不是已经可以正常访问了呢?