写点什么

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

2020 年 4 月 15 日

如何使用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 年 4 月 15 日 23:05134

评论

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

RabbitMQ 的监控(附 Python 监控源码)

AlwaysBeta

Python RabbitMQ 消息队列 消息堆积处理

架构师训练营 - 作业 7

进击的炮灰

架构师训练营第七周总结

Bruce Xiong

w7-分布式系统中性能的影响因素

麻辣

Python Elasticsearch DSL 查询、过滤、聚合操作实例

AlwaysBeta

Python elasticsearch elastic

第07周 优化系统性能-01 命题作业

Jaye

第七周作业

Geek_a327d3

第七周总结

Geek_a327d3

学习总结 - 架构师训练营 - 第七周

走过路过飞过

【架构师训练营 - week7 -1】总结

早睡早起

第七周总结

上山砍柴

架构师训练营 No.7 周总结

连增申

性能测试并发压力变大,系统如何变化

李朋

【架构师训练营 - week7 -1】作业

早睡早起

操作系统、性能优化

GalaxyCreater

性能优化

架构师培训 -07 总结 性能测试与性能优化

刘敏

Week 07 总结

鱼_XueTr

性能压测

走过路过飞过

第7周 性能优化:性能优化是架构师展现自己技术全面性的时刻

陆不得

关于性能压测

俊俊哥

性能测试

架构师训练营 week7 - 学习总结

devfan

使用 Redis 有序集合实现 IP 归属地查询

AlwaysBeta

Python redis 缓存

第07周 优化系统性能-01 学习总结

Jaye

第七周学习总结

潜默闻雨

架构师训练营 No.7 周作业

连增申

架构师训练营第七章作业

吴吴

Mac 环境下 RabbitMQ 的安装

AlwaysBeta

Mac RabbitMQ 消息队列

Python 实现 RabbitMQ 的六种工作模式(附 Python 代码)

AlwaysBeta

Python RabbitMQ 消息队列

ARTS打卡Week 08

teoking

ios LeetCode

架构师训练营 week7

devfan

第7周

Geek_2b3614

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

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