写点什么

如何使用 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:051034

评论

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

Go语言,深入了解 RWMutex 实现原理

微客鸟窝

Go 语言 11月日更

linux几个没用但是有趣的命令

入门小站

Linux

【Flutter 专题】14 图解 ListView 不同样式 item 及 Widget 显隐性

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 11月日更

如何成为一名合格的CRUD工程师?

博文视点Broadview

构筑“数据连接器”,腾讯云大数据推出“开源开放”战略

腾讯云大数据

大数据

Prometheus HTTP API 查询(二) 表达式查询

耳东@Erdong

Prometheus PromQL HTTP API 11月日更

Flink 实践教程-入门(4):读取 MySQL 数据写入到 ES

腾讯云大数据

流计算 Oceanus

爬虫120例之第17例,用Python面向对象的思路,采集各种精彩句子

梦想橡皮擦

11月日更

Android C++系列:通过 JNI 访问 Java 字段和方法调用

轻口味

android 11月日更

08 K8S之资源对象介绍

穿过生命散发芬芳

k8s 11月日更

如何解决 fs.renameSync() 跨区移动文件的问题

liuzhen007

11月日更

算法入门-快速排序

ES_her0

11月日更

树莓派

IT蜗壳-Tango

11月日更

Flink 实践教程-入门(5):写入 ClickHouse

腾讯云大数据

流计算 Oceanus

在IntelliJ IDEA中,开发一个摸鱼看书插件

小傅哥

Java 小傅哥 IDEA idea插件

dart系列之:dart语言中的函数

程序那些事

flutter 后端 dart 程序那些事 11月日更

aardio 开发桌面应用,这几点必须要掌握!

星安果

Python aardio

移动端自动化 AutoJS 快速入门指南

星安果

自动化 Autojs

设计模式【3.3】-- CGLIB动态代理源码解读

秦怀杂货店

Java 设计模式

死锁是如何工作的

卢卡多多

死锁 11月日更

【死磕NIO】— 阻塞、非阻塞、同步、异步,傻傻分不清楚

chenssy

11月日更 死磕 Java 死磕 NIO

[ CloudWeGo 微服务实践 - 07 ] 阶段总结

baiyutang

golang 微服务 11月日更

在线2-36进制转文本工具

入门小站

工具

《Kubernetes in action 读书笔记》:容器技术的发展

后台技术汇

Kubernetes 11月日更

正向代理和反向代理

liuzhen007

11月日更

远程代码执行漏洞分析

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

模块9 毕设

SAKIN

架构训练营毕业总结

SAKIN

Windoes下安装配置flutter环境

坚果

flutter windows 安装 11月日更

【LeetCode】键盘行Java题解

Albert

算法 LeetCode 11月日更

科技热点周刊|马斯克卖掉特斯拉 10% 股票;Facebook 停用面部识别系统;微软拥抱 Metaverse;雅虎退出中国

青云技术社区

云计算 facebook

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