使用Istio服务网格管理微服务

伊斯蒂奥小组今天发表的帖子显示了如何在Kubernetes中获得微服务的可见性,弹性,安全性和控制力。

服务是现代软件体系结构的核心。部署一系列模块化的,小型(微)服务而不是大型组件,使开发人员可以灵活地使用不同的语言,技术并在整个系统中发布节奏。从而提高了生产率和速度,尤其是对于大型团队而言。

但是,随着微服务的采用,由于较大系统中存在的服务数量众多,因此出现了新问题。对于每个服务,必须为一次整体解决一次问题,例如安全性,负载平衡,监视和速率限制。

Kubernetes和服务

Kubernetes通过以下方式支持微服务架构 服务 构造。它允许开发人员抽象出一组功能 豆荚,并通过定义明确的API将其公开给其他开发人员。它允许在此抽象级别上添加名称,并执行基本的L4负载平衡。但这并不能解决更高级别的问题,例如L7指标,流量分配,速率限制,电路中断等。

伊斯蒂奥上周在GlueCon 2017上宣布的,通过服务网格框架从根本上解决了这些问题。借助Istio,开发人员可以实现微服务的核心逻辑,并让框架负责其余的工作-流量管理,发现,服务身份和安全以及策略执行。更好的是,这也可以对现有的微服务进行,而无需重写或重新编译其任何部分。 伊斯蒂奥用途 使者 作为其运行时代理组件,并提供了 可扩展中介层 从而可以执行全球跨领域政策实施和遥测收集。

当前版本的Istio是针对Kubernetes用户的,并且打包成一种方式,您可以在几行中安装,并且可以立即获得Kubernetes中微服务的可见性,弹性,安全性和控制力。

在一系列博客文章中,我们将看一个由4个独立的微服务组成的简单应用程序。我们将从研究如何使用普通Kubernetes部署应用程序开始。然后,我们将完全相同的服务部署到支持Istio的群集中,而无需更改任何应用程序代码-并了解如何观察指标。

在后续文章中,我们将重点介绍更高级的功能,例如HTTP请求路由,策略,身份和安全管理。

示例应用程序:BookInfo

我们将使用一个名为BookInfo的简单应用程序,该应用程序显示商店中书籍的信息,评论和评分。该应用程序由四种以不同语言编写的微服务组成:

BookInfo-all(2).png由于这些微服务的容器映像都可以在Docker Hub中找到,因此我们需要在yaml配置中在Kubernetes中部署此应用程序。

值得注意的是,这些服务不依赖Kubernetes和Istio,但进行了有趣的案例研究。特别是,评论服务的众多服务,语言和版本使之成为一个有趣的服务网格示例。可以找到有关此示例的更多信息 这里.

在Kubernetes中运行Bookinfo应用程序

在本文中,我们将重点介绍该应用的v1版本:

BookInfo-v1(3).png

使用Kubernetes进行部署很简单,与部署任何其他服务没有什么不同。的服务和部署资源 产品页面 微服务看起来像这样:

apiVersion: v1

kind: 服务

metadata:

name: 产品页面

labels:

  app: 产品页面

spec:

type: NodePort

ports:

- port: 9080

  name: http

selector:

  app: 产品页面

---

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: 产品页面-v1

spec:

replicas: 1

template:

  metadata:

    labels:

      app: 产品页面

      track: stable

  spec:

    containers:

    - name: 产品页面

      image: istio/examples-bookinfo-productpage-v1

      imagePullPolicy: IfNotPresent

      ports:

      - containerPort: 9080

如果要运行应用程序,我们需要部署的其他两个服务是 细节评论-v1。我们不需要部署 等级 这是因为该服务的评论服务的v1未使用它。其余服务基本上遵循与以下模式相同的模式 产品页面。可以找到所有服务的yaml文件 这里.

要将服务作为普通的Kubernetes应用程序运行:

kubectl apply -f bookinfo-v1.yaml

要从集群外部访问应用程序,我们需要使用 产品页面 服务:

export BOOKINFO\_URL=$(kubectl get po -l app=productpage -o jsonpath={.items[0].status.hostIP}):$(kubectl get svc 产品页面 -o jsonpath={.spec.ports[0].nodePort})

现在,我们可以将浏览器指向http:// $ BOOKINFO_URL / 产品页面,然后看到:

使用Istio运行Bookinfo应用程序

现在,我们已经看到了该应用程序,我们将稍作调整部署使其与Istio一起使用。我们首先需要 安装Istio 在我们的集群中。要查看实际使用的所有度量标准和跟踪功能,我们还安装了可选的Prometheus,Grafana和Zipkin插件。现在,我们可以使用完全相同的yaml文件删除以前的应用程序,然后再次启动Bookinfo应用程序,这次与Istio相同:

kubectl delete -f bookinfo-v1.yaml

kubectl apply -f \<(istioctl kube-inject -f bookinfo-v1.yaml)

注意,这一次我们使用istioctl kube-inject命令在创建部署之前修改bookinfo-v1.yaml。如记录所示,它将特使边车注入Kubernetes吊舱 这里。因此,所有微服务都与Envoy边车打包在一起,该边车管理服务的入站和出站流量。

在Istio服务网格中,我们将不希望访问该应用程序 产品页面 直接,就像我们在普通的Kubernetes中所做的那样。相反,我们需要在请求路径中使用Envoy边车,以便我们可以使用Istio的管理功能(版本路由,断路器,策略等)来控制对 产品页面 ,就像我们可以针对内部请求一样。 伊斯蒂奥的Ingress控制器用于此目的。

要使用Istio Ingress控制器,我们需要创建一个Kubernetes 入口资源 对于该应用,使用kubernetes.io/ingress.class:“istio”进行了注释,如下所示:

cat \<\<EOF  ``` kubectl create -f -

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

name: bookinfo

annotations:

  kubernetes.io/ingress.class: "istio"

spec:

rules:

- http:

    paths:

    - path: /productpage

      backend:

        serviceName: 产品页面

        servicePort: 9080

    - path: /login

      backend:

        serviceName: 产品页面

        servicePort: 9080

    - path: /logout

      backend:

        serviceName: 产品页面

        servicePort: 9080

EOF

使用Istio和bookinfo应用程序的v1版本进行的最终部署如下所示:

BookInfo-v1-Istio(5).png

这次,我们将使用Istio Ingress控制器的NodePort地址访问该应用程序:

export BOOKINFO\_URL=$(kubectl get po -l istio=ingress -o jsonpath={.items[0].status.hostIP}):$(kubectl get svc istio-ingress -o jsonpath={.spec.ports[0].nodePort})

现在,我们可以在http:// $ BOOKINFO_URL / 产品页面上加载页面,并再次看到正在运行的应用程序-与之前没有Istio的用户部署相同。

但是,既然该应用程序正在Istio服务网格中运行,我们可以立即开始看到一些好处。

指标收集

开箱即用地从Istio中获得的第一件事就是Prometheus中的指标集合。这些度量标准由Envoy中的Istio筛选器生成,根据默认规则(可以自定义)收集,然后发送到Prometheus。可以在Grafana的Istio仪表板中可视化指标。请注意,尽管Prometheus是现成的默认指标后端,但Istio允许您插入其他指标,我们将在以后的博客文章中进行演示。

为了演示,我们将从运行以下命令开始,以在应用程序上生成一些负载:

wrk -t1 -c1 -d20s http://$BOOKINFO\_URL/productpage

我们获得Grafana的NodePort URL:

export GRAFANA\_URL=$(kubectl get po -l app=grafana -o jsonpath={.items[0].status.hostIP}):$(kubectl get svc grafana -o jsonpath={.spec.ports[0].nodePort})

现在,我们可以在http:// $ GRAFANA_URL / dashboard / db / istio-dashboard中打开浏览器,并检查每个Bookinfo服务的各种性能指标:

istio-dashboard-k8s-blog.png

分布式跟踪 从Istio得到的下一件事情是Zipkin的呼叫跟踪。我们获取其NodePort URL:

export ZIPKIN\_URL=$(kubectl get po -l app=zipkin -o jsonpath={.items[0].status.hostIP}):$(kubectl get svc zipkin -o jsonpath={.spec.ports[0].nodePort})

现在,我们可以将浏览器指向http:// $ ZIPKIN_URL /,以查看Bookinfo服务中的请求跟踪范围。

尽管Envoy代理立即将跟踪范围发送到Zipkin,但要充分利用其潜力,应用程序需要Zipkin感知并转发一些标头以将各个范围绑定在一起。看到 zipkin跟踪 有关详细信息。

整个船队的整体视图 伊斯蒂奥提供的指标不只是一种便利。通过始终生成统一的度量标准,它们提供了服务网格的一致视图。我们不必担心协调各种运行时代理发出的不同类型的指标,也不必添加任意代理来收集旧式非仪器应用的指标。我们也不再需要依靠开发过程来适当地检测应用程序以生成指标。服务网格可以看到所有流量,甚至可以进入和退出旧版“黑匣子”服务,并为其生成度量。 概要 上面的演示展示了如何在几个步骤中启动Istio支持的服务并观察其中的L7指标。在接下来的几周中,我们将继续演示更多Istio功能,例如策略管理和HTTP请求路由。 Google,IBM和Lyft联手根据我们为内部和企业客户构建和运营大型和复杂的微服务部署的经验创建了Istio。 伊斯蒂奥是整个行业范围内的社区活动。我们很高兴看到业界合作伙伴的热情以及他们带来的见解。随着下一步的发展,Istio面世,我们迫不及待地想看到更广泛的贡献者社区将带给它什么。如果您正在使用或考虑在Kubernetes上使用微服务架构,建议您尝试一下Istio,有关更多信息,请参见。 istio.io,让我们知道您的想法,或者更好, 加入 开发者社区,以帮助塑造其未来!

-代表Istio小组。 IBM的软件工程师Frank Budinsky,软件工程师Andra Cismaru和Google的产品经理Israel Shalom。