本博客为 http://zhaohuabing.com 在优快云的镜像,评论请移步 http://zhaohuabing.com/2017/11/04/istio-install_and_example/
服务网格简介
服务网格(Service Mesh)是为解决微服务的通信和治理而出现的一种架构模式。
服务网格将服务间通讯以及与此相关的管理控制功能从业务程序中下移到一个基础设施层,从而彻底隔离了业务逻辑和服务通讯两个关注点。采用服务网格后,应用开发者只需要关注并实现应用业务逻辑。服务之间的通信,包括服务发现,通讯的可靠性,通讯的安全性,服务路由等由服务网格层进行处理,并对应用程序透明。
让我们来回顾一下微服务架构的发展过程。在出现服务网格之前,我们在微服务应用程序进程内处理服务通讯逻辑,包括服务发现,熔断,重试,超时等逻辑,如下图所示:
通过对这部分负责服务通讯的逻辑进行抽象和归纳,可以形成一个代码库供应用程序调用。但应用程序还是需要处理和各种语言代码库的调用细节,并且各种代码库互不兼容,导致对应用程序使用的语言和代码框架有较大限制。
如果我们更进一步,将这部分逻辑从应用程序进程中抽取出来,作为一个单独的进程进行部署,并将其作为服务间的通信代理,如下图所示:
因为通讯代理进程和应用进程一起部署,因此形象地把这种部署方式称为“sidecar”(三轮摩托的挎斗)。
应用间的所有流量都需要经过代理,由于代理以sidecar方式和应用部署在同一台主机上,应用和代理之间的通讯被认为是可靠的。然后由代理来负责找到目的服务并负责通讯的可靠性和安全等问题。
当服务大量部署时,随着服务部署的sidecar代理之间的连接形成了一个如下图所示的网格,被称之为Service Mesh(服务网格),从而得出如下的服务网格定义。
服务网格是一个基础设施层,用于处理服务间通信。云原生应用有着复杂的服务拓扑,服务网格保证请求可以在这些拓扑中可靠地穿梭。在实际应用当中,服务网格通常是由一系列轻量级的网络代理组成的,它们与应用程序部署在一起,但应用程序不需要知道它们的存在。
William Morgan WHAT’S A SERVICE MESH? AND WHY DO I NEED ONE?_ _
了解了服务网格的基本概念,下一步介绍一下Istio。Istio是来自Google,IBM和Lyft的一个Service Mesh(服务网格)开源项目,是Google继Kubernetes之后的又一大作,Istio架构先进,设计合理,刚一宣布就获得了Linkerd,nginmesh等其他Service Mesh项目的合作以及Red hat/Pivotal/Weaveworks/Tigera/Datawire等的积极响应。
可以设想,在不久的将来,微服务的标准基础设施将是采用kubernetes进行服务部署和集群管理,采用Istio处理服务通讯和治理,两者相辅相成,缺一不可。
安装Kubernetes
Istio是微服务通讯和治理的基础设施层,本身并不负责服务的部署和集群管理,因此需要和Kubernetes等服务编排工具协同工作。
Istio在架构设计上支持各种服务部署平台,包括kubernetes,cloud foundry,Mesos等,但Istio作为Google亲儿子,对自家兄弟Kubernetes的支持肯定是首先考虑的。目前版本的0.2版本的手册中也只有Kubernetes集成的安装说明,其它部署平台和Istio的集成将在后续版本中支持。
从Istio控制面Pilot的架构图可以看到各种部署平台可以通过插件方式集成到Istio中,为Istio提供服务注册和发现功能。
kubernetes集群的部署较为复杂,Rancher提供了kubernetes部署模板,通过一键式安装,可以大大简化kubernetes集群的安装部署过程。
本文的测试环境为两台虚机组成的集群,操作系统是Ubuntu 16.04.3 LTS。两台虚机的地址分别为:
Rancher Server: 10.12.25.60
工作节点: 10.12.25.116
通过Rancher安装Kubernetes集群的简要步骤如下:
在server和工作节点上安装docker
因为k8s并不支持最新版本的docker,因此需根据该页面安装指定版本的docker
http://rancher.com/docs/rancher/v1.6/en/hosts/ ,目前是1.12版本。
curl https://releases.rancher.com/install-docker/1.12.sh | sh
启动Rancher server
sudo docker run -d --restart=always -p 8080:8080 rancher/server
登录Rancher管理界面,创建k8s集群
Rancher 管理界面的缺省端口为8080,在浏览器中打开该界面,通过菜单Default->Manage Environment->Add Environment添加一个kubernetes集群。这里需要输入名称kubernetes,描述,然后选择kubernetes template,点击create,创建Kubernetes环境。
点击菜单切换到kubernetes Environment,然后点击右上方的Add a host,添加一台host到kubernetes集群中。注意添加到集群中的host上必须先安装好符合要求的docker版本。
然后根据Rancher页面上的提示在host上执行脚本启动Rancher agent,以将host加入ranch cluster。注意脚本中包含了rancher server的地址,在host上必须可以ping通该地址。
host加入cluster后Rancher会在host上pull kubernetes的images并启动kubernetes相关服务,根据安装环境所在网络情况不同需要等待几分钟到几十分钟不等。
安装并配置kubectl
待Rancher界面提示kubernetes创建成功后,安装kubernetes命令行工具kubectl
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.7.4/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
登录Rancher管理界面, 将 All Environments->kubernetes->KUBERNETES->CLI create config 的内容拷贝到~/.kube/config 中,以配置Kubectl和kubernetes server的连接信息。
安装Istio
Istio提供了安装脚本,该脚本会根据操作系统下载相应的Istio安装包并解压到当前目录。
curl -L https://git.io/getLatestIstio | sh -
根据脚本的提示将Istio命令行所在路径加入到系统PATH环境变量中
export PATH="$PATH:/home/ubuntu/istio-0.2.10/bin"
在k