写点什么

如何使用 Rancher 2.0 在 Kubernetes 集群上部署 Istio

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

    阅读完需:约 22 分钟

如何使用Rancher 2.0在Kubernetes集群上部署Istio

Service mesh 旨在解决云原生应用之间服务拓扑的连接问题。如果你想要构建云原生应用,那么就需要 Service mesh。Istio 是 Service mesh 中的一个明星项目,在 Istio 文档中对其有非常全面的介绍:https://istio.io/docs/concepts/what-is-istio/。Istio 基于 Envoy Proxy,是一个极其有前景的 Service mesh 解决方案,有多家科技巨头对其进行联合开发。


目前,Istio 最适合 Kubernetes,但未来也会支持其他平台。因此,为了部署 Istio 并且展示其功能,首先需要一个 Kubernetes 集群。满足这一条件之后,使用 Rancher 2.0 将十分容易。

前期准备

为了能够顺利 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:05948

评论

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

丁岩:TiDB 8 年研发工程实践及人才观

编程猫

语音数据集在智能客服系统中的应用与挑战

来自四九城儿

手把手系列!让「引用」为 RAG 机器人回答增加可信度

Zilliz

chatbot Milvus zillizcloud llamaindex rag

KubeWharf的使用指南与未来趋势预测

YoLo

KubeWharf

企业数字化转型的核心是什么?

优秀

数字化转型 数字化业务转型

<火焰杯>测试开发职业竞赛开始报名啦!

测吧(北京)科技有限公司

测试

大厂 300+ 道前端面试题大全附答案(整理版)+前端常见算法面试题~~全面详细

程序员改bug

程序员 面试 前端 前端开发

“开放原子开源大赛”inBuilder低代码开发分赛道圆满落幕,听听他们怎么说!

inBuilder低代码平台

低代码 开源社区 #开源

低代码如何助力企业数字化转型?

高端章鱼哥

软件开发 低代码 数字化

现代 CPU 技术发展

快乐非自愿限量之名

技术 软件开发 cpu

为什么越来越多公司开始用低代码开发?

伤感汤姆布利柏

低代码

语音数据集在智能医疗中的应用与挑战

来自四九城儿

语音数据集在智能家居安全系统中的应用与挑战

来自四九城儿

续写“敢为”新篇章,TCL实业即将重磅亮相CES 2024

Geek_2d6073

KubeWharf的使用指南与学习总结

Geek-yan

长文预警,凭借前端面试题精选大全 ,成功混圈阿里字节腾讯

程序员改bug

程序员 前端 开发 IT 计算机

微服务与人工智能技术的融合

快乐非自愿限量之名

人工智能 架构 微服务

语音数据集在智能家居中的应用与挑战

来自四九城儿

Sui 生态排名第一的头部流动性协议 NAVI Protocol 活动进行中

股市老人

语音数据集在智能语音助手中的应用与挑战

来自四九城儿

数智金融技术峰会|数新网络受邀分享《金融信创湖仓一体数据平台架构实践》,敬请期待

数新网络官方账号

大数据 金融

详解Prompt框架

Bob Lin

人工智能 AI openai ChatGPT GPT-4

语音数据集在自动驾驶中的应用与挑战

来自四九城儿

天谋科技时序数据库 IoTDB 电力应用案例入选中国信通院「中国通信行业开源创新发展案例集」

Apache IoTDB

告别高昂存储,高效灵活管理数据

观测云

日志分析 数据备份

软件测试|新一届<火焰杯>测试开发职业竞赛开始报名啦

霍格沃兹测试开发学社

Github标星第一,堪称最强前端面试指南!

程序员改bug

前端 前端面试 前端开发程序员 前端程序员

运维人员新身份——背锅侠

尚思卓越

运维

年度总结&计划-做标杆服务协创未来

开源物联卡管理平台-设备管理

物联网 IoT eSIM安全 Java技术提升

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