什么是Istio

Istio是Service Mesh(服务网格)的主流实现方案。该方案降低了与微服务架构相关的复杂性,并提供了负载均衡、服务发现、流量管理、断路器、监控、故障注入和智能路由等功能特性。

其中,Sidecar模式是一种将应用功能从应用本身剥离出来作为单独进程的方式。该模式允许我们向应用无侵入添加多种功能,避免了为满足第三方组件需求而向应用添加额外的配置代码。从某种意义上来说,服务对于网络是无感知的,只知道所附加的sidecar代理,它将网络依赖抽象成了Sidecar。

在Service Mesh中,我们需要了解Data Plane和Control Plane两个概念:

  • Data Plane:作用是处理网格内服务间的通信,并完成服务发现、负载均衡、流量管理、健康检查等功能;
  • Control Plane:作用是管理和配置策略用于路由流量,同时也在运行期执行策略。

Istio核心组件

  • Envoy:Istio 使用 Envoy调解服务网格中所有服务的入站和出站流量。属于数据平面。
  • Mixer:负责在服务网格上执行访问控制和使用策略,以及收集从Envoy和其他服务自动监控到的数据。
  • Pilot:为 Envoy sidecar 提供服务发现功能,为智能路由(例如 A/B 测试、金丝雀部署等)和弹性(超时、重试、熔断器等)提供流量管理功能。属于控制平面。
  • Citadel:提供访问控制和用户身份认证功能。

Istio可视化管理组件

其中,Kiali、Jaeger、prometheus、grafana管理工具,将和Istio一并部署。

使用Helm部署Istio

依赖环境
Helm > 2.10
Kubernetes > 1.9

下载并解压缩istio的发布包

1
2
3
wget https://github.com/istio/istio/releases/download/1.0.6/istio-1.0.6-linux.tar.gz
tar -zxvf istio-1.0.6-linux.tar.gz
cd istio-1.0.6

Istio的Chart在istio-1.0.6/install/kubernetes/helm目录中,这个Chart包含了下面的代码文件

1
2
3
4
# tree install/kubernetes/helm/istio
......
......
31 directories, 139 files

如果安装的Helm版本高于2.10,就不再需要手动使用kubectl安装Istio的CRD。反之,则需要执行如下命令安装

1
kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml

查看安装的CRD

1
kubectl get CustomResourceDefinition

通过各个组件在vaule file的enabled flag启用或禁用,下面创建名称为istio.yaml的vaule file,将几个默认禁用的组件也启用

1
2
3
4
5
6
7
8
tracing:
enabled: true
servicegraph:
enabled: true
kiali:
enabled: true
grafana:
enabled: true

首先,创建名称为kiali的secret。

1
2
# echo -n 'admin' | base64
YWRtaW4=
1
2
# echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
1
2
3
4
5
6
7
8
9
10
11
12
13
# cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: kiali
namespace: istio-system
labels:
app: kiali
type: Opaque
data:
username: YWRtaW4=
passphrase: MWYyZDFlMmU2N2Rm
EOF

执行helm安装命令

1
helm install install/kubernetes/helm/istio --name istio --namespace istio-system -f istio.yaml

安装完成后确认各个组件的Pod正常运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# kubectl get pod -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-59b8896965-5f9j2 1/1 Running 0 23m
istio-citadel-6f444d9999-s9jrc 1/1 Running 0 23m
istio-egressgateway-6d79447874-ssbc4 1/1 Running 0 23m
istio-galley-685bb48846-mvf5w 1/1 Running 0 23m
istio-grafana-post-install-6m256 0/1 Completed 0 23m
istio-ingressgateway-5b64fffc9f-mrl9t 1/1 Running 0 23m
istio-pilot-8645f5655b-k6fcz 2/2 Running 0 23m
istio-policy-547d64b8d7-6dgkp 2/2 Running 0 23m
istio-sidecar-injector-5d8dd9448d-zfdsb 1/1 Running 0 23m
istio-telemetry-c5488fc49-qwwcv 2/2 Running 0 23m
istio-tracing-6b994895fd-4vjfx 1/1 Running 0 23m
kiali-5f9ffff7cf-jqk8p 1/1 Running 0 23m
prometheus-76b7745b64-xjzmm 1/1 Running 0 23m
servicegraph-cb9b94c-mlhjm 1/1 Running 0 23m

Istio 以一个项目的形式部署到 Kubernetes 集群中。我们可以看到,部署好的 pods 中,除了有 istio-citadel、istio-egressgateway、istio-ingressgateway、istio-pilot 等 Istio 本身的功能组件,还集成了微服务相关的监控工具,如:grafana、jaeger-agent、kiali、prometheus。正是这些功能丰富且强大的监控工具,帮助 Istio实现了微服务的可视化管理。

运行示例Bookinfo

您可以部署自己的应用或者示例应用程序如 Bookinfo。 注意:应用程序必须使用 HTTP/1.1 或 HTTP/2.0 协议来传递 HTTP 流量,因为 HTTP/1.0 已经不再支持。

如果运行 Pod 的 namespace 被标记为 istio-injection=enabled 的话,Istio-Initializer 会向应用程序的 Pod 中自动注入 Envoy 容器:

1
2
kubectl label namespace <namespace> istio-injection=enabled
kubectl create -n <namespace> -f <your-app-spec>.yaml

如果您没有安装 Istio-initializer-injector 的话,您必须使用 istioctl kube-inject 命令在部署应用之前向应用程序的 Pod 中手动注入 Envoy 容器:

1
kubectl create -f <(istioctl kube-inject -f <your-app-spec>.yaml)

Bookinfo 应用由四个单独的微服务构成,用来演示多种 Istio 特性,包含:

  • productpage :productpage 微服务会调用 details 和 reviews 两个微服务,用来生成页面。
  • details :这个微服务包含了书籍的信息。
  • reviews :这个微服务包含了书籍相关的评论。它还会调用 ratings 微服务。
  • ratings :ratings 微服务中包含了由书籍评价组成的评级信息。

reviews 微服务有 3 个版本:

  • v1 版本不会调用 ratings 服务。
  • v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
  • v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。

下图展示了这个应用的端到端架构。

运行示例bookinfo,并开启Sidecar自动注入。

1
2
3
4
# kubectl label namespace default istio-injection=enabled
# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
# kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
# kubectl apply -f samples/bookinfo/platform/consul/destination-rule-all.yaml

访问productpage
http://172.16.0.180:31380/productpage

31380端口可以通过命令获取

1
kubectl -n istio-system get svc istio-ingressgateway -o jsonpath='{.spec.ports[0].nodePort}'

使用Ingress暴露管理服务

完成Istio的安装后,可以看到安装的组件除了Istio架构中的数据平面和控制平面的各个核心组件,还部署了Prometheus、Grafana、Jaeger、Kiali等辅助组件。 在云原生生态中,我们已经对这些组件很熟悉了。

  • Prometheus:监控系统,收集Istio的监控数据
  • Grafana:监控信息的图表展现,Istio部署的Grafana为我们内置了各个组件相关的Dashboard
  • Jaeger:分布式跟踪系统,Istio中集成Jaeger可以对基于Istio的微服务实现调用链跟踪、依赖分析,为性能优化和故障排查提供支持
  • kiali:kiali作为Istio的可视化管理工具,可以认为是Istio的UI,可以展现服务的网络拓扑、服务的容错情况(超时、重试、短路等)、分布式跟踪等

这些辅助组件都有自己的web界面,这里我们使用ingress的方式将这些组件暴露到集群外,以便在集群外部访问。Istio支持使用自带的istio-ingressgateway将服务暴露到集群外部,这个和Kubernetes中暴露Ingress Controller类似,有很多种方式,如NodePort,LoadBalancer,或直接开启hostNetwork: true等等。为了便于统一管理K8s集群中的服务暴露,笔者更倾向使用Traefik Ingress。

使用Ingress暴露istio服务
编写ingress yaml文件,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# cat istio-ingress.yaml 
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: jaeger-query
namespace: istio-system
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: istio.jaeger-query.com
http:
paths:
- path: /
backend:
serviceName: jaeger-query
servicePort: 16686 ---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: prometheus
namespace: istio-system
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: istio.prometheus.com
http:
paths:
- path: /
backend:
serviceName: prometheus
servicePort: 9090 ---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: grafana
namespace: istio-system
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: istio.grafana.com
http:
paths:
- path: /
backend:
serviceName: grafana
servicePort: 3000 ---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: kiali
namespace: istio-system
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: istio.kiali.com
http:
paths:
- path: /
backend:
serviceName: kiali
servicePort: 20001

执行部署命令

1
kubectl apply -f istio-ingress.yaml

外部客户端,配置hosts地址解析,如下

1
2
3
4
172.16.0.180 istio.prometheus.com
172.16.0.180 istio.jaeger-query.com
172.16.0.180 istio.grafana.com
172.16.0.180 istio.kiali.com

访问jaeger
浏览器访问Jaeger之前可以多次刷新productpage页面以便产生访问请求等。选择productpage.default可以查看整个调用链。使用istio.jaeger-query.com域名访问,结果展示:

访问kiali
使用域名istio.kiali.com访问kiali页面。用户名admin,密码1f2d1e2e67df。

访问prometheus
使用域名istio.prometheus.com访问prometheus页面。

访问grafana
使用域名istio.grafana.com访问prometheus页面。

Istio 对 Pod 和服务的要求

要成为服务网格的一部分,Kubernetes 集群中的 Pod 和服务必须满足以下几个要求:

  • 需要给端口正确命名:服务端口必须进行命名。端口名称只允许是<协议>[-<后缀>-]模式;
  • Pod必须关联到 Kubernetes服务:如果一个 Pod 属于多个服务,这些服务不能再同一端口上使用不同协议,例如 HTTP 和 TCP。
  • Deployment应带有app以及version标签:每个 Deployment 都应该有一个有意义的 app 标签和一个用于标识 Deployment 版本的 version 标签。Istio 会用 app 和 version 标签来给监控指标数据加入上下文信息。

总结

本文实践了使用istio官方提供的helm chart在Kubernetes上部署Istio 1.0.6的过程,并使用traefik ingress将Istio集成的Prometheus、Grafana、Jaeger、Kiali等辅助组件暴露到集群外部,并对进入集群的流量进行管理。

在生产环境中,如果是基于公有云,如阿里云、AWS等运行Istio,建议Ingress的IP地址使用ELB地址;如果是自建的平台,则建议使用HAproxy+Keepalived提供的VIP地址,作为Ingress的IP地址,实现高可用。

如果Ingress服务,需要暴露在公网,应当使用CA认证机构颁发的证书https化(如使用cert-manager)。此外建议使用NFS、Ceph等方案实现Istio监控以及微服务应用的数据持久化存储。

Istio的更多相关文章

  1. istio入门(01)istio的优势在哪里?

    Istio能做什么?Istio 试图解决微服务实施后面临的问题.Istio 提供了一个完整的解决方案,对整个服务网格行为洞察和操作控制,以满足微服务应用程序的多样化需求. Istio在服务网络中提供了 ...

  2. istio入门(00)istio的学习资源

    官网:https://istio.io/ 理论知识: http://www.uml.org.cn/wfw/201710131.asp 环境搭建: http://dockone.io/article/2 ...

  3. istio入门(04)istio的helloworld-部署构建

    参考链接: https://zhuanlan.zhihu.com/p/27512075 安装Istio目前仅支持Kubernetes,在部署Istio之前需要先部署好Kubernetes集群并配置好k ...

  4. istio入门(03)istio的helloworld-场景说明

    一.原生应用 四个微服务: python微服务:一个deployment(deployment含有一个pod,pod内含有一个容器) java微服务:三个deployment(deployment含有 ...

  5. istio入门(02)istio的架构和概念

    Istio从逻辑上可以分为数据平面和控制平面: 数据平面主要由一系列的智能代理(Envoy)组成,管理微服务之间的网络通信 控制平面负责管理和配置这些智能代理,并动态执行策略 主要由以下组件构成 En ...

  6. istio收集Metrics和日志信息

    1.切换到istio根目录 cd /data/istio/istio-0.7.1 2.安装prometheus kubectl apply -f install/kubernetes/addons/p ...

  7. istio添加Fluentd

    这个教程展示了istio如何自定义日志格式,并且将其发送给fluent.Fluentd 是一个开源的日志收集器,支持多种数据输出并且有一个可插拔架构.Elasticsearch是一个流行的后端日志记录 ...

  8. istio环境搭建for macbook

    首先需要搭建docker+k8s环境,如何搭建这里就不再赘述,可以自行搜索. 打开命令行,运行命令: curl -L https://git.io/getLatestIstio | ISTIO_VER ...

  9. Istio 是什么?

    使用云平台可以为组织提供丰富的好处.然而,不可否认的是,采用云可能会给 DevOps 团队带来压力.开发人员必须使用微服务以满足应用的可移植性,同时运营商管理了极其庞大的混合和多云部署.Istio 允 ...

随机推荐

  1. servlet与jsp篇(一)$.ajax交互

    servlet其实是利用java类编写的服务器端应用程序,他的生命周期可以分为三个阶段:初始化阶段.运行阶段和消亡阶段; jsp页面实质上是一个HTML页面,但他包含了用户产生动态网页内容的java代 ...

  2. Android 跳转权限设置界面的终极方案

    转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10338377.html 有时候APP需要获取某些权限,要让用户手动打开,那么问题来了,若是直接提醒用户出 ...

  3. centos7安装、配置、卸载jdk1.8

    环境: centos7 64bit jdk-8u121-linux-x64 一.安装jdk 1.安装jdk rpm -ivh jdk-8u121-linux-x64.rpm 2.查看是否安装成功 ja ...

  4. Python基础之if判断,while循环,循环嵌套

    if判断 判断的定义 如果条件满足,就做一件事:条件不满足,就做另一件事: 判断语句又被称为分支语句,有判断,才有分支: if判断语句基本语法 if语句格式: if 判断的条件: 条件成立后做的事 . ...

  5. 使用 Flask-Cache 缓存给Flask提速

    https://blog.csdn.net/u013205877/article/details/78013289

  6. [十二省联考2019]D2T2春节十二响

    嘟嘟嘟 这题真没想到这么简单-- 首先有60分大礼:\(O(n ^ 2logn)\)贪心.(我也不知道为啥就是对的) 然后又送15分链:维护两个堆,每次去堆顶的最大值. 这时候得到75分已经很开心了, ...

  7. Luogu P1038 神经网络

    qwq 拓扑排序模板题. 拓扑排序,是在一个$DAG$中,其拓扑排序为其所有结点的一个线性排序(答案不唯一). 该排序满足这样的条件——对于图中的任意两个结点$u$和$v$,若存在一条有向边从$u$指 ...

  8. php支持解密的加密算法示例

    其实只是对位运算符的一种简单的应用. <?php class Helper_Inpass{ private $keys='thisismytoken';//token function inpa ...

  9. [kuangbin带你飞]专题二十二 区间DP-B-LightOJ - 1422

    题意大概是这样,第i天必须穿a[i](某一种类)的衣服,你可以套着穿很多件,对于第i天,你有两种操作,一种是脱掉现在的衣服,一种是穿上新的一件,但是你脱掉的衣服,以后不能再穿.问最少需要多少件衣服? ...

  10. 周末学习笔记——day03(模块,包)

    一,复习 ''' 装饰器 @wraper # fn = wraper(fn) def fn(): pass def wrap(arg): def outer(func): # 可以用arg def i ...