首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在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-cloudgcloud 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-servergcloud 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服务帐户是安全的):

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

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

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

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

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

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

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

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

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

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

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

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

在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】

设置名字为istio-demo;

让模板版本保持为0.8.0;

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

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

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,具体的操作是:

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

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

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

点击【导入/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://$/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

export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')for i in ; do curl -o /dev/null -s -w "%\n" http://$/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 ; do curl -o /dev/null -s -w "%\n" --cookie "user=jason" http://$/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。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180911B1FK5T00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券