阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

如何在 Kubernetes 集群上部署 Istio

  • 2020-04-15
  • 本文字数:7024 字

    阅读完需:约 23 分钟

如何在Kubernetes集群上部署Istio

微服务的出现解决了单体应用曾面对的传统挑战,但随着微服务规模的增大,管理服务间的安全、通信等问题也成了不小的挑战。


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 协议与其通信。实现上述目的的命令如下:


gcloud compute --project=rancher-20 instances create rancher-20 \--zone=europe-west2-a --machine-type=n1-standard-1 \--tags=http-server,https-server --image=ubuntu-1604-xenial-v20180627 \--image-project=ubuntu-os-cloud
gcloud compute --project=rancher-20 firewall-rules create default-allow-http \--direction=INGRESS --priority=1000 --network=default --action=ALLOW \--rules=tcp:80 --source-ranges=0.0.0.0/0 --target-tags=http-server
gcloud compute --project=rancher-20 firewall-rules create default-allow-https \--direction=INGRESS --priority=1000 --network=default --action=ALLOW \--rules=tcp:443 --source-ranges=0.0.0.0/0 --target-tags=https-server
复制代码


请确保 Rancher 实例至少有 1 vCPU 和大约 4GB 的 RAM 可用。


接着,通过 ssh 登录到 Ubuntu 实例并且安装 Docker(https://docs.docker.com/install/linux/docker-ce/ubuntu/)。Docker 安装完成之后,即可启动 Rancher 验证其是否正在运行。


ubuntu@rancher-20:~$ sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancherUnable to find image 'rancher/rancher:latest' locallylatest: Pulling from rancher/rancher6b98dfc16071: Pull complete4001a1209541: Pull complete6319fc68c576: Pull completeb24603670dc3: Pull complete97f170c87c6f: Pull completec5880aba2145: Pull completede3fa5ee4e0d: Pull completec973e0300d3b: Pull completed0f63a28838b: Pull completeb5f0c036e778: Pull completeDigest: sha256:3f042503cda9c9de63f9851748810012de01de380d0eca5f1f296d9b63ba7cd5Status: Downloaded newer image for rancher/rancher:latest2f496a88b82abaf28e653567d8754b3b24a2215420967ed9b817333ef6d6c52fubuntu@rancher-20:~$ sudo docker psCONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                      NAMES2f496a88b82a        rancher/rancher     "rancher --http-list…"   About a minute ago   Up 59 seconds       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   elegant_volhard
复制代码


获得 Ubuntu 实例的公共 IP 地址,并用你的浏览器访问它。


$ gcloud compute instances describe rancher-20 --project=rancher-20 --format="value(networkInterfaces[0].accessConfigs[0].natIP)"35.189.72.39
复制代码


接着页面会重新跳转到 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 服务帐户是安全的):


gcloud iam service-accounts keys create ./key.json \    --iam-account <SA-NAME>@developer.gserviceaccount.com
复制代码


请留意<SA-NAME>@developer.gserviceaccount.com 值,你稍后还会用到它。


现在,你已经做好启动集群的准备工作了。打开 Rancher 的面板,然后点击【添加集群/Add Cluster】。你需要执行以下操作:


  1. 在选择 Kubernetes 托管服务提供商时,选择 GCE;

  2. 为你的集群起一个名字,比如 rancher-demo;

  3. 将服务密钥详细信息从上述步骤中生成的 key.json 文件导出或复制粘贴到 Service Account 字段中。


接着去【配置节点/Configure Nodes】选项并按如下选择:


  1. Kubernetes 版本的选择,你可以选择最新版本,不过本测试是在 1.10.5-gke.2 版本上进行的;

  2. 区域的选择,选择离你最近的区域;

  3. 机器类型的选择,至少需要 n1-standard-1;

  4. 至于节点数,对于 Istio Demo 来说,至少需要 4 个节点。


当上述内容设置完成之后,你的设置页面如下图所示:



毫不犹豫地点击【创建/Create】吧


几分钟之后,你可以在 Rancher 的面板上看到集群处于活跃状态。还记得上文提到的<SA-NAME>@developer.gserviceaccount.com 值吗?现在它要派上用场了。你需要用它来授予当前用户群集管理员权限(需要管理员权限才能为 Istio 创建必要的 RBAC 规则)。为此,你需要点击 Rancher 面板上 rancher-demo 的集群名字,然后进入 rancher-demo 的集群面板。


现在启动 kubectl,这将打开这个特定群集的 kubectl 命令行。你还可以导出 Kubeconfig 文件,与本地安装的 kubectl 一起使用。基于本次实例的目的,使用 Rancher 提供的命令行就可以了。你打开了命令行之后,运行下列命令:


> kubectl create clusterrolebinding cluster-admin-binding \    --clusterrole=cluster-admin \    --user=<SA-NAME>@developer.gserviceaccount.com
clusterrolebinding "cluster-admin-binding" created
复制代码

在 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 的选项,按如下选择:


  1. 设置名字为 istio-demo;

  2. 让模板版本保持为 0.8.0;

  3. 默认的 istio 的命名空间是 istio-system,因此这里就将命名空间设置为 istio-system;

  4. 在默认情况下,Istio 不会加密组件之间的访问,但加密功能挺重要的,因此我们需要把加密这一功能加上,;

  5. 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)。


> kubectl label namespace default istio-injection=enablednamespace "default" labeled> kubectl get namespace -L istio-injectionNAME            STATUS    AGE       ISTIO-INJECTIONcattle-system   Active    1hdefault         Active    1h        enabledistio-system    Active    37mkube-public     Active    1hkube-system     Active    1h>
复制代码


这一标签将使得 Istio-Sidecar-Injector 自动将 Envoy 容器注入您的应用程序节点。

部署 Bookinfo 示例应用

现在,你可以开始部署一个测试应用并且测试 Istio 的强大功能。首先,部署 Bookinfo 示例应用。这个应用有趣的部分在于它有三个版本的 reviews 程序同时运行。我们可-以在这三个版本的程序中体验到 Istio 的一些功能。接着,访问 rancher-demo 的默认项目中的工作负载来部署 Bookinfo app,具体的操作是:


  1. 点击 Import Yaml;下载 bookinfo.yaml(https://info.rancher.com/hubfs/bookinfo.yaml)到本地;

  2. 当你进入 Import Yaml 菜单之后,通过从文件读取,将其上传至 Rancher;

  3. 对于 Import Mode,选择【集群:将任何资源直接导入此集群】Cluster: Direct import of any resources into this cluster;

  4. 点击【导入/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 获取:


> export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')> echo $INGRESS_HOST
复制代码


用你的浏览器访问: 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 获取它:


export GRAFANA_HOST=$(kubectl -n istio-system get service grafana -o jsonpath='{.status.loadBalancer.ingress[0].ip}')echo $GRAFANA_HOST
复制代码


用你的浏览器访问:http://${GRAFANA_HOST}:3000/,选择其中一个面板,比如 Istio Service。通过此前应用的配置,我们限制了流量,仅显示版本 1 的 reveiws 应用。从服务的下拉菜单中选择 reviews.default.svc.cluster.local,就可以从图表中查看。现在使用以下命令从 Rancher 的 kubectl 生成一些流量:


export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')for i in {1..1000}; do curl -o /dev/null -s -w "%{http_code}\n" http://${INGRESS_HOST}/productpage; sleep 0.2; done
复制代码


需要等待约 5 分钟,为 Grafana 生成的流量将会显示在如下面板上:



如果你滚动面板,在 SERVICE WORKLOADS 下你将看到 Incoming Requests by Destination And Response Code 的图表,它要求 Reviews 应用程序只在 v1 端点结束。如果你使用以下命令,生成对版本 2 的应用的请求(请记得用户 jason 可以访问版本 2 的 reviews 应用):


export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')for i in {1..1000}; do curl -o /dev/null -s -w "%{http_code}\n" --cookie "user=jason" http://${INGRESS_HOST}/productpage; sleep 0.2; done
复制代码


你应该也可以看到显示在版本 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。


2020-04-15 23:05782

评论

发布
暂无评论
发现更多内容

IT小白也能轻松get日志服务---使用Nginx模式采集日志

云端explorer

nginx 运维 日志服务

前端之路React学习笔记

恒山其若陋兮

7月月更

一文了解 Nebula Graph 上的 Spark 项目

NebulaGraph

spark 图数据库 知识图谱 NebulaGraph

LabView---信号发生器

一碗黄豆酱

2022年中国娱乐直播市场年度综合分析

易观分析

直播市场

LabView实验——温度检测系统(实验学习版)

一碗黄豆酱

服务器运维需要24小时在线吗?需要周末加班吗?

行云管家

服务器 IT运维

不是我说,不掌握这些坑,你敢用BigDecimal吗?

程序员小毕

Java 程序员 面试 后端 BigDecimal

Ampere Altra Max 提供可持续的高分辨率 H.265 编码

亚马逊云科技 (Amazon Web Services)

编码 Tech 专栏

AIOps 还是 APM,企业用户应如何作出选择?

云智慧AIOps社区

APM 智能运维AIOps

直播预告 | 多云时代如何建设企业云管理平台?

BoCloud博云

cmp 云管理平台 云管理

京东云联合Forrester咨询发布混合云报告 云原生成为驱动产业发展新引擎

京东科技开发者

云原生 数字化 科技 混合云 多云

React原理学习路线

郭明

ABAP-EXCEL上传下载

桥下本有油菜花

abap ABAPexcel

消息中间件

Damon

7月月更

低代码软件开发平台怎么选?

优秀

低代码开发 低代码平台

数据仓库开发 SQL 使用技巧总结

C++后台开发

MySQL 数据库 sql 中间件 后端开发

云图说丨数字资产链:您的数字资产产权保护神

华为云开发者联盟

区块链 云计算 开发 开发工具

如何在Docker部署安装ETL调度运维工具TASKCTL

TASKCTL

DevOps 大数据运维 Kafka ETL TASKCTL Docker 镜像

小李:“有没有特别简单的Python解密rsa的案例?”“还真有”

梦想橡皮擦

Python 爬虫 7月月更

LabView中禁用模块(属性节点)

一碗黄豆酱

医院怎么实现高效低成本运维?有什么软件可以满足吗?

行云管家

运维 IT运维 医院运维

李宏毅《机器学习》丨3. Gradient Descent(梯度下降)

AXYZdong

机器学习 7月月更

可以 DIY 装修的商城系统,你也能拥有!

CRMEB

汇聚开发者智慧 夯实数据库产业根基

科技热闻

如何选择合适的体育场馆用LED显示屏

Dylan

LED显示屏 户外LED显示屏 led显示屏厂家

Python图像处理丨三种实现图像形态学转化运算模式

华为云开发者联盟

Python 人工智能 AI 图像形态学

如何做好安全开发?

华为云开发者联盟

云计算 开源 安全 开发

短视频直播系统源码

开源直播系统源码

短视频源码 直播系统源码 短视频直播系统

发现增长新动力,企业到底需要一朵什么样的云?

ToB行业头条

实操演示:如何用 ONES 制定 Scrum 迭代计划?

万事ONES

如何在Kubernetes集群上部署Istio_文化 & 方法_Rancher_InfoQ精选文章