概述
在上文中,我们完成了 Istio 的安装部署,那么 Istio 是否能正常工作了呢?
我们来通过一个 Demo 应用来快速体验 Istio 的相关功能。
示例项目介绍
在 Demo 中,我们以一个 Bookinfo 项目为例来演示 Istio 的功能使用。
在 Bookinfo 项目中,由以下四个微服务组成。
其中,productpage 是整个服务的访问入口,它调用了 reviews 和 details 两个服务,而 reviews 又调用了 ratings 服务。
StepByStep
创建测试 namespace 并添加自动注入 label
kubectl create namespace istio-demo
kubectl label namespace istio-demo istio-injection=enabled
# namespace/istio-demo labeled
部署bookinfo应用
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n istio-demo
如下图所示,它创建了上述对应的四个服务的 deployment 、service 以及 serviceaccount。
下面,我们可以等待 Pod 启动完成:
kubectl get pods -n istio-demo
此时,上述所有的 Pod 都已经启动成功了,每个 Pod 中都包含两个 Container,其中一个正是我们自动注入的 sidecar。
下面,我们来验证一下服务是否已经正常启动了吧:
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>"
# <title>Simple Bookstore App</title>
如果你能够看到打印出的 Simple Bookstore App 信息,那么说明 Bookinfo 服务已经正常启动啦~
安装gateway
为了让我们部署的服务可以正常在集群外部访问,我们需要安装一个 gateway,安装的方式如下:
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml -n istio-demo
# gateway.networking.istio.io/bookinfo-gateway created
# virtualservice.networking.istio.io/bookinfo created
其中,yaml 文件中创建了一个 Gateway 和 VirtualService,后续课程会进行详细介绍。
下面,我们来执行如下命令来检查一下相关的配置是否正常:
istioctl analyze -n istio-demo
# ✔ No validation issues found when analyzing namespace: istio-demo.
如果能够看到相关内容,说明相关的配置都是正常的。
找出对外暴露的 Ingress IP 和端口
我们知道,在 Istio 中,集群访问想要调用集群内部的服务,这时需要通过 Ingress 来访问,下面,我们来看看如何获取 Ingress 的 IP 和端口吧:
# 获取 ingress 的 HostIP
export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
# 获取 ingress 的 HTTP Port
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
# 获取 ingress 的 HTTPS Port
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
# 具体的访问地址
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
echo "$GATEWAY_URL"
访问一下看看吧!
echo "http://$GATEWAY_URL/productpage"
# 这个就是我们需要访问的 url
打开浏览器访问看看吧:
是不是已经可以正常访问了呢?