基于Istio实现Kubernetes与ECS上的应用服务混合编排
更新时间:2020-03-27 10:23:43
背景信息
Istio从0.2开始就提供Mesh Expansion(中文大多称之为网格扩展)的功能。其主要功能是把一些非Kubernetes服务(这些服务往往运行在其他一些虚拟机或物理裸机中)集成到运行在Kubernetes集群上的Istio服务网格中。
阿里云Kubernetes容器服务提供Istio Mesh Expansion整合能力。本文通过一个官方示例来重点介绍如何使用Istio实现Kubernetes与ECS上的应用服务混合编排。
网格扩展Mesh Expansion
Mesh Expansion就指部署在Kubernetes之中的Istio服务网格提供的一种将虚拟机或物理裸机集成进入到服务网格的方法。
Mesh Expansion对于用户从遗留系统往云上迁移过程中有着非常重要的作用,在微服务体系结构中,无法要求所有的工作负载都在Kubernetes中运行,用户的一些应用程序可能在Kubernetes中运维,而另外一些可能在其它虚拟机或物理裸机中运行。
通过一套Istio控制面板就可以管理跨Kubernetes与虚拟机或物理裸机的若干服务。这样既能保证原有业务的正常运转,又能实现Kubernetes与虚拟机上的应用服务混合编排的能力。
准备Kubernetes集群并部署Istio
阿里云容器服务Kubernetes 1.10.4目前已经上线,可以通过容器服务管理控制台非常方便地快速创建Kubernetes集群。具体过程请参见创建Kubernetes集群。
说明 确保通过kubectl能够连接上Kubernetes集群,参见通过kubectl连接上Kubernetes集群。
参考前面系列文章中介绍的步骤,通过应用目录简便部署Istio。首先通过命令行或者控制台创建命名空间istio-system
。
安装示例到Kubernetes集群中
首先通过如下命令行或者控制台创建命名空间bookinfo
,并部署我们修改之后的应用。在这个修改后的版本中去掉了details
组件,并定义了ingressgateway
。
本示例中涉及到的文件可以从示例获取到。
kubectl create ns bookinfo
kubectl label namespace bookinfo istio-injection=enabled
kubectl apply -n bookinfo -f ./bookinfo/bookinfo-without-details.yaml
kubectl apply -n bookinfo -f ./bookinfo/bookinfo-gateway.yaml
基于官方示例修改的部署,其中details
组件和数据库运行在Kubernetes之外的ECS上。
正常运行之后,通过ingressgateway
暴露的地址访问/productpage
页面,效果应该如下所示,details
部分应该不能正常显示。
设置Kubernetes
设置ECS
配置你自己的工作环境与ECS实例的授权,生成SSH key并分发到ECS中。可以通过ssh root@<ECS_HOST_IP>
命令确认是否可以成功连上ECS虚机。
生成公钥。
ssh-keygen -b 4096 -f ~/.ssh/id_rsa -N ""
说明 为保证ECS能与Kubernetes网络上可通,可以将ECS与Kubernetes加入到同一个安全组。
阿里云容器服务针对ECS的设置步骤提供了较好的用户体验,通过运行以下脚本即可完成配置。
export SERVICE_NAMESPACE=default
./setupMeshEx.sh machineSetup root@<ECS_HOST_IP>
检查运行的进程。
ps aux |grep istio

Istio认证使用的Node Agent健康运行。
sudo systemctl status istio-auth-node-agent
在ECS上运行务
由前面示例部署图知道,有2个服务需要运行在ECS上,一个是Details服务,另一个是数据库服务。
在ECS上运行Details服务
通过以下命令模拟(仅仅是用Docker模拟而已)一个Details
服务,运行在ECS上并暴露端口9080 。
docker pull istio/examples-bookinfo-details-v1:1.8.0
docker run -d -p 9080:9080 --name details-on-vm istio/examples-bookinfo-details-v1:1.8.0
配置Sidecar来拦截端口,这一配置存在于/var/lib/istio/envoy/sidecar.env,使用环境变量ISTIO_INBOUND_PORTS 。
示例 (在运行服务的虚拟机上)
echo"ISTIO_INBOUND_PORTS=9080,8080" > /var/lib/istio/envoy/sidecar.env
systemctl restart istio
注册数据库服务到Istio
配置Sidecar来拦截端口,这一配置存在于/var/lib/istio/envoy/sidecar.env,使用环境变量ISTIO_INBOUND_PORTS 。
示例 (在运行服务的虚拟机上)
echo"ISTIO_INBOUND_PORTS=3306,9080,8080" > /var/lib/istio/envoy/sidecar.env
systemctl restart istio
同样地,在一个有权限且能够使用istioctl命令的服务器上,注册数据库服务。
istioctl-nbookinforegistermysqldb 192.168.3.202 3306
经过这个步骤,Kubernetes Pod和其他网格扩展包含的服务器就可以访问运行于这一服务器上的数据库服务了。
此时访问/productpage
页面,效果应该如下所示,details与ratings部分均能正常显示,而且这2个服务都来自于ECS。
总结
阿里云Kubernetes容器服务已经提供了Istio Mesh Expansion整合能力,本文通过一个官方示例演示如何简单有效的集成Istio到自己项目的微服务开发中。