最新一代微服务:Istio详解
Posted DevOps和k8s全栈技术
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最新一代微服务:Istio详解相关的知识,希望对你有一定的参考价值。
下面实验需要的镜像和yaml文件在百度网盘,公众号回复:istio,即可获取到相关资料。
1.1 带你认识微服务
Istio称的上是最新一代微服务,目前社区活跃度极高,跟k8s有很好的互补,那什么是微服务呢?
1.1.1 什么是微服务?
微服务可以从两个方面理解:
微:小的意思,大家可以搜索下2 pizza(两个披萨原则),这个2 pizza 原则最早是亚马逊 CEO 贝索斯提出来的,他认为如果两个披萨不足以喂饱一个项目团队,那么这个团队可能就显得太大了,因为人数过多的项目会议将不利于决策的形成,而让一个小团队在一起做项目、开会讨论,则更有利于达成共识,并能有效促进企业内部创新。
服务:相对较小且独立的功能单元
官方解释:
微服务是用于构建应用程序的架构风格,一个大的系统可由一个或者多个服务组成,微服务架构可将应用拆分成多个核心功能,每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作和出现故障的时候不会相互影响。简单来说,微服务架构是把一个大的系统按照不同的业务单元分解成多个职责单一的小系统,并利用简单的方法使多个小系统相互协作,组合成一个大系统,各个小的系统是独立部署的,它们之间是松耦合的。
互动:回想一下在线购物时的情景
在使用网站上的搜索栏浏览产品时,这个搜索功能就是一项服务。
可以看到相关产品推荐,这些推荐项均来自数据库,这也是一项服务。
将商品添加到在线购物车中,这又是另一项服务。
微服务架构图
1.1.2 微服务架构的优势
1、可以让产品更快的上市
由于开发周期缩短,微服务架构有助于实现更加敏捷的部署和更新。
2、高度可扩展
随着某些服务的不断扩展,你可以跨多个服务器和基础架构进行部署,充分满足自身需求。
3、出色的弹性
只要确保正确构建,这些独立的服务就不会彼此影响。这意味着,一个服务出现故障不会导致整个应用下线。
4、易于部署
相对于传统的单体式应用,基于微服务的应用更加模块化且小巧,所以无需为它们的部署操心。
5、易于访问
由于大型应用被拆分成了多个小型服务,所以开发人员能够更加轻松地理解、更新和增强这些服务,从而缩短开发周期。
6、更加开放
由于使用了多语言 API,所以开发人员可以根据需要实现的功能,自由选用最适合的语言和技术。
1.2 微服务架构发展进程
第一代微服务框架
SpringCloud
springCloud为开发者提供了快速构建分布式系统的通用模型的工具,主要是针对java的开发框架
第二代微服务框架
dubbo
Dubbo是一个阿里巴巴开源出来的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案
第三代微服务框架
1.Service Mesh(服务网格)
istio是开源的Service Mesh(服务网格),Service Mesh翻译成中文就是服务网格
1.3 微服务框架对比分析
主流微服务框架:SpringCloud、Dubbo
新锐微服务框架:k8s+istio
1、框架背景对比
(1)SpringCloud,来源于SpringSource ,具有Spring社区的强大背景支持,还有 Netflix强大的后盾与技术输出。
扩展:Netflix是什么?
Netflix作为一家成功实践微服务架构的互联网公司,在几年前就把几乎整个微服务框架开源贡献给了社区,这些框架开源的整套微服务架构套件是SpringCloud的核心。包括:
Eureka: 服务注册发现框架;
Zuul: 服务网关;
Karyon: 服务端框架;
Ribbon: 客户端框架;
Hystrix: 服务容错组件;
Archaius: 服务配置组件;
Servo: Metrics组件;
Blitz4j: 日志组件。
(2)Dubbo 是一个分布式服务框架,是国内互联网公司阿里开放的微服务化治理框架,致力于提供高性能和透明化的RPC远程过程调用方案,以及SOA服务治理方案。其核心部分包含):
扩展:RPC((Remote Procedure Call))?
简单的理解是一个节点请求另一个节点提供的服务
扩展:SOA(面向服务的架构)
面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。
(3)Istio 作为用于微服务服务聚合层管理的新锐项目,是 Google、IBM、Lyft(海外共享出行公司、Uber劲敌) 首个共同联合开源的项目,提供了统一的连接,安全,管理和监控微服务的方案。
2、开源社区活跃度对比
开源社区情况:现如今企业在采用云计算首选开源,而选择一个开源框架,社区的活跃度将作为重要参考选项。
查看下在Github上的更新时间
Spring Cloud :Spring Cloud · GitHub → 所有项目均更新于『1 小时』内。
Dubbo :Dubbo · GitHub → 核心项目最近更新于『一个月乃至数月』前。
istio:istio · GitHub → 所有项目均更新于『30 分钟』内。
总结:结合项目背景、提供功能、社区更新活跃度,SpringCloud 是目前阶段发展最早的微服务框架方案,Istio 作为Kubernetes 的优先支持来讲,也是一个值得关注的方案,而且发展潜力巨大,相信不久的将来90%+的k8s用户都会使用istio。
1.4 使用微服务需要解决的问题
1.4.1 配置中心
微服务为什么要解决配置中心问题?
在企业中,一般都有2-4种环境:开发,测试,交付,生产这四种,这几种环境的配置也有所变化,我们在部署的时候通常不能一个配置文件部署四个环境,这些环境的配置是不通用的。这就要用到k8s原生的配置中心configMap就是用解决这个问题的
常见的配置中心有哪些:Nacos、Apollo、SpringCloudConfig、k8s configmap
配置管理流程:
配置的权限管理、灰度发布、版本管理、格式检验和安全配置等一系列的配置管理相关的特性也是配置中心不可获取的一部分。
1)权限管理
配置的变更和代码变更都是对应用运行逻辑的改变,重要的配置变更常常会带来核弹的效果,通过项目的维度来对配置进行权限管理,一个项目的owner可以授权给其他用户配置的修改发布权限。
2)灰度发布
配置的灰度发布是配置中心比较重要的功能,当配置的变更影响比较大的时候,需要先在部分应用实例中验证配置的变更是否符合预期,然后再推送到所有应用实例。
3)版本管理&回滚
当配置变更不符合预期的时候,需要根据配置的发布版本进行回滚。
4)配置格式校验
应用的配置数据存储在配置中心一般都会以一种配置格式存储,比如Properties、Json、Yaml等,如果配置格式错误,会导致客户端解析配置失败引起生产故障,配置中心对配置的格式校验能够有效防止人为错误操作的发生,是配置中心核心功能中的刚需。
1.4.2 服务发现
以k8s中部署应用为例:
Kubernetes集群就为我们提供了这样的一个对象 - Service,Service是一种抽象的对象,它定义了一组Pod的逻辑集合和一个用于访问它们的策略,其实这个概念和微服务非常类似。一个Serivce下面包含的Pod一般是由Label Selector来决定的。
1.5 Istio概念、架构、组件详细介绍
1.5.1 Istio是什么?
Istio 是一个与Kubernetes紧密结合
的适用于云原生场景
下用于服务治理
的开放平台。
服务治理包括:
连接(Connect)、安全(Secure)、策略执行(Control)和可观察性(Observe)。
1)连接:
Istio通过集中配置的流量规则控制服务间的流量和调用,实现负载均衡、熔断、故障注入、重试、重定向等服务治理功能。
2)安全:
Istio提供透明的认证机制、通道加密、服务访问授权等安全能力,可增强服务访问的安全性。
3)策略执行:Istio通过可动态插拔、可扩展的策略实现访问控制、速率限制、配额管理、服务计费等能力。
4)可观察性:
动态获取服务运行数据和输出,提供强大的调用链、监控和调用日志收集输出的能力。配合可视化工具,可方便运维人员了解服务的运行状态,发现并解决问题。
5)策略与遥测:
常常需要为服务设置一定的授权策略,比如限制流量的速率、设置黑名单等。另外,遥测(Telemetry)也是一个很重要的功能,可以通过分析收集到的指标(Metric)来监控系统的状态。在Istio中,策略设定和遥测都是通过Mixer组件完成的(mixer在1.5+已经被废弃了,整合到istiod中了)
1.5.2 Istio架构
1、数据平面由部署为Sidecar的一组智能代理(Envoy+Polit-agent)组成。这些代理承载并控制微服务之间的所有网络通信,管理入口和出口流量,类似于一线员工。
2、控制平面管理并配置代理来进行流量路由。
3、istio1.5+中使用了一个全新的部署模式,重建了控制平面,将原有的多个组件整合为一个单体结构istiod,这个组件是控制平面的核心,负责处理配置、证书分发、sidecar 注入等各种功能。istiod是新版本中最大的变化,以一个单体组件替代了原有的架构,在降低复杂度和维护难度的同时,也让易用性得到提升。需要注意的一点是,原有的多组件并不是被完全移除,而是在重构后以模块的形式整合在一起组成了istiod。
数据平面:
Envoy 和 pilot-agent 打在同一个镜像中,即Proxy。
1.5.3 istio组件
1、Envoy
Envoy是什么?
Envoy是用 C++ 开发的高性能代理,用于协调服务网格中所有服务的入站和出站流量。
Envoy有许多强大的功能,例如:
动态服务发现
负载均衡
TLS终端
HTTP/2与gRPC代理
熔断
健康检查
基于百分比流量拆分的灰度发布
故障注入
丰富的指标
Istio中Envoy与服务什么关系?
为了便于理解Istio中Envoy与服务的关系,下图为Envoy的拓扑图,如图所示:
Envoy和Service A同属于一个Pod,共享网络和命名空间,Envoy代理进出Pod A的流量,并将流量按照外部请求的规则作用于Service A中。
Pilot-agent是什么?
Envoy不直接跟k8s交互,通过pilot-agent管理的
Pilot-agent进程根据K8S APIserver中的配置信息生成Envoy的配置文件,并负责启动Envoy进程。
2、Pilot
1)Pilot为Envoy提供服务发现
2)提供流量管理功能(例如,A/B 测试、金丝雀发布等)以及弹性功能(超时、重试、熔断器等);
3)生成envoy配置
4)启动envoy
5)监控并管理envoy的运行状况,比如envoy出错时pilot-agent负责重启envoy,或者envoy配置变更后reload envoy
3、Citadel
负责处理系统上不同服务之间的TLS通信。Citadel充当证书颁发机构(CA),并生成证书以允许在数据平面中进行安全的mTLS通信。
Citadel通过内置的身份和证书管理,可以支持强大的服务到服务以及最终用户的身份验证。
可以使用 Citadel来升级服务网格中的未加密流量。
4、Galley
Galley是istio的配置验证、提取、处理和分发组件。Galley提供配置管理的服务。实现原理是通过k8s提供的ValidatingWebhook对配置进行验证。比如我们在部署istio的时候,会部署如下的ValidatingWebhook :
apiVersion: admissionregistration.k8s.io/v1beta1
kind: ValidatingWebhookConfiguration
metadata:
name: istiod-istio-system
labels:
app: istiod
release: istio
istio: istiod
webhooks:
name: validation.istio.io
clientConfig:
service:
name: istiod
namespace: istio-system
path: "/validate"
caBundle: "" # patched at runtime when the webhook is ready.
rules:
operations:
CREATE
UPDATE
apiGroups:
config.istio.io
security.istio.io
authentication.istio.io
networking.istio.io
apiVersions:
"*"
resources:
"*"
# Fail open until the validation webhook is ready. The webhook controller
# will update this to `Fail` and patch in the `caBundle` when the webhook
# endpoint is ready.
failurePolicy: Ignore
sideEffects: None
admissionReviewVersions: ["v1beta1", "v1"]
Galley使Istio可以与Kubernetes之外的其他环境一起工作,因为它可以将不同的配置数据转换为Istio可以理解的通用格式。
1.6 为什么要用Istio?
Istio 作为目前众多 Service Mesh 中最闪耀的新星,他到底有哪些闪光点和功能?我们又为什么要选择使用它呢?
1)流量管理:
Istio 通过Pilot所提供的API动态地配置所有Pod中Sidecar 的路由规则,进而控制服务间的流量和 API 调用。Istio 简化了断路器、超时和重试等服务级别属性的配置,并且可以轻松设置 A/B 测试、金丝雀部署和基于百分比的流量分割的分阶段部署等重要任务。
2)安全:
Istio 提供给开发人员应用程序级别的安全性。Istio 提供底层安全通信信道,并大规模管理服务通信的认证、授权和加密。使用 Istio ,服务通信在默认情况下是安全的,它允许跨多种协议和运行时一致地实施策略——所有这些都很少或根本不需要应用程序更改。将 Istio 与 Kubernetes 的网络策略结合使用,其优势会更大,包括在网络和应用层保护Pod间或服务间通信的能力。
3)可观察性:
Istio 的 Mixer 组件负责策略控制和遥测收集。通过 Istio 的监控功能,可以了解服务性能如何影响上游和下游的功能;其自定义仪表板可以提供对所有服务性能的可视化,从而了解性能如何影响其他进程。
4)平台独立: Istio 是独立于平台的,旨在运行在各种环境中,包括跨云、内部部署、Kubernetes、Mesos 等。可以在 Kubernetes 上部署 Istio 或具有 Consul 的Nomad 上部署。
5)集成和定制: 策略执行组件可以扩展和定制,以便与现有的 ACL、日志、监控、配额、审计等方案集成。
6)istio为可扩展性而设计,可以满足不同的部署需求。
1.7 Istio如何与k8s完美结合?
1.7.1 k8s和istio各自功能解读
Kubernetes提供了部署、升级、扩缩容和有限的流量管理等能力;利用service的机制来做服务注册和发现,通过kube-proxy实现转发和负载均衡。但并不具备上层如熔断、限流降级、动态路由、调用链治理等能力。
Istio则很好的补齐了k8s在微服务治理上的这部分能力,同时是基于k8s构建的,但不是像SpringCloud Netflix完全重新做一套。Istio在谷歌微服务治理上已经落地实施
1.7.2 在Kubernetes上叠加Istio
Kubernetes的Service基于每个节点的Kube-proxy从Kube-apiserver上获取Service和Endpoint的信息,并将对Service的请求经过负载均衡转发到对应的 Endpoint 上。在服务健康检查上只提供了基本的探针机制,并不提供服务访问指标和调用链追踪这种应用的服务运行诊断能力。
Istio复用了Kubernetes Service的定义。Istio的服务发现就是从Kube-apiserver中获取Service和Endpoint,然后将其转换成Istio服务模型的Service,但是其数据面组件不再是Kube-proxy,而是在每个Pod里部署了Envoy代理,通过拦截Pod的Inbound流量和Outbound流量,可以做更多更细粒度的服务治理、监控和安全等能力。
对于云原生应用,采用Kubernetes构建微服务部署和集群管理能力,采用Istio构建服务治理能力,这将成为微服务的主流方案。
1.7.3 Istio在AI领域的应用
AI领域中,深度学习模型的持续优化是生产应用重要挑战,它关乎到整体效率及资源利用率。比如电商平台,需要根据用户行为记录持续训练模型,才能更好地对用户偏好和消费热点进行有效地预测。同时一个新模型上线也需要一个安全可控的流程来验证新模型带来的改进。而基于Istio,阿里云可以轻巧实现流量控制和模型版本的更新及回滚,以及适用于深度学习模型灰度发布能力。
在AI领域之外,目前阿里云已经支持游戏行业、自动化办公、在线教育、互联网广告的等数家客户基于Istio在Kubernetes集群上进行微服务应用的开发。
1.8 在k8s平台安装Istio
1.8.1 准备安装Istio是要的压缩包
官网下载地址:
https://github.com/istio/istio/releases/download
1、把压缩包上传到k8s的控制节点master1。手动解压:
tar zxvf istio-1.8.1.tar.gz
2、切换到istio包所在目录下。Istio-1.8.1.tar.gz解压的软件包包名是istio-1.8.1,则:
cd istio-1.8.1
安装目录包含如下内容:
1)install/kubernetes 目录下,有 Kubernetes 相关的 YAML 安装文件
2)samples/目录下,有示例应用程序
3)bin/目录下,包含istioctl的客户端文件。istioctl工具用于手动注入Envoy sidecar代理。
3、将istioctl客户端路径增加到path环境变量中,macOS 或 Linux 系统的增加方式如下:
export PATH=$PWD/bin:$PATH
4、把istioctl这个可执行文件拷贝到/usr/bin/目录
cd /root/istio-1.8.1/bin/
cp -ar istioctl /usr/bin/
1.8.2 安装istio
1.下载镜像:
安装istio需要的镜像默认从官网拉取,但是官网的镜像我们拉取会有问题,可以从课件下载镜像,然后上传到自己k8s集群的各个节点,通过docker load -i手动解压镜像:
docker load -i examples-bookinfo-details.tar.gz
docker load -i examples-bookinfo-reviews-v1.tar.gz
docker load -i examples-bookinfo-productpage.tar.gz
docker load -i examples-bookinfo-reviews-v2.tar.gz
docker load -i examples-bookinfo-ratings.tar.gz
docker load -i examples-bookinfo-reviews-v3.tar.gz
docker load -i pilot.tar.gz
docker load -i proxyv2.tar.gz
docker load -i httpbin.tar.gz
2.安装
在k8s的控制节点master1操作
istioctl install --set profile=demo -y
看到如下,说明istio初始化完成:
Detected that your cluster does not support third party JWT authentication. Falling back to less secure first party JWT. See https://istio.io/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for details.
- Applying manifest for component Base...
✔ Finished applying manifest for component Base.
- Applying manifest for component Pilot...
✔ Finished applying manifest for component Pilot.
Waiting for resources to become ready...
Waiting for resources to become ready...
- Applying manifest for component EgressGateways...
- Applying manifest for component IngressGateways...
- Applying manifest for component AddonComponents...
✔ Finished applying manifest for component EgressGateways.
✔ Finished applying manifest for component IngressGateways.
✔ Finished applying manifest for component AddonComponents.
✔ Installation complete
3.验证istio是否部署成功
kubectl get pods -n istio-system
显示如下,说明部署成功
istio-egressgateway-d84f95b69-5gtdc 1/1 Running 0 15h
istio-ingressgateway-75f6d79f48-fhxjj 1/1 Running 0 15h
istiod-c9f6864c4-nrm82 1/1 Running 0 15h
4.卸载istio集群,暂时不执行,记住这个命令即可
istioctl manifest generate --set profile=demo | kubectl delete -f –
实战1:通过Istio部署在线书店bookinfo
1.在线书店功能介绍
在线书店-bookinfo
该应用由四个单独的微服务构成,这个应用模仿在线书店的一个分类,显示一本书的信息,页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。
Bookinfo应用分为四个单独的微服务
1)productpage这个微服务会调用details和reviews两个微服务,用来生成页面;
2)details这个微服务中包含了书籍的信息;
3)reviews这个微服务中包含了书籍相关的评论,它还会调用ratings微服务;
4)ratings这个微服务中包含了由书籍评价组成的评级信息。
reviews微服务有3个版本
1)v1版本不会调用ratings服务;
2)v2版本会调用ratings服务,并使用1到5个黑色星形图标来显示评分信息;
3)v3版本会调用ratings服务,并使用1到5个红色星形图标来显示评分信息。
下图展示了这个应用的端到端架构
Bookinfo应用中的几个微服务是由不同的语言编写的。这些服务对istio并无依赖,但是构成了一个有代表性的服务网格的例子:它由多个服务、多个语言构成,并且reviews服务具有多个版本。
2.部署应用
要在Istio中运行这一应用,无需对应用自身做出任何改变。只要简单的在 Istio 环境中对服务进行配置和运行,具体一点说就是把Envoy sidecar 注入到每个服务之中。最终的部署结果将如下图所示:
sidecar集成在一起,被集成服务所有的出入流量都被envoy sidecar 所劫持,这样就为外部控制准备了所需的 Hook,然后就可以利用Istio控制平面为应用提供服务路由、遥测数据收集以及策略实施等功能。
3.启动应用服务
1.进入istio安装目录。
sidecar,需要¬¬为default命名空间打上标签istio-injection=enabled
kubectl label namespace default istio-injection=enabled
3.使用kubectl部署应用
cd istio-1.8.1
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
reviews 服务的三个版本(v1、v2 以及 v3)。
Pod 都已经正确的定义和启动:
kubectl get services
显示如下
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
details ClusterIP 10.109.124.202 <none> 9080/TCP
productpage ClusterIP 10.102.89.129 <none> 9080/TCP
ratings ClusterIP 10.101.97.75 <none> 9080/TCP
reviews ClusterIP 10.100.105.33 <none> 9080/TCP
kubectl get pods
显示如下
NAME READY STATUS RESTARTS AGE
2/2 Running 0 73m
2/2 Running 0 73m
2/2 Running 0 73m
2/2 Running 0 73m
2/2 Running 0 73m
2/2 Running 0 73m
1/1 Running 0 22h
1/1 Running 0 22h
1/1 Running 0 22h
Bookinfo 应用是否正在运行,在某个Pod中用curl命令对应用发送请求,例如ratings:
kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"
显示如下:
6.确定Ingress的IP和端口
Gateway来实现这个目标。
1)为应用程序定义Ingress网关:
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
2)确认网关创建完成:
kubectl get gateway
显示如下:
NAME AGE
2m18s
ip和端口
Kubernetes 集群环境支持外部负载均衡:
kubectl get svc istio-ingressgateway -n istio-system
如果EXTERNAL-IP值已设置,说明环境正在使用外部负载均衡,可以用其为ingress gateway 提供服务。如果EXTERNAL-IP值为<none>(或持续显示<pending>), 说明环境没有提供外部负载均衡,无法使用ingress gateway。在这种情况下,你可以使用服务的NodePort访问网关。
若自身环境未使用外部负载均衡器,需要通过 node port 访问。执行如下命令。设置 ingress 端口:
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
4)设置GATEWAY_URL
INGRESS_HOST=192.168.40.130
#192.168.40.130是安装istio的机器,即k8s控制节点master1的ip
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
echo $GATEWAY_URL 显示如下:
192.168.40.130:32109
确认可以从集群外部访问应用
可以用 curl 命令来确认是否能够从集群外部访问 Bookinfo 应用程序:
curl -s http://${GATEWAY_URL}/productpage | grep -o "<title>.*</title>"
显示如下:
还可以用浏览器打开网址 http://$GATEWAY_URL/productpage,也就是192.168.40.130:32109/productpage来浏览应用的 Web 页面。如果刷新几次应用的页面,就会看到 productpage 页面中会随机展示 reviews 服务的不同版本的效果(红色、黑色的星形或者没有显示)。
精彩文章推荐
微信公众号
点亮,服务器10年不宕机
以上是关于最新一代微服务:Istio详解的主要内容,如果未能解决你的问题,请参考以下文章