微服务的出现解决了单体应用曾面对的传统挑战,但随着微服务规模的增大,管理服务间的安全、通信等问题也成了不小的挑战。
Service Mesh 是用于微服务应用程序的可配置基础结构层。 它使服务实例之间的通信变得灵活、可靠和快速。同时,Service Mesh 提供服务发现、负载均衡、加密、认证和授权、断路器模式支持以及其他功能。
而随着 Service Mesh 的大小和复杂性的增加,理解和管理 Service Mesh 变得愈发困难。而 Istio ,这个最初由 Google、IBM 和 Lyft 倾情奉献、后期更是得到更多来自科技巨头的肯定及支持的明星项目,就是旨在降低 Service Mesh 部署的复杂性,减轻开发团队的压力的。
Istio 是一个完全开源的服务网格,可以透明地分层到现有的分布式应用上。它也是一个平台,包含可以让它集成到任何日志记平台或遥测或策略系统的 API。Istio 的多样化功能集使用户能够成功、高效地运行分布式微服务架构,并提供安全、连接和监控微服务的统一解决方案。
目前,Istio 最适合 Kubernetes(官方表示未来会加入对其他平台的支持)。在本文中,我们将展示如何借助开源的 Kubernetes 平台 Rancher,来简单快速地完成在 Kubernetes 集群上部署 Istio 的工作,并最终展示部署在 Kubernetes 集群之上的 Istio 的强大功能。
前期准备
为了能够顺利 demo,你需要做如下准备:
一个 Google Cloud 账号,免费的即可
一个 Ubuntu 16.04 实例(这将是 Rancher 实例的运行环境)
一个部署于 Google Cloud Platform 并且使用 GKE 服务的 Kubernetes 集群。本次 demo 使用的是 1.10.5-gke.2 版本
Istio 0.8.0(这是本文成稿时使用的版本,现在 Istio 1.0 已发布)
一般情况下,本教程中的步骤对于更新的版本也适用。
启动 Rancher 2.0
首先,启动一个 Rancher 2.0 实例。关于如何启动 Rancher 2.0,可以参考 Rancher 官网上的入门教程,非常简洁直观(https://rancher.com/quick-start/)。必要的步骤也会在下文中列出。
本文示例将使用 Google Cloud Platform,所以我们首先启动一个 Ubuntu 实例并且通过 Console 或者 CLI(https://cloud.google.com/compute/docs/instances/create-start-instance)。使用 HTTP 和 HTTPs 协议与其通信。实现上述目的的命令如下:
请确保 Rancher 实例至少有 1 vCPU 和大约 4GB 的 RAM 可用。
接着,通过 ssh 登录到 Ubuntu 实例并且安装 Docker(https://docs.docker.com/install/linux/docker-ce/ubuntu/)。Docker 安装完成之后,即可启动 Rancher 验证其是否正在运行。
获得 Ubuntu 实例的公共 IP 地址,并用你的浏览器访问它。
接着页面会重新跳转到 Rancher 的 HTTPs 协议页面上,并且你将看到浏览器的警告。因为 Rancher 使用的是自签名证书。不需要理会这些警告,因为你已经启动了实例(千万不要在不受信任的网站上进行这项操作),接下来开始设置管理员密码和服务器 URL 来启动 Rancher 2.0。下面就可以开始启动 Kubernetes 集群了。
启动一个 Kubernetes 集群
首先,你需要一个附加以下角色的 Google 云服务账号:Compute Viewer,Kubernetes Engine Admin, Service Account User, Project Viewer。接着,你需要生成服务账户密钥,具体步骤请参考:https://cloud.google.com/iam/docs/creating-managing-service-account-keys
现在你可以用你的服务账户密钥来使用 Rancher 2.0 启动一个 Kubernetes 集群(使用默认的 Compute Engine 服务帐户是安全的):
请留意<SA-NAME>@developer.gserviceaccount.com 值,你稍后还会用到它。
现在,你已经做好启动集群的准备工作了。打开 Rancher 的面板,然后点击【添加集群/Add Cluster】。你需要执行以下操作:
在选择 Kubernetes 托管服务提供商时,选择 GCE;
为你的集群起一个名字,比如 rancher-demo;
将服务密钥详细信息从上述步骤中生成的 key.json 文件导出或复制粘贴到 Service Account 字段中。
接着去【配置节点/Configure Nodes】选项并按如下选择:
Kubernetes 版本的选择,你可以选择最新版本,不过本测试是在 1.10.5-gke.2 版本上进行的;
区域的选择,选择离你最近的区域;
机器类型的选择,至少需要 n1-standard-1;
至于节点数,对于 Istio Demo 来说,至少需要 4 个节点。
当上述内容设置完成之后,你的设置页面如下图所示:
毫不犹豫地点击【创建/Create】吧
几分钟之后,你可以在 Rancher 的面板上看到集群处于活跃状态。还记得上文提到的<SA-NAME>@developer.gserviceaccount.com 值吗?现在它要派上用场了。你需要用它来授予当前用户群集管理员权限(需要管理员权限才能为 Istio 创建必要的 RBAC 规则)。为此,你需要点击 Rancher 面板上 rancher-demo 的集群名字,然后进入 rancher-demo 的集群面板。
现在启动 kubectl,这将打开这个特定群集的 kubectl 命令行。你还可以导出 Kubeconfig 文件,与本地安装的 kubectl 一起使用。基于本次实例的目的,使用 Rancher 提供的命令行就可以了。你打开了命令行之后,运行下列命令:
在 Rancher 上部署 Istio
Istio 有一个 Helm 包,Rancher 可以用它安装 Istio。想要获得官方的 Istio Helm 包,需要将 Istio 的库添加到 Rancher 的应用目录里。为此,首先要访问 Rancher Global View,进入目录选项,并选择【添加目录】,名字填写 istio-github,目录 URL 为https://github.com/istio/istio.git(Rancher 可以处理 git clone 处理的任何事情),在 Branch 的部分,你可以写 branch 名字,并将其设置为 master。设置完成后,应该如下截图所示:
点击【创建/Create】
在这一步,你将开始使用 Rancher Catalog 部署 Istio。首先,访问 rancher-demo 集群的默认项目,并且选择目录应用。当你点击【启动/Launch】之后,你将看到许多默认可用的应用。由于此 demo 是关于 Istio 的,在【所有目录/All Catalogs】中选择 istio-github 目录,也就是你刚刚自行创建的那个。这将为您提供两个选项:istio 和 istio-remote。选择 istio 并点击【查看详情/View Details】,你将看到部署 Istio 的选项,按如下选择:
设置名字为 istio-demo;
让模板版本保持为 0.8.0;
默认的 istio 的命名空间是 istio-system,因此这里就将命名空间设置为 istio-system;
在默认情况下,Istio 不会加密组件之间的访问,但加密功能挺重要的,因此我们需要把加密这一功能加上,;
Istio 的 helm chart 默认不添加 Grafana,我们也应该把它加上。
点击 Add Answer,将 global.controlPlaneSecurityEnabled 和 grafana.enabled 的值设置为 true。即可添加上述功能。
完成上述操作之后,界面应该如下图所示:
点击【启动/Launch】
如果你现在看到工作负载的标签,那么你应该能看到 Istio 的所有组件正在你的集群里运行,同时请确保所有的工作负载都是绿色的。此外,还需要检查负载均衡标签,istio-ingress 和 istio-ingressgateway 都应该处于活跃状态。
如果 istio-ingressgateway 处于待定(Pending)状态,那么你需要再次申请 istio-ingressgateway 服务。具体步骤是:点击 Import Yaml;对于 Import Mode,选择【集群:将任何资源直接导入此集群】Cluster: Direct import of any resources into this cluster;将 istio-demo-ingressgateway.yaml 服务复制/粘贴到 Import Yaml 编辑器并点击导入:
这一步骤将解决 istio-ingressgateway 待定状态的问题。
现在,你需要在 Rancher 的面板上检查 Istio 所有的工作负载、负载均衡以及服务发现均处于良好状态。
最后还有一样东西需要添加:在你的默认命名空间里添加一个 istio-injected 标签,Istio sidecar 容器会自动注入你的节点,运行下方的 kubectl 命令(如上文所述,你可以从 Rancher 内部启动 kubectl)。
这一标签将使得 Istio-Sidecar-Injector 自动将 Envoy 容器注入您的应用程序节点。
部署 Bookinfo 示例应用
现在,你可以开始部署一个测试应用并且测试 Istio 的强大功能。首先,部署 Bookinfo 示例应用。这个应用有趣的部分在于它有三个版本的 reviews 程序同时运行。我们可-以在这三个版本的程序中体验到 Istio 的一些功能。接着,访问 rancher-demo 的默认项目中的工作负载来部署 Bookinfo app,具体的操作是:
点击 Import Yaml;下载 bookinfo.yaml(https://info.rancher.com/hubfs/bookinfo.yaml)到本地;
当你进入 Import Yaml 菜单之后,通过从文件读取,将其上传至 Rancher;
对于 Import Mode,选择【集群:将任何资源直接导入此集群】Cluster: Direct import of any resources into this cluster;
点击【导入/Import】。
这应该为您的 rancher-demo Default 项目增加 6 个工作负载。如下图:
现在,通过 Istio 暴露 Bookinfo app,你需要应用此 bookinfo-gateway.yaml(https://info.rancher.com/hubfs/bookinfo-gateway.yaml),操作方式与 bookinfo.yaml 相同。此时,你可以用浏览器访问 bookinfo app。你有两种方式可以获取 istio-ingressgateway 负载均衡器的外部 IP 地址:
第一,从 Rancher 中获取。访问负载均衡,从右手边的菜单栏选择 View in API。它将打开一个新的浏览器页面,在那搜索 publicEndpoints -> addresses,你就可以看到公共 IP 地址了。
第二,通过 kubectl 获取:
用你的浏览器访问: http://$
{INGRESS_HOST}/productpage,然后你应该看到 Bookinfo app。多次刷新页面时,你应该看到 Book Reviews 部分有三个不同版本:第一个版本没有星星;第二个版本有黑星星;第三个版本有红星星。
使用 Istio,您可以限制您的应用仅路由到应用的第一个版本。具体操作为:导入 route-rule-all-v1.yaml( https://info.rancher.com/hubfs/route-rule-all-v1.yaml)到 Rancher,几秒之后再刷新页面,你将不会在 reviews 上看到任何星星。
除此之外,你也可以仅将流量路由到一组用户。当你导入 route-rule-reviews-test-v2.yaml 到 Rancher 之后,使用 jason 这个用户名(无需密码)登录 Bookinfo app,你应该只能看到版本 2 的 reviews(即有黑星星的版本)。但登出之后,你仅能看到版本 1reviews 的 app。
至此,你已经体会了 Istio 的强大功能。当然,这并非全部,Istio 还有很多其他功能。创建此设置后,您可以完成 Istio 文档中的任务。
Istio 的遥感
现在是时候深入了解 Istio 另一个更有用的功能 :默认情况下提供指标。
让我们从 Grafana 开始。当我们部署 Istio 时,值设置为 true 的 grafana.enabled 创建了一个 grafana 实例,并配置为收集 Istio 的指标以几个面板中显示它们。默认情况下,Grafana 的服务不会公开显示,因此想要查看指标,首先需要将 Grafana 的服务暴露给公共 IP 地址。当然,还有另一个选项也可以暴露服务:NodePort(https://kubernetes.io/docs/concepts/services-networking/service/#nodeport),但是这要求你在 Google Cloud Platform 防火墙的所有节点上开放 Nodeport,这不止有一项任务,因此通过公共 IP 地址暴露服务更为简单。
为此,在 rancher-demo 的默认项目中访问工作负载并选择【服务发现】标签。当所有在集群上的工作都完成之后,应该有 5 项服务在默认的命名空间内,有 12 项服务在 istio-system 命名空间内,并且所有这些服务都处于活跃状态。接着,选择 grafana 服务,并且从右边的菜单栏内选择 View/Edit YAML。
找到包含 type: ClusterIP 的那行,将其改为 type: LoadBalancer,并点击【保存/Save】。然后它应该开始在 Google Cloud Platform 中配置负载均衡器,并在其默认端口 3000 上暴露 Grafana。如果想要获取 Grafana 的公共 IP 地址的话,只需重复 bookinfo 示例中获取 IP 地址的步骤即可,即在 API 中查看 grafana 服务,你可以在其中找到 IP 地址,或通过 kubectl 获取它:
用你的浏览器访问:http://$
{GRAFANA_HOST}:3000/,选择其中一个面板,比如 Istio Service。通过此前应用的配置,我们限制了流量,仅显示版本 1 的 reveiws 应用。从服务的下拉菜单中选择 reviews.default.svc.cluster.local,就可以从图表中查看。现在使用以下命令从 Rancher 的 kubectl 生成一些流量:
需要等待约 5 分钟,为 Grafana 生成的流量将会显示在如下面板上:
如果你滚动面板,在 SERVICE WORKLOADS 下你将看到 Incoming Requests by Destination And Response Code 的图表,它要求 Reviews 应用程序只在 v1 端点结束。如果你使用以下命令,生成对版本 2 的应用的请求(请记得用户 jason 可以访问版本 2 的 reviews 应用):
你应该也可以看到显示在版本 2 的应用上的请求:
用同样的方式,也可能可以暴露并且看到 Istio 其他默认的指标,比如 Prometheus, Tracing 和 ServiceGraph。
总结与思考
正如你所看到的,Istio 是一个具有强大功能并且十分实用的 service mesh 平台。在未来,它一定会成为云原生生态中一个核心工具。但目前, Istio 仍暂不建议进入生产环境。引用 Kelsey Hightower 的一句话:“不要只消耗它,将它部署到生产环境中。你将成为新闻焦点”。无论如何,请你坚信,在不久的将来,Istio 一定会被部署到生产环境中。
至于 Rancher 2.0,它对于查看 Kubernetes 集群状态、所有的工作负载、服务以及节点都十分实用。它通过 WebUI 提供了一种简易的方式来管理集群并通过 Helm Charts 部署应用,即便对于不太熟悉 Kubernetes 的人来说,Rancher 也十分容易上手。使用 Rancher 2.0,你会拥有管理 Kubernetes 集群所需的一切,并对其状态有一个很好的概览。我相信,Rancher 的小伙伴们之后会继续添加越来越多实用的功能来不断完善 Rancher。
评论