一、什么是服务网格
服务网格(Service Mesh)是一个专门处理服务通讯的基础设施层。它的职责是在由云原生应用组成服务的复杂拓扑结构下进行可靠的请求传送。在实践中,它是一组和应用服务部署在一起的轻量级的网络代理,并且对应用服务透明。
服务网格中体架构为控制平面+数据平面,控制平面负责与代理通信,下发策略和配置。数据平面就是直接处理入站和出战数据包,转发、路由、健康检查、负载均衡、认证、鉴权、产生监控数据等
服务网格部署网络结构图
其中绿色方块为应用服务,蓝色方块为Sidecar Proxy,应用服务之间通过Sidecar Proxy进行通信,图中所有蓝色部分就是形成的Service Mesh
二、Istio介绍
Istio出自名门,是一个由Google和IBM等公司开源的,最初设计目标实在kuberneters的基础上,以非侵入的方式为运行在集群中的微服务提供流量管理、安全加固、服务监控和策略管理等功能。
- 流量管理:提供统一的流量治理功能,包括失败重试、超时、熔断/限流、路由管理、灰度发布、网关等功能。
- 可观测性:透明化的实现指标监控、日志】链路追踪等功能
- 策略控制:实现访问控制系统、遥测捕获、配额管理和计费等
- 安全认证:无侵入式地为服务增加认证鉴权和加密通信的能力
- 故障注入:支持随机像服务通信中注入故障(如模拟延时/网络中断),检测服务的可靠性
三、Istio架构
Istio在逻辑上分为控制平面和数据平面
控制平面:主要包括了 Pilot、Mixer、Citadel 和 Galley 共 4 个组件,主要功能是通过配置和管理 Sidecar 代理来进行流量控制,并配置 Mixer 去执行策略和收集遥测数据(Telemetry)
数据平面:由一组和业务服务成对出现的 Sidecar 代理(Envoy)构成,它的主要功能是接管服务的进出流量,传递并控制服务和 Mixer 组件的所有网络通信(Mixer 是一个策略和遥测数据的收集器,稍后会介绍)
Istio 选择Envoy作为Sidecar代理,Envoy本质上是一个为面向服务的建构而设计的7层代理和通信总线。Envoy将流量的行为和数据提取出来发送给Mixer组件,用以进行监控。
Envoy在网络控制方面的主要功能为:HTTP 7层路由、支持gRPC、HTTP/2、服务发现和动态配置,健康检查、高级负载均衡
在Kubernetes环境中,同一个Pod内的不同容器间共享网络栈,这一特性使得Sidecar可以接管进出这些容器的网络流量,这就是Sidecar模式的实现基础。Envoy是目前Istio默认的数据平面,实际上因为Istio灵活的架构,完全可以选择其他兼容的产品作为Sidecar。目前很多服务网格产品都可以作为Istio的数据平面并提供集成。
Pilot:是Istio实现流量管理的核心组件,它主要的作用是配置和管理Envoy代理。比如:可以为代理之间设置特定的流量规则,或者配置超时、重试、熔断这样的弹性能力。Pilot 会将控制流量行为的路由规则转换为 Envoy 的配置,并在运行时将它们广播到 Envoy。另外,Pilot 还能够把服务发现机制抽象出来并转换成 API 分发给 Envoy,使得后者具有服务发现的能力。
Pilot从平台获取服务信息,完成服务发现,获取istio的各项配置,转换成Envoy大力可读的格式并分发
Citadel:为服务之间提供认证和证书管理,可以让服务自动升级成 TLS 协议。
Galley:Galley 是 Istio 的配置验证、提取、处理和分发组件。它负责将其余的 Istio 组件与从底层平台(例如 Kubernetes)获取用户配置的细节隔离开来。
四、Istio安装
4.1 使用istioctl安装
下载istio
curl -L https://istio.io/downloadIstio | sh -
转到 Istio 包目录
cd istio-1.22.2
安装目录包含:
samples/
目录下的示例应用程序bin/
目录下的 istioctl 客户端二进制文件。
将 istioctl
客户端添加到路径(Linux 或 macOS):
$ export PATH=$PWD/bin:$PATH
安装istio。对于本次安装,我们采用 demo
配置组合。 选择它是因为它包含了一组专为测试准备的功能集合,另外还有用于生产或性能测试的配置组合。
istioctl install --set profile=demo -y
给命名空间添加标签,指示 Istio 在部署应用的时候,自动注入 Envoy 边车代理:
kubectl label namespace default istio-injection=enabled
4.2 helm安装
配置Helm存储库
helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo update
Helm 安装的一般语法是:
helm install <release> <chart> --namespace <namespace> --create-namespace [--set <other_parameters>]
<chart>
:一个打好包的 Chart 路径,也可以是一个未打包的 Chart 目录或 URL。<release>
:一个用于标识和管理安装后的 Helm Chart 的名称。<namespace>
:要安装 Chart 的命名空间。
为 Istio 组件,创建命名空间 istio-system
:
kubectl create namespace istio-system
安装 Istio Base Chart,它包含了集群范围的自定义资源定义 (CRD),这些资源必须在部署 Istio 控制平面之前安装:
helm install istio-base istio/base -n istio-system --set defaultRevision=default
使用 helm ls
命令验证 CRD 的安装情况:
helm ls -n istio-system
安装 Istio Discovery Chart,它用于部署 istiod
服务:
helm install istiod istio/istiod -n istio-system --wait
验证 Istio Discovery Chart 的安装情况:
helm ls -n istio-system
获取已安装的 Helm Chart 的状态,确保它已部署:
helm status istiod -n istio-system
检查 istiod
服务是否安装成功,确认其 Pod 是否正在运行:
kubectl get deployments -n istio-system --output wide
安装 Istio 的入站网关:
kubectl create namespace istio-ingress
helm install istio-ingress istio/gateway -n istio-ingress --wait