转载

微服务网格(二):Istio 基础

【编者的话】本文是微服务网格的第三篇,讲述了Istio的数据面和控制面的功能,并通过部署前几篇中定义的Kubernetes服务以及添加一个sidecar代理,展示Istio的基本功能。

在Kubernetes中创建基本的微服务看似简单。在我们的 上一篇文章 中,我们展示了使用容器部署是多么容易。我们构建了一个简单的Docker镜像,使用Kubernetes部署它,并查询我们的应用程序。当然,那是相对无痛的!但在现实世界中,云架构通常比这更复杂,涉及数十或数百种服务,包括数据库,身份验证和其他现实问题。

管理所有这些服务是一个真正的麻烦。在本文中,我们将介绍Istio,它是提高和管理大规模云部署的下一代利器。早些时候,我们讨论了微服务的网状结构,这是Istio所支持的。

微服务网格能使你获得微服务架构的可扩展性优势,同时还支持基于集中的优势,例如日志记录和版本控制。有关网格的更多信息,请参阅我们之前的 讨论 ,概述网格的基础知识及其提供的优势。

在这篇文章中,我们将了解Istio在实现云网格架构模式时所提供的能力。我们将安装控制平面,然后查看Istio有什么优势。最后,我们将采用上次定义的Kubernetes服务并添加一个sidecar代理,并将其链接到上面的控制面板。

深入:数据平面和边车(sidecar)

Istio定义了两个关键的架构术语,数据平面和控制平面。 数据平面是指通过应用程序流动的数据,传递给不同的服务实例并由服务本身处理。 数据平面主要通过边车代理(sidecar-proxy)实现。 控制层确定如何实例化服务以及保持服务的遥测和信息的位置。 控制平面的关键元素是Pilot和Mixer。让我们按顺序看看它们。

sidecar代理与pod一起运行,定义了你在Kubernetes的服务。 顾名思义,它与主要服务组件一起添加,并且它针对该服务的流量进行操作。 此设计允许你在pod中为现有服务定义添加sidecar代理:只需将定义sidecar的行添加到服务中即可开始工作。

微服务网格(二):Istio 基础

你获得的回报是Istio云网产品的核心优点。 sidecar代理拦截进入服务的流量,并允许你以智能方式路由它。这可能意味着像负载均衡和处理TLS终止这样简单的事情,这是一种加快速度的简单方法,或者更复杂的事情,例如处理新版本服务的版本控制和分阶段部署以及收集使用指标。 sidecar允许你将这些功能添加到现有的微服务架构中,而 无需重新设计整个系统

在掌握了sidecar的最初目标之后,Istio和云网的大部分功能都成为焦点。由于它们充当服务舱之间的单一、统一的桥梁,因此side car会共同遇到并查看流经你的应用程序的所有流量。这意味着如果你想加强安全性,sidecar可以提供一个位置,你可以在其中添加服务之间的身份验证和https,记录事件以检查异常情况,以及添加流量控制和守门( gatekeeping)以进行身份​​验证。

最重要的是,由于sidecars充当服务之间的中央通信端点,因此它们允许你在应用程序中构建弹性并添加额外级别的可伸缩性。微服务的一个常见问题是服务器pod都是隔离的,如果微服务出现问题,请求可能会被缓慢处理或丢弃。使用sidecars,你可以在一个地方添加超时,更智能的负载均衡和额外的监控。

集中:控制平面

在此设施的另一端是控制平面。控制平面充当应用程序中运行的sidecar的控制器,以及网格中的服务可视为单一事实来源的所有信息(如日志记录和版本更新)的中央存储库。

微服务网格(二):Istio 基础

使用Istio时,与控制平面交互的主要方式是通过Kubernetes。 安装Istio包和定义后,可以通过操纵系统状态的kubectl命令访问控制平面。 例如,使用kubectl将pod升级到新版本时,版本更新将通过更新本地控制平面变量开始。

最简单的方法是使用kubectl中的get-svc命令列出与给定库相关的服务。 要检查正在运行的内容,你可以运行

kubectl get svc -n istio-system

并查看在后台运行的Istio核心控制平面功能列表。你可能会认识到其中的一些,例如Citadel,即管理服务之间流量安全性的服务。

安装Istio

首先,让我们来看看Istio提供的开箱即用产品。我们将安装Istio控制平面来管理我们在 上一篇文章 中定义的基本HTTP API。该API服务是在Kubernetes上定义的,并且作为单个Kubernetes pod实现,其中运行了API。

要安装Istio,请按照Istio官方快速入门 指南 中的步骤操作。首先,从Istio 版本页面 下载最新版本。 Istio仍处于非常活跃的开发阶段,最新版本始终是最佳起点。要做到这一点,你只需下拉文件并确保它在你的路径中可用。

然后,将Istio定义添加到你的Kubernetes中,以便它们可以与kubectl命令行工具一起使用。只需使用kubectl apply将你在上面下拉的.yaml文件添加到安装目录中:

kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml

然后,你需要通过选择身份验证方法来激活Istio安装。 对于本演示,我将使用默认的相互HTTPS身份验证,这对于演示项目和开始新工作非常有用。 要将网格添加到现有项目,你需要更多地查看选项。 现在,你可以运行以下命令:

kubectl apply -f install/kubernetes/istio-demo-auth.yaml

有了这个,你就可以继续往前了。 你需要将istio设施添加到你创建的现有pod中,对于新pod,你需要添加istio作为依赖项。

部署helloworld App

我们使用helloworld示例应用程序,该应用程序已在我们的 上一篇博客 中讲过。这将创建一个部署,一个服务,一个网关和一个VirtualService。 更新配置文件以匹配以下内容:

helloworld.yaml

apiVersion: v1

kind: Service

metadata:

name: helloworld

spec:

type: ClusterIP

ports:

  - port: 80

  targetPort: 8080

selector:

   app: helloworld



---



apiVersion: apps/v1

kind: Deployment

metadata:

name: helloworld-v1

spec:

replicas: 1

selector:

  matchLabels:

     app: helloworld

template:

  metadata:

  labels:

     app: helloworld

     version: v1

  spec:

     containers:

      - name: helloworld-kubernetes

        image: haseebm/helloworld-kubernetes

        ports:

         - containerPort: 8080



---



apiVersion: networking.istio.io/v1alpha3

kind: Gateway

metadata:

name: helloworld-gateway

spec:

selector:

  istio: ingressgateway # use istio default controller

servers:

- port:

     number: 80

     name: http

     protocol: HTTP

hosts:

- "*"



---



apiVersion: networking.istio.io/v1alpha3

kind: VirtualService

metadata:

name: helloworld

spec:

hosts:

- "*"

gateways:

- helloworld-gateway

http:

  route:

   - destination:

       host: helloworld

       port:

          number: 80

手动注入Istio sidecar

Istio使用sidecar模式将istio sidecar容器与helloworld app容器放在同一个Pod中。

$ kubectl apply -f <(istioctl kube-inject -f helloworld.yaml)

service/helloworld created

deployment.extensions/helloworld-v1 created

gateway.networking.istio.io/helloworld-gateway created

virtualservice.networking.istio.io/helloworld created

确认Pod和服务正在运行

$ kubectl get pod,svc | grep helloworld

pod/helloworld-v1-1cbca3f8d5-achr2  2/2        Running

service/helloworld           ClusterIP       10.160.58.61

现在,查看helloworld的流量

$ curl a2******.ap-southeast-1.elb.amazonaws.com/api/hello

Hello world v1

下一步

Istio是开展云网格技术和智能微服务管理的一个很好的方式。 正如我们在过去的几篇文章中看到的那样,正确管理的微服务在技术优势和可扩展性方面有很多优势,但充分利用可用技术对于获得这些优势至关重要。

在接下来的几篇文章中,我们将介绍一些Istio和云网格的应用程序,以增强我们的示例体系结构的安全性和可管理性。 在下一篇文章中,我们将讨论如何在Istio中管理部署和版本更新,以无缝地推送代码更新,而不会出现部署中断。

原文链接: Microservices Mesh — Part II — Istio Basics (翻译:池剑锋)

原文  http://dockone.io/article/9081
正文到此结束
Loading...