服务网格作为新一代的微服务架构,相比于侵入式代码实现微服务,将服务治理功能下沉到了基础设施层。Istio是目前最流行的开源服务网格实现,用于连接、监视和保护k8s集群中的容器。Istio的核心特性包括流量管理、可观察性和安全配置。
尽管Istio号称支持多种环境,但基本还是得基于k8s来搭建,本篇笔记我们学习如何在k8s集群上安装和使用Istio服务网格。
传统的微服务解决方案如SpringCloud等,服务治理(服务发现、熔断、超时、限流)功能是在业务代码工程中集成SDK实现的,这种设计其实是存在缺点的:侵入式设计,SDK耦合了业务代码工程;受限于语言和框架,不灵活。
而新一代的微服务架构「服务网格」,则是将服务治理功能下沉到了基础设施层(如图所示),图中每个业务服务旁边都有一个SideCar,我们的业务服务不再需要直接通信了,无需实现服务发现、熔断、超时、限流等诸多功能,只需专注业务逻辑开发即可,服务治理相关的功能都由SideCar接管,实现了服务治理和业务逻辑的解耦,所有的SideCar即组成了一个服务网格。
Istio是目前比较流行的服务网格实现。从架构设计上,Istio服务网格可以分为两个部分:
控制平面:控制平面负责管理和配置SideCar,从而实现流量管理等诸多功能。
数据平面:数据平面由一组SideCar组成,SideCar由Envoy代理实现,负责代理业务服务的网络流量。
当然,服务网格架构虽然看起来很美好,但也不是完全没有缺点。目前如Istio等实现真正使用起来还是会遇到一些问题:
istioctl
是管理Istio服务网格的命令行工具,具体安装前,我们需要安装该工具。根据官方文档,我们可以使用如下命令下载istioctl
的预编译可执行文件:
curl -L https://istio.io/downloadIstio | sh -
下载完成后,我们会得到一个文件夹,其中bin
目录包含istioctl
的可执行二进制文件,我们可以将其加入环境变量。
验证安装成功:
istioctl version
Istio提供了许多组默认的配置文件,我们学习阶段可以直接部署demo
这个配置组,并基于它进行修改。
istioctl install --set profile=demo -y
我们可以执行如下命令查看安装内容的部署文件:
istioctl profile dump demo
除了Istio本体,我们通常还需要安装以下附加组件:
Kiali:Kiali提供了一个图形化界面,用于观察和配置Istio组件。
Prometheus:Prometheus是一个开源的监控系统,Istio对其进行了集成,用来收集监控数据。
Grafana:Grafana是一个数据可视化工具,用于以图表形式展示Prometheus收集的数据。
Jaeger:Jaeger是一个分布式链路跟踪系统,Istio集成了Jaeger实现应用流量的跟踪。Jaeger采集的链路跟踪数据则又依赖于ElasticSearch或kafka作为后端存储,对于这些周边组件本篇笔记就不再介绍了。
这些组件的资源清单文件都在Istio文件夹的samples/addons
内,我们根据自身情况对其进行调整后,执行kubectl apply -f
部署命令即可安装。
前面介绍过服务网格的数据平面是基于SideCar实现的,Istio中我们的业务服务都需要基于SideCar实现服务治理。Istio支持对如下例子配置的k8s命名空间自动注入SideCar:
apiVersion: v1
kind: Namespace
metadata:
name: dev
labels:
istio-injection: enabled
这里我们创建了一个名为dev
的例子命名空间,同时为命名空间加了一个特殊的标签istio-injection
为enabled
,Istio会根据该标签,对命名空间下部署的服务自动进行SideCar注入。
我们知道k8s本身没有实现负载均衡LB,Service的LoadBalancer模式一般只支持公有云。不过最近出现了MetalLB工具,它能够让我们在本地环境下体验LoadBalancer模式,便于我们观察学习。
MetalLB有若干种工作模式,我们实验环境可以使用Layer2模式,该模式下,MetalLB会在选定节点上响应LB地址段的ARP请求,从而实现流量转发(当然这其实并没有起到负载均衡的作用,只是作为一个模拟的体验)。
部署配置文件:https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml
使用MetalLB,除了部署文件我们还需要一个ConfigMap配置:
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.1.130-192.168.1.159
addresses
指定一个k8s集群同网段的地址段,供LB为LoadBalancer模式的Service分配地址。这样部署完成后,MetalLB会自动监测集群中LoadBalancer模式的Service,对符合条件的Service进行地址分配,同时在外部网络进行ARP广播占据IP地址,此时我们的LoadBalancer模式的istio-ingressgateway
就能正常使用了。
Istio中有很多抽象的概念,安装好Istio环境后,建议结合例子来学习。下面的示例程序包括4个SpringBoot微服务工程,1个Vue前端工程,对应工程的Dockerfile及k8s部署文件,以及部署到Istio所需的虚拟服务和网关资源配置。