Istio是一个开源的服务网格,提供流量管理、可观测性,以及安全和策略等能力。在Kubernetes中配合使用Istio,可以帮助您更好地管理和控制容器应用,提高应用程序的性能、安全性和可靠性。本文以Bookinfo应用为例,介绍自建Kubernetes集群通过VNode对接ECI的场景下,如何使用Istio。
背景信息
Istio是一个开源的服务网格(Service Mesh)平台,用于管理微服务之间的流量以及处理各种网络通信和安全问题。Istio可以与Kubernetes集成,提供标准、安全的流量管理,简化部署和运维工作。
Bookinfo是一个样例应用,它模仿在线书店的一个目录,可以显示一本书的信息,包括书籍描述,书籍详细信息(ISBN、页数等),以及关于这本书的一些评论。Bookinfo是一个异构应用,由四个使用不同语言编写的微服务组成,可以演示多种Istio特性。Bookinfo包含的四个微服务如下:

-
Productpage:为Python服务,会调用Details和Reviews两个服务,用来生成页面。同时,Productpage还包含登录和登出功能。
-
Details:为Ruby服务,包含了书籍的信息。
-
Reviews:为Java服务,包含了书籍相关的评论。Reviews包含3个版本:
-
v1版本不会调用Ratings服务。
-
v2版本会调用Ratings服务,并使用1到5个黑色星形图标来显示评分信息。
-
v3版本会调用Ratings服务,并使用1到5个红色星形图标来显示评分信息。
-
-
Ratings:为Node.js服务,包含了由书籍评价组成的评级信息。
更多信息,请参见Istio Bookinfo。
前提条件
本文适用于自建Kubernetes集群,请确保您的集群满足以下条件:
-
自建Kubernetes集群中已部署VNode。
-
如果您的Kubernetes集群部署在线下IDC,请确保已打通IDC与阿里云的网络。
-
如果您的Kubernetes集群部署在ECS上,且使用的网络插件为Flannel,请确保已在集群中部署CCM,保证ECI与标准节点上的Pod可以正常通信。具体操作,请参见部署CCM。
准备工作
-
安装Istio。具体操作,请参见Istio快速入门。
-
创建Namespace并配置Label。
kubectl create namespace istio-test kubectl label namespace istio-test istio-injection=enabled
操作步骤
部署Bookinfo应用
-
将以下内容保存为bookinfo.yaml。
说明下述YAML示例中已增加nodeSelector实现将Pod调度到VNode,您也可以配置eci-profile来实现。更多信息,请参见将Pod调度到VNode和使用eci-profile调度Pod到VNode。
-
部署Bookinfo。
kubectl -n istio-test apply -f bookinfo.yaml预期返回:
xxx# kubectl -n istio-test apply -f 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 -
查看Bookinfo运行情况。
kubectl -n istio-test get pods -o wide预期返回:
[xxx@xxx ~]# kubectl -n istio-test get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES details-v1-5f957dd5ff-kdvpc 2/2 Running 0 14m 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> productpage-v1-85976f8df7-ht5dg 2/2 Running 0 72s 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> ratings-v1-69fb6864cf-9l7fp 2/2 Running 0 23m 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> reviews-v1-77f77b5-sssgw 2/2 Running 0 7m13s 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> reviews-v2-5b9b5676c-bcjx9 2/2 Running 0 23m 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> reviews-v3-6ff46dbb9c-kf2gl 2/2 Running 0 13m 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> -
检查Services。
kubectl -n istio-test get services预期返回:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 10.96.1.xxx <none> 9080/TCP 25m productpage ClusterIP 10.96.2.xxx <none> 9080/TCP 25m ratings ClusterIP 10.96.1.xxx <none> 9080/TCP 25m reviews ClusterIP 10.96.1.xxx <none> 9080/TCP 25m
部署Gateway
-
将以下内容保存为bookinfo-gateway.yaml。
-
部署Gateway。
kubectl -n istio-test apply -f bookinfo-gateway.yaml预期返回。
[root@xxx ~]# kubectl -n istio-test apply -f bookinfo-gateway.yaml gateway.networking.istio.io/bookinfo-gateway created virtualservice.networking.istio.io/bookinfo created -
查看Gateway。
kubectl -n istio-test get gateway预期返回:
NAME AGE bookinfo-gateway 88s
验证Bookinfo服务
-
确定Istio Gateway的Host地址。
请根据集群情况选择Istio Ingress Service,本文使用LoadBalancer方式:
kubectl -n istio-system get service istio-ingressgateway预期返回:
[xxx@xxx ~]# kubectl -n istio-system get service istio-ingressgateway NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.96.xxx <pending> 15021:31682/TCP,80:32247/TCP,443:31049/TCP,31400:30519/TCP,15443:31511/TCP 43m通过返回信息可以得到istio-ingressgateway的Host地址(
IP:Port格式)为10.96.XX.XX:80。 -
创建一个测试Pod,用于验证服务。
-
将以下内容保存为test-pod.yaml。
-
部署Pod。
kubectl apply -f test-pod.yaml
-
-
登录测试Pod,然后执行命令验证服务。
kubectl exec -it centos -- bashcurl -s http://10.96.XX.XX:80/productpage | grep -o "<title>.*</title>"其中
10.96.XX.XX:80为步骤1获取的Host地址。如果返回<title>Simple BookStore App<title>,则表示Istio已经成功运行在VNode上。