前言
随着微服务的流行,伴随而来的是服务治理难题。传统的客户端发现,比如使用 Eureka 或者 Consul,随着节点数量的增加,维护的难度也与日俱增。同时,服务调用的流量也变得越来越大,流量的监管和控制也变得越来越困难。
而服务网格则是一种相对比较好的解决方案,它提供了对流量进行管理的能力,比如能够进行流量的限制、流量的监控等。在现在已经有了很多成熟的服务网格框架,如 Linkered、Envoy 和 Istio 等。
本文将介绍如何使用 Istio 集成 Kubernetes 实现服务网格。
环境准备
- Kubernetes 集群
- Istio
Istio 基本概念
在上面的文章中,我们说了服务网格的好处,那么 Istio 提供了哪些好处呢?
Istio 可以提供以下功能:
- 流量的控制:路由、限流、熔断器
- 安全:流量加密、身份认证
- 监控:流量的可视化、日志
- 服务的发现
Istio 也有一些基本组件:
- Pilot:这个是使用来发现和注册服务的
- Citadel:也是一个服务,这个服务的作用就是用来提供服务之间的认证和加密的
- Mixer:是 Istio 中的扩展点,用于限流、监控、日志收集等等
- Envoy:这个是一个高性能的代理,作为 Istio 的 Sidecar,用来控制服务之间的流量
其中,Mixer 可以进行自定义扩展,我们只需要编写一些纯 Funtion 的代码,就可以在 Mixer 上做自定义的限流、监控等功能。这个可扩展的能力,让 Istio 成为一个非常灵活的平台。
为了方便,我们再给这些概念进行一个图形化的展示:
Kubernetes 集成 Istio 的过程
前置条件是先安装好 Kubernetes 集群和 Istio
1. 安装 Istio
可以直接通过官方提供的 Helm Chart 来安装 Istio。具体安装方式可参考官方文档。
2. 打开 Istio 的自动注入
打开 Istio 的自动注入后,Kubernetes 的 Pod 里面就都带有了 Istio 的 Sidecar。具体命令如下:
kubectl label namespace default istio-injection=enabled
3. 部署应用
在 Kubernetes 中部署应用的时候需要注意以下细节:
- 需要将 Istio 的代理 Envoy 部署在每个 Pod 里面
- 需要在 Kubernetes Service 中将负载均衡规则的指向 Envoy
我们对应地修改一下 Kubernetes 的 YAML 文件:
-- -------------------- ---- ------- ----------- ------- ----- ---------- --------- ----- --------------- ------- ---- --------------- ----- --------- - --------- ------------ ---- --------------- --------- --------- ------- ---- --------------- ----- ----------- - ----- --------------- ------ ---------------------- ------ - -------------- ---- - ----- ----- ------ ----------------------------- ------ - -------------- ----- - -------------- ----- ------------- - ----- ------------- ---------- ---------- -------- - ----- ------------- ---------- ----- ------------ --- ----------- -- ----- ------- --------- ----- --------------- ------- ---- --------------- ----- ------ - ----- ---- ----- ---- --------- --- ----------- ---- - ----- ----- ----- ----- ----------- ----- --------- --- - ----- ---------------- ----- ----- ----------- ----- --------- --- --------- ---- ---------------
我们对这个 YAML 文件进行一下简单的分析:
- 在 Pod 的
containers
里面,我们增加了一个 Envoy 的容器,监听了两个端口:15006 和 15090。 - 在 Service 对象里面增加了
http2
和http2-prometheus
两个端口。
4. 确认应用是否可以成功访问
现在我们部署好了应用,可以通过 Kubernetes Service 的 IP 地址来访问应用:http://service-ip:8080
。现在我们运行一下 curl http://service-ip:8080
,看看是否可以成功访问应用。
5. 部署 Istio 的 CRD 对象
我们可以使用 kubectl apply 命令,将 Istio 的 CRD 对象部署到 Kubernetes 集群中:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.9/samples/bookinfo/platform/kube/bookinfo.yaml
6. 观察应用流量集成 Istio
如果使用 Istio,我们可以更方便地监控应用的流量。启动 Istio 中的 Kiali 组件,可以直接看到具体的流量图。
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.9/samples/addons/kiali.yaml
等待 Kiali 运行后,即可看到我们部署的应用的具体流量状态:
上图中,我们可以看到我们所部署的应用流量的整条路径,其中的 Envoy,就是我们之前增加的 Sidecar 容器所监听的端口,从而实现了对应用的流量的控制。
总结
本文是一篇入门级的 Istio 教程,我们从 Istio 的基本概念,到 Kubernetes 集成 Istio 的过程,一步一步地深入解析 Istio。通过阅读本文,你已经了解了 Istio 和 Kubernetes 集成的基本原理,以及应用中如何集成 Istio。
在实际使用 Istio 时,我们也可以结合 Service Mesh Interface(SMI)标准,控制 Service Mesh 中的流量。随着社区的不断发展,Istio 的使用也会越来越方便。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6644b91bd3423812e429b370