服务网格简介

简介

服务网格是一个基础架构层,它允许您管理应用程序的微服务之间的通信。随着越来越多的开发人员使用微服务,服务网络已经发展,通过将常见的管理和行政任务合并到分布式设置中,使这项工作变得更容易和更有效。

在应用程序体系结构中采用微服务方法涉及将应用程序分解为一组松散耦合的服务。这种方法提供了一定的好处:团队可以使用更广泛的工具和语言快速迭代设计和扩展。另一方面,微服务对操作复杂性、数据一致性和安全性提出了新的挑战。

服务网格旨在通过提供对服务如何相互通信的粒度级控制来解决其中一些挑战。具体来说,它们为开发人员提供了一种管理以下内容的方法:

  • 服务发现
  • 路由和流量配置
  • 加密和身份验证/授权
  • 指标和监控

虽然可以使用Kubernetes,)等容器协调器在本地完成这些任务,但与ISTIOLinkerd)等服务网状解决方案提供的开箱即用服务相比,这种方法涉及更多的前期决策和管理。从这个意义上说,服务网状结构可以简化微服务体系结构中使用公共组件的流程。在某些情况下,它们甚至可以扩展这些组件的功能。

为什么选择服务网格?

服务网旨在解决分布式应用程序体系结构固有的一些挑战。

这些体系结构是从三层应用程序模型发展而来的,该模型将应用程序分为Web层、应用程序层和数据库层。在规模上,这种模式对经历快速增长的组织来说具有挑战性。单片应用程序代码库可能会变得笨重[),这给开发和部署带来了挑战。

为了解决这个问题,像Google、Netflix和Twitter这样的组织开发了内部的胖客户端库来标准化跨服务的运行时操作。这些库提供了负载平衡、断路、路由和遥测-服务网格功能的先驱。但是,它们也对开发人员可以使用的语言施加了限制,并且在更新或更改服务时需要跨服务进行更改。

微服务设计避免了其中的一些问题。您拥有的不是一个大型的集中式应用程序代码库,而是一组分散管理的服务,它们代表应用程序的一个功能。微服务方法的好处包括:

  • 更大的开发和部署灵活性,因为团队可以独立开发和部署不同的应用功能。
  • CI/CD的更好选择,因为可以独立测试和重新部署单个微服务。
  • 语言和工具的更多选项。开发人员可以为手头的任务使用最好的工具,而不是受限于给定的语言或工具集。
  • 轻松伸缩。
  • 改进了正常运行时间、用户体验和稳定性。

与此同时,微服务也带来了挑战:

  • 分布式系统需要以不同的方式考虑延迟、路由、异步工作流和故障。
  • 微服务设置不一定满足与单片设置相同的数据一致性要求。
  • 更大的分发级别需要更复杂的运营设计,尤其是在服务到服务通信方面。
  • 服务分发增加了安全漏洞的表面积。

服务网络旨在通过提供对服务通信方式的协调和细粒度控制来解决这些问题。在接下来的部分中,我们将了解服务网格如何通过服务发现、路由和内部负载平衡、流量配置、加密、身份验证和授权以及度量和监控来促进服务到服务的通信。我们将使用Istio的Bookinfo Sample application--四个一起显示特定图书信息的微服务--作为一个具体的例子来说明服务网格是如何工作的。

服务发现

在分布式框架中,有必要知道如何连接到服务以及这些服务是否可用。服务实例位置在网络上动态分配,有关它们的信息随着容器的创建和销毁而不断变化,这些容器通过自动缩放、升级和故障来创建和销毁。

历史上,已经有一些工具用于在微服务框架中执行服务发现。像etcd)这样的键值存储与Registrator等其他工具配合使用,以提供服务发现解决方案。像Consul)这样的工具通过将键值存储与允许用户直接使用其dns服务器或节点的dns接口相结合来迭代这一点。

采用类似的方法,Kubernetes默认提供基于DNS的服务发现。有了它,您可以查找服务和服务端口,并使用常见的DNS命名约定执行反向IP查找。一般情况下,Kubernetes服务的A记录会匹配这样的模式:service.nampace.svc.cluster.local。让我们看看这在Bookinfo应用程序的上下文中是如何工作的。例如,如果你想从Bookinfo应用程序中获得关于Details服务的信息,你可以查看Kubernetes仪表板中的相关条目:

Kubernetes Dash中的详情服务

这将为您提供有关服务名称、命名空间和服务器IP的相关信息,您可以使用这些信息来连接您的服务,即使单个容器被销毁和重新创建。

像Istio这样的服务网状网也提供服务发现功能。为了进行服务发现,ITIO依赖于Kubernetes API和数据平面之间的通信,Kubernetes API是ITIO自己的控制平面,由流量管理组件Pilot,管理,数据平面由特使SideCar代理)管理。Pilot解释来自Kubernetes API服务器的数据,以注册Pod位置的更改。然后,它将该数据转换为规范的Istio表示,并将其转发到SideCar代理。

这意味着ITIO中的服务发现是平台无关的,这一点可以通过使用ITIO的Grafana add-on]在ITIO的服务仪表板中再次查看Details服务来看到:

详情服务istio dash

我们的应用运行在Kubernetes集群上,所以我们可以再次看到Details服务的相关DNS信息,以及其他性能数据。

在分布式体系结构中,拥有关于服务的最新、准确和易于定位的信息非常重要。Kubernetes和像Istio这样的服务网络都提供了使用DNS约定获取这些信息的方法。

路由和流量配置

在分布式框架中管理流量意味着控制流量如何到达您的集群以及如何将其定向到您的服务。您在配置外部和内部流量方面的控制力和专用性越强,您就越能利用您的设置完成更多工作。例如,在使用金丝雀部署、将应用程序迁移到新版本或通过故障注入对特定服务进行压力测试的情况下,能够确定您的服务获得了多少流量以及流量来自哪里,这将是成功实现您的目标的关键。

Kubernetes提供了不同的工具、对象和服务,允许开发人员控制集群的外部流量:kubectl proxyNodePort,[Load Balancers](https://kubernetes.io/docs/concepts/services-networking/service/ loadbalancer),和入口控制器和Resources.kubectl proxyNodePort都可以让您的服务快速暴露给外部流量:kubectl proxy创建一个代理服务器,允许通过HTTP路径访问静态内容,而NodePort在每个节点上公开一个随机分配的端口。虽然这提供了快速访问,但缺点包括必须以经过身份验证的用户身份运行kubectl,在kubectl proxy的情况下,以及在NodePort的情况下,在端口和节点IP方面缺乏灵活性。虽然负载均衡器通过附加到特定服务来优化灵活性,但每个服务都需要其自己的负载均衡器,这可能会很昂贵。

入口资源和入口控制器一起提供了比这些其他选项更大程度的灵活性和可配置性。通过将入口控制器与入口资源配合使用,您可以将外部流量路由至服务,并配置内部路由和负载平衡。要使用入口资源,您需要配置您的服务、入口控制器和LoadBalancer,以及入口资源本身,它将指定到您的服务的所需路由。目前,Kubernetes支持自己的ngix Controller,],但也有其他选项可供选择,由NginxKong,和其他公司管理。

Istio使用Istio Gateways和[VirtualServices](https://istio.io/docs/reference/config/istio.networking.v1alpha3/ VirtualService).]迭代Kubernetes控制器/资源模式与入口控制器类似,网关定义应如何处理传入流量,并指定要使用的公开端口和协议。它与VirtualService一起工作,该VirtualService定义了到网状网内服务的路由。这两个资源都将信息传达给Pilot,然后Pilot将该信息转发给特使的代理人。虽然它们类似于入口控制器和资源,但网关和虚拟服务提供了不同级别的流量控制:不是组合开放系统互连(OSI)层和protocols,网关和虚拟服务,而是允许您在设置中区分开放系统互连(OSI层)。例如,通过使用VirtualServices,使用应用层规范的团队可以将关注事项从使用不同层规范的安全运营团队中分离出来。VirtualServices使得在离散的应用程序功能上或在不同的信任域中分离工作成为可能,并可用于金丝雀测试、逐步部署、A/B测试等。

要可视化服务之间的关系,您可以使用ITIO的Servicegraph add-on,,它使用实时交通数据生成服务之间关系的动态表示。Bookinfo应用程序在未应用任何定制路由的情况下可能如下所示:

Bookinfo服务图

同样,您可以使用像Weave Scope]这样的可视化工具来查看给定时间您的服务之间的关系。没有高级路由的Bookinfo应用程序可能如下所示:

编织作用域服务Map

在分布式框架中配置应用程序流量时,有许多不同的解决方案-从Kubernetes-原生选项到像Istio这样的服务网络-提供了各种选项来确定外部流量如何到达您的应用程序资源,以及这些资源如何相互通信。

加密与鉴权授权

分布式框架带来了安全漏洞的机会。微服务体系结构中的服务通过网络传递信息(包括特权信息),而不是像在单片设置中那样通过本地内部调用进行通信。总体而言,这为攻击创造了更大的表面积。

保护Kubernetes集群涉及一系列过程;我们将重点介绍身份验证、授权和加密。Kubernetes提供了解决这些问题的原生方法:

  • **Kubernetes中的** Authentication** :接口请求绑定了用户或服务账户,需要进行身份验证。有几种不同的方式来管理必要的凭据:静态令牌、引导令牌、X509客户端证书和外部工具,如OpenID连接.
  • **** Authorization** :Kubernetes有不同的授权模块,允许您根据角色、属性和其他专门功能来确定访问权限。由于发送到API服务器的所有请求在默认情况下都被拒绝,因此API请求的每个部分都必须由授权策略定义。
  • 加密 :指终端用户与服务的连接、秘密数据、Kubernetes控制面中的端点、Worker集群组件与Master组件之间的通信。库伯内斯对其中每一项都有不同的解决方案: -入口控制器和Resources,,可与cert-manager等附加组件一起使用来管理TLS证书。 -rest秘密数据加密,用于加密etcd中的秘密资源。 -tls bootstrapping用于引导kubelet的客户端证书,并确保工作节点与kube-apisever之间的通信安全。您也可以使用像Weave NettoDo this.]这样的覆盖网络

在Kubernetes中配置单独的安全策略和协议需要管理投资。像Istio这样的服务网可以整合其中的一些活动。

Istio旨在自动化一些确保服务安全的工作。其控制平面包括几个处理安全问题的组件:

*Citadel :管理密钥和证书。 *Pilot :监督认证和命名策略,并与Envoy代理共享此信息。 *Mixer :管理授权和审计。

例如,当您创建服务时,Citadel从kube-apiserver接收信息并创建SPIFFE证书和密钥。然后,它将这些信息传输到Pods和特使侧车,以促进各军种之间的通信。

您还可以在安装ITIO期间通过启用Mutual TLS]来实现一些安全功能。其中包括用于跨群集和群集间通信的强服务身份、安全的服务到服务和用户到服务通信,以及可以自动创建、分发和轮换密钥和证书的密钥管理系统。

通过迭代Kubernetes处理身份验证、授权和加密的方式,像Istio这样的服务网格能够整合和扩展一些推荐的运行安全Kubernetes集群的最佳实践。

指标和监控

分布式环境改变了对指标和监控的要求。监控工具需要具有适应性,能够考虑服务和网络地址的频繁更改,并且全面,允许在服务之间传递的信息量和类型。

默认情况下,Kubernetes包含一些内部监控工具。这些资源属于ITSRESOURCE Metrics pipeline,],它确保集群按预期运行。[cAdvisor](https://kubernetes.io/docs/tasks/debug-application-cluster/resource-usage-monitoring/ cadvisor)组件从各个容器和节点收集网络使用情况、内存和CPU统计信息,并将该信息传递给kubelet;kubelet进而通过rest API公开该信息。指标Server从接口获取这些信息,然后将其传递给kube-aggregator进行格式化。

您可以使用完整的指标解决方案扩展这些内部工具和监控功能。使用像Prometheus)这样的服务作为指标聚合器允许您直接在Kubernetes资源指标管道之上进行构建。Prometheus通过位于节点上的自己的代理直接与cAdvisor集成。它的主要聚合服务从节点收集和存储数据,并通过仪表板和API公开数据。如果您选择将主聚合服务与后端存储、日志记录和可视化工具(如InfluxDBGrafanaElasticSearchLogstashKibana,和其他))集成在一起,还可以使用其他存储和可视化选项。

在像Istio这样的服务网状网中,完整指标管道的结构是网状网设计的一部分。在Pod级别运行的特使侧车将指标传递给Mixer,,后者管理策略和遥测。此外,默认情况下会启用普罗米修斯和Grafana服务(但如果您使用HELM)安装ITIO,则需要在安装过程中指定granafa.enabled=true)。与完整指标管道的情况一样,您还可以配置其他服务和deployments以用于记录和查看选项。

有了这些指标和可视化工具,您可以集中访问有关服务和工作负载的最新信息。例如,BookInfo应用程序的全局视图在Istio Grafana仪表板中可能如下所示:

Grafana dash提供的Bookinfo服务

通过复制Kubernetes完整度量管道的结构并简化对其一些通用组件的访问,像Istio这样的服务网格在使用集群时简化了数据收集和可视化的过程。

结论

微服务架构旨在快速可靠地进行应用程序开发和部署。然而,部门间通信的增加改变了某些行政任务的最佳做法。本文讨论其中的一些任务,如何在Kubernetes原生上下文中处理它们,以及如何使用服务网格(在本例中是Istio)来管理它们。

有关这里介绍的一些Kubernetes主题的更多信息,请参阅以下资源:

此外,KubernetesISIO文档中心是查找有关此处讨论的主题的详细信息的好地方。

Published At
Categories with 技术
comments powered by Disqus