HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

如何在 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:05951

评论

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

Java内存问题 及 LeakCanary 原理分析,mybatis架构设计层次

Java 程序员 后端

Java几种常用JSON库性能比较,java接口开发面试

Java 程序员 后端

Java基础27~使用JDBC+连接池,这篇文章可以满足你80%日常工作

Java 程序员 后端

Java如何支持函数式编程?,大专生面试阿里P7居然过了

Java 程序员 后端

Java学习笔记——正则表达式,平安金服java面试题

Java 程序员 后端

java实现简单二叉树,深入分布式缓存从原理到实践技术分享

Java 程序员 后端

Java实现经典算法,阿里java技术专家面试

Java 程序员 后端

Java之StringUtils的常用方法,java整体项目架构图

Java 程序员 后端

JAVA代码审计之Shiro反序列化漏洞分析,浦发银行Java开发笔试题

Java 程序员 后端

Java反射的深入浅出,mongodb优化面试

Java 程序员 后端

Java基础25~XML和JSON解析,springbootoauth2教程

Java 程序员 后端

Java多态大乱炖,mysql基础教程视频

Java 程序员 后端

自由职业者靠什么赚钱?

石云升

职场经验 10月月更

Java之Spring基础与IOC,java实用教程第五版答案第四章

Java 程序员 后端

Java基础 - 多态,抽象类,接口,linux源码学习

Java 程序员 后端

Java基础09 面向对象~类和对象,阿里面试官必问

Java 程序员 后端

Java基础面试题——IO流,springboot实战项目百度云

Java 程序员 后端

架构实战营模块二学习总结

吴霏

「架构实战营」

架构实战营毕业总结

VE

架构实战课

Java基础面试题整理,java数组排序sort原理

Java 程序员 后端

Java学习路线和方法推荐,拿下我人生中第7个Offer

Java 程序员 后端

Java实现图的存储和创建,linux编程基础课后答案第二章

Java 程序员 后端

Java基础总结三(泛型、异常,阿里java面试题及答案

Java 程序员 后端

Java多线程 高频面试题,java架构师工作内容

Java 程序员 后端

Java实现RPC(源码),java常见面试题

Java 程序员 后端

Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day14

Java 程序员 后端

Java中高级核心知识全面解析——常用框架(Spring常用注解

Java 程序员 后端

第二模块作业

River Tree

架构实战营

架构实战模块二作业

吴霏

「架构实战营」

Java初学01:学习路线,java基础入门清华大学出版社

Java 程序员 后端

Java基础 - 单例(饿汉、懒汉),Runtime类,java教程推荐学客巴巴

Java 程序员 后端

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