开箱即用:在Kubernetes安装Istio使微服务变得更容易

本文记录了作者在Azure Kubernetes集群上安装istio的过程,以及对应用示例的操作。


除非你是与世隔绝,否则你可能已经知道微服务架构模式在过去几年中迅速普及。这是由两方面来推动的,一方面是云部署服务越来越便利,另一方面是小团队首先期望专注于构建简单好用的子服务,然后才是构建应用程序。

总的来说,这样很好,但也导致了其他一些问题:

1、增加了API层面的安全问题。使用较小的服务,以及服务之间的许多依赖关系,必须有更多的端点以确保安全。复合(Compounding)是一种 “不信任”(“trust nothing”)安全模型的举措,包括内部网络,因此devops团队需要建立一种机制来验证正在与我交流的微服务是真实的。

2、需要监控更多的服务。监控是必须的,但是微服务架构模型又需要添加另一层监控。例如,当发现一个性能问题时,您现在不能判断是服务应用还是后端存储的问题。也可能,是由它所使用的任何依赖服务引起的。对服务延迟进行简单的监控是不够的,您还需要对服务使用的每个依赖关系进行度量。

3、流量管理问题。在多个团队不断发展的服务之间的互连的数量,意味着我们需要以多种方式管理它们之间的流量:在应用程序的不同版本之间切换流量、速率限制、回路阻断等,以防止依赖服务的级联故障。

Istio是CNCF赞助的一个项目,旨在解决这些问题。这篇博客文章将帮助您安装Istio,并演示如何对示例应用程序进行操作。

我将使用Azure做演示,但在本教程中所需的全部内容是RBAC启用的Kubernetes 1.9集群和MutatingAdmissionWebhook Admission Controller插件。如果您使用其他的云创建您的群集,可以跳过下一节。

Azure Kubernetes集群创建记录

对于ACS引擎(ACS Engine)的当前缺省值,必须重写默认的包含MutatingAdmissionWebhook的Admission Controllers插件,以便以后可以自动为服务注入sidecar容器。您可以在ACS引擎cluster.json中通过指定实现(参考Kubernetes1.9项目的部署建议):

{

"apiVersion": "vlabs",

"properties": {

    "orchestratorProfile": {

        "orchestratorType": "Kubernetes",

        "orchestratorRelease": "1.9",

        "kubernetesConfig": {

            "apiServerConfig": {

                "--admission-control":        "NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"

            }

        }

    },

    ....

}

在Kubernetes集群上安装Istio

假设已有一个配置了RBAC的Kubernetes1.9集群。首先,获取最新版本的Istio,并添加其CLI工具istioctl到安装目录,可以参照网站上 安装步骤 的前四个步骤执行。

在写这篇文章时,helm chart还不能正常工作,所以不要走这条路。而是将项目解压后,用kubectl apply安装到项目的根目录:

$ kubectl apply -f install/kubernetes/istio-auth.yaml

你能看到istio的核心组件启动起来,最后得到一组pod,如下:

$ kubectl get pods -n istio-system

NAME                                      READY     STATUS    RESTARTS   AGE

istio-ca-797dfb66c5-5dc6f                 1/1       Running   0          2h

istio-ingress-84f75844c4-g666n            1/1       Running   0          2h

istio-mixer-9bf85fc68-l54vm               3/3       Running   0          2h

istio-pilot-575679c565-rkm82              2/2       Running   0          2h

安装自动的sidecar 注入

Istio的核心功能之一是代理服务间的所有流量。这使得它能够做非常有用的事情,比如端点之间的相互认证,在服务的当前/下一版本之间进行业务拆分,并度量请求的等待时间。

Istio在每一个服务pod中创建一个sidecar容器,通过拦截pod创建及执行这种注入来代理流量。

Istio项目页面上记录了如何自动注入。为了简洁,下面是用Istio root执行的一组命令来配置这个。首先为Kubernetes CA创建一组证书:

$ ./install/kubernetes/webhook-create-signed-cert.sh \    

  --service istio-sidecar-injector \    

  --namespace istio-system \    

  --secret sidecar-injector-certs

接下来,安装sidecar注入配置图:
$ kubectl apply -f install/kubernetes/istio-sidecar-injector-configmap-release.yaml

然后,建立caBundle YAML文件,用于Kubernetes API服务器调用WebHook:


$ cat install/kubernetes/istio-sidecar-injector.yaml | \

    ./install/kubernetes/webhook-patch-ca-bundle.sh> \

    install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml

最后,安装sidecar injector webhook。
$ kubectl apply -f install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml

sidecar injector webhook现在可以运行了:

$ kubectl -n istio-system get deployment -listio=sidecar-injector

NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE istio-sidecar-injector   1         1         1            1           1d
 

安装已绑定的工具

默认情况下,Istio不会将其sidecar代理注入到应用程序pod中,而是需要引导它对特定的命名空间注入sidecar。现在我们为默认命名空间执行以下操作:
$ kubectl label namespace default istio-injection**=**enabled

Istio包括一个叫做BookInfo的应用程序示例,我们可以使用它来观察这种注入,以及Istio的其他功能。可以通过上面的链接了解这个应用程序的体系结构,然后安装它:
$ kubectl apply -f samples/bookinfo/kube/bookinfo.yaml

一旦创建了pod,你会发现它们不是通常的1/1,而是2/2:

$kubectl get pods

NAME                              READY     STATUS    RESTARTS   AGE

details-v1-64b86cd49-8tn9p        2/2       Running   0          15s

productpage-v1-84f77f8747-6dh6l   2/2       Running   0          13s

ratings-v1-5f46655b57-bpwkb       2/2       Running   0          14s

reviews-v1-ff6bdb95b-m8f6f        2/2       Running   0          14s

reviews-v2-5799558d68-8t7h8       2/2       Running   0          14s

reviews-v3-58ff7d665b-2hfx2       2/2       Running   0          13s

这表明Istio已经将一个sidecar容器注入到它们中的每一个,它们将对我们前面提到的流量进行代理。执行describe可以查看一个pod的描述(你的pod id可能有所不同):

$ kubectl describe pod reviews-v1-ff6bdb95b-m8f6f

输出包括两个容器,reviews容器和istio-proxy容器。

可以通过查找Istio的入口控制器的公共IP来查看该应用程序的运行情况:

$ kubectl get services -n istio-system | grep istio-ingress 
istio-ingress            LoadBalancer   10.0.58.79     13.68.135.154   80:32552/TCP,443:31324/TCP                                         3h

打开http://13.68.135.154/productpage(需要换成自己的ip)并刷新,会发现有三个版本的应用程序(没有星、红星和黑星)正在负载均衡。

Istio可视化工具

Istio还捆绑了一些非常有用的工具,用于服务网格的管理、调试和可视化。其中第一个是Grafana和Prometheus,它们是用Istio仪表板预先配置的。

在0.5.1版本中,在yaml定义中有一个Prometheus命名空间的bug。编辑install/kubernetes/addons/prometheus.yaml,查找ServiceAccount。确保它的定义开始部分如下,如果缺少命名空间就加上它(这在主机中是固定的。该问题在最近的版本中已被解决,所以如果它看起来像下面的话就可以忽略)

apiVersion: v1

kind: ServiceAccount

metadata:

name: prometheus

namespace: istio-system

这样,您就可以安装所有这些工具了:


$ kubectl apply -f install/kubernetes/addons/prometheus.yaml

$ kubectl apply -f install/kubernetes/addons/grafana.yaml

$ kubectl apply -f install/kubernetes/addons/servicegraph.yaml

$ kubectl apply -f install/kubernetes/addons/zipkin.yaml

一旦启动起来,就应该让这些pod在集群中运行:


$kubectl get pods -n istio-system

NAME                                      READY     STATUS    RESTARTS   AGE

grafana-648859cf87-gpjmw                  1/1       Running   0          2h

istio-ca-797dfb66c5-5dc6f                 1/1       Running   0          3h

istio-ingress-84f75844c4-g666n            1/1       Running   0          3h

istio-mixer-9bf85fc68-l54vm               3/3       Running   0          3h

istio-pilot-575679c565-rkm82              2/2       Running   0          3h

istio-sidecar-injector-7b559f7f6f-btzr9   1/1       Running   0          2h

prometheus-cf8456855-f2q2r                1/1       Running   0          2h

servicegraph-7ff6c499cc-wm7r2             1/1       Running   0          2h

zipkin-7988c559b7-hsw7x                   1/1       Running   0          2h

然后,我们可以通过端口的port-forward命令连接到Grafana前端:

$ exportGRAFANAPOD=$(kubectl get pods -n istio-system | grep "grafana" | awk '{print $1}')
$ kubectl port-forward $GRAFANAPOD -n istio-system 3000:3000

通过浏览器打开http://localhost:3000

Grafana预先配置了多个仪表板,下面这个用来监视Mixer,Istio的组件之一。

图1

如果您最近点击了图书信息应用程序,您会在输入请求图中看到您的请求。还可以通过可视化看到应用程序的服务如何使用Service Graph进行通信。

$ export SERVICEGRAPHPOD=$(kubectl get pods -n istio-system | grep "servicegraph" | awk '{print $1}')
$ kubectl port-forward $SERVICEGRAPHPOD -n istio-system 8088:8088

在点击多个图书信息页面后,打开http://localhost:8088/dotviz可以看到服务之间的所有互连:

图2

您还可以使用Zipkin查看延迟分解图:

$ export ZIPKINPOD=$(kubectl get pods -n istio-system | grep "zipkin" | awk '{print $1}') 
$ kubectl port-forward $ZIPKINPOD -n istio-system 9411:9411  

打开http://localhost:9411,您可以点击一个产品页面请求,看看哪些服务组件导致整个延迟:

图3

有关这些工具的详细信息可以参考Istio项目文档https://istio.io/docs/tasks/telemetry/

Istio流量管理工具

Istio工具的核心在于其流量管理功能。请参照链接,这些文档能够非常清楚地描述如何使用这些工具,并通过这些工具来管理集群中服务之间的通信来解决诸如回路阻断、请求路由、入口和错误注入等。

希望这个演练很有用。如果你有任何反馈或者喜欢这样的内容,请在Twitter上联系或关注我。

原文链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352