服务网格
Istio 服务网格,让你更好更轻松地解决服务治理问题
函数即服务(FAAS)
- 函数 -> 无状态:调用一个函数的时候,有没有状态,例如不需要知道用户有没有登录,拿到OAuth2 的 Token令牌就可以访问方法
- 方法 -> 有状态:调用一个方法,比如查询用户,有没有权限,有没有登录。
完整的微服务架构生态
解决方案是:React / Vue + Spring Cloud + Apache Dubbo + Kubernetes + Istio 的方式来实现完整的微服务架构生态,真正意义上满足三大指标(高可用、高性能、高并发),下一代 云架构时代,可以尝试使用 区块链 的方式实现 servless 函数即服务架构;
React / Vue
前后分离;将视图层解耦出来,使用 MVVM 模式实现双向数据绑定,利用其提供的 模块化 与虚拟 DOM 开发
Apache Dubbo
高性能Java RPC通信框架;在微服务架构体系中仅充当RPC通信功能,主要作用于数据访问层,因为数据库不允许被直接访问,所以它在 三层架构的最底层。
Spring Cloud Alibaba
一站式微服务开发解决方案;在此套架构中它作用于业务逻辑层,阿里巴巴提供的各种组件可以很好的为我们协调业务场景问题,比如 削峰填谷、熔断降级、流量监控等
Kubernetes
容器编排系统;K8S的重要性不言而喻,它是实现云计算的重要工具,但是它还有个缺点是没有提供很好的服务治理能力
Istio
Service Mesh 服务网格,让你更好的解决服务治理问题;它补充了K8S缺失的服务治理能力,采用Sidecar模式为我们提供了一套 控制面,包括Pilot(规则配置)、Mixer(策略配置)、Citadel(证书生成与下发)、Kiali(规则验证)
Spring Cloud & Kubernetes
| 功能比较 | Spring Cloud Alibaba | Kubernetes |
|---|---|---|
| 配置管理 | Nacos | ConfigMap |
| 服务发现 | Nacos | Etcd |
| 负载均衡 | Ribbon | Service |
| API 网关 | 借用Spring Cloud Gateway | Ingress |
| 认证授权 | 借用Spring Security OAuth2 | Secrets |
| 日志收集 | ELK(LogStash) | EFK(Fluentd) |
| 指标收集 | - | Prometheus, Grafana |
| 链路追踪 | 借用 Apache Skywalking | ZipKin |
| 熔断限流 | Sentinel | 支持 |
| 自动扩缩容 | - | 支持 |
| 打包部署 | Spring Boot | Docker |
| 任务调度 | Spring Batch | Jobs |
什么是服务治理问题
一句话总结 Istio
Istio 是运行与分布式应用程序之上的 非侵入式(无代码入侵)服务网格系统,它的主要目的是为了更好更轻松的解决服务治理问题
什么是服务治理问题
首先这是思考题,我们是去治理服务而不是去管理服务,随着业务和访问量增大,架构也在慢慢的发送变化,从最早的单应用 -> 三层架构 -> SOA -> 微服务,架构是根据业务和访问量不断演变的,你会发现在这一过程中各种问题层出不穷(按下葫芦,起了瓢),由此可见,我们根本不可能有一种固定的反思去管理我们的服务,所以这么多服务不存在管理问题而是治理问题。
服务治理到底在治理什么?其主要目的是 处理服务与服务之间的调用关系 比如谁是提供者?谁是消费者?除了故障怎么办?如何保证服务质量?如何实现服务熔断和降级?服务如何监控?如何最大化提高机器的利用率?
使用已知工具治理服务
按照我们现在掌握的工具,可按如下分类做与服务治理相关的工作
- 服务注册与发现: Eurake, Nacos
- 服务外部化配置:Spring Cloud Config, Nacos, Apollo
- 服务熔断降级:Hystrix, Sentinel
- API 网关:Zuul, Spring Cloud Gateway
- 负载均衡: Ribbon,Dubbo
- 链路追踪:Zipkin,Skywalking
- 日志收集:ELK,EFK
- 服务监控:Promethues,Grafna,Spring Boot Admin
这些纷繁复杂的工具都是我们在做微服务时不可少的组件,而这些组件都有一个问题就是代码侵入性,能不能有一套系统来为我们解决服务治理问题,将这些组件彻底解耦,然我们回归业务本身。
非入侵式服务网格系统
什么是服务网格
术语服务网格(Service Mesh) 用于描述微服务之间的网络,以及通过此网络进行的服务之间的交互。随着服务数量和复杂度的增加,服务网格将变的难以理解和管理,对服务 网格的需求包括:
- 服务发现:Nacos
- 负载均衡: Ribbon,Doub
- 故障恢复:奔溃自动恢复
- 指标和监控: 常见的性能指标,吞吐量、资源利用率、点击数、并发用户数
- A / B 测试: 例如前端,几个测试组交叉测试不同版本的操作体验,然后选出其中体验最好的版本,成为最终发布版本
- 金丝雀发布:先富带动后富。先发布一部分,在发布下部分
- 流量控制: alibaba的Sentinel
- 访问控制: OAuth2
- 端对端身份验证: OAuth2
什么是Istio
Istio 是运行与分布式应用程序之上的非入侵式(无代码入侵) 服务网格系统它的主要目的是为了更好更轻松的解决服务治理问题(Istio是一套非侵入式一站式服务治理解决方案)
Istio 的实现原理是,为每个微服务部署一个Sidecar,代理微服务之间的所有网络通信,在此基础上你可以通过Istio的控制平面实现:
- 针对 HTTP、gRPC、WebSocket、TCP 流量的负载均衡
- 细粒度的流量控制行为、包括路由、重试、故障转移、故障注入
- 可拔插的策略层 + 配置API,实现访问控制、限速、配额
- 自动收集指标、日志,跟踪集群所有流量,包括Ingress/Egress
- 基于强身份认证和授权来保护服务之间的通信
核心特性
流量管理
使用Istio可以很容易通过配置,对流量和API调用进行控制。服务级别的可配置属性包括断路器、超时、重试,Istio支持基于流量百分比切分的A/B测试、金丝雀滚动发布、分阶段滚动发布
安全性
可以提供安全信道,管理身份验证和授权,加密通信流量,联用K8S的网络策略可以获得更多的一处,例如保护Pod-to-Pod之间的通信
可观察性
Istio强大的跟踪、监控、日志能力,让服务网格内部结构更容易观察(一个服务的性能对上下游的影响可以直观的展现在仪表盘上)
Istio架构
从整体上来看,Istio的服务网格由数据平面、控制平面两部分组成:
- 数据平面: 由一系列作为sidecar部署的智能代理(Envoy)构成。这些代理联合Mixer,中继、控制所有服务之间的网络通信。想要注意的是,还有一些Envoy是独立部署(而非sidecar)的,用来实现K8S Ingress控制器、Istio的Ingress/Egress网关
- 控制平面:负责管理、配置智能代理、实现流量路由;配置Citadel实现TLS证书管理;配置Mixers来应用策略、收集指标
Envoy
Istio 使用一个扩展过的Envoy版本。Envoy是基于C++开发的高性能代理,Istio使用它的以下特性:
- 动态服务发现
- 负载均衡
- TLS termination(可将后端的HTTP服务包装为HTTPS)
- 断路器
- 健康检查
- 分阶段(基于流量百分比)发布
- 故障注入
- 丰富的监控指标
一般情况下Envoy在和目标服务的系统Pod中,以Sidecar形式部署少量的Istio组件的主进程就是Envoy,包括Ingress控制器、Ingress/Egress网关
Mixer
一个平台无关的组件:
- 为服务网格应用访问控制策略
- 从Envoy和其他服务中收集指标
- Envoy 收集的请求级别的属性,让Istio能够灵活的和多种宿主机环境、基础设施后端惊醒对接
Pilot
该组件是Istio的控制器,它会监控各种规则、策略(通常存储在K8S中),一旦配置文件发生变化,就会提取、处理,并同步给Envoy:
- 为Envoy 提供服务发现
- 为智能路由(AB测试、金丝雀部署)提供流量管理能力
- 提供弹性(延时、重试、断路器)
- 分发身份验证策略给Envoy
Pilot 将高级别的路由规则转换为 Envoy 理解的配置信息,并在运行时将这些配置传播到Sidecars,Pilot将平台相关的服务发现机制抽象为标志的(Envoy data plane API, xDS)格式,这让Istio可以在K8S、Consul、Nomad等多种环境下运行
Citadel
提供服务与服务之间、或者针对终端用户的身份验证功能,可以加密服务网格中的流量
Kiali
为我们提供了查看相关服务与配置提供了统一化的可视化界面,并且能在其中展示他们的关联;同时他还提供了界面让我们可以很方便的验证Istio配置与错误提示
Kubernetes 安装 Istio
概述
安装Helm
安装客户端Helm 参考
1 |
|
安装服务端 Tiller
创建 tiller-adminuser.yml
1 |
|
1 | kubectl apply -f tiller-adminuser.yml |
直接安装Istio 官方文档
1 | # 下载 https://github.com/istio/istio/releases/ |
卸载
1 | kubectl delete -f @samples/addons@ |
使用helm安装Istio 官方文档
1 |
|
卸载
1 | helm ls -n istio-system |
部署Kiali
1 | kubectl apply -f samples/addons |
- 本文作者: MISAKIGA
- 本文链接: https://misakiga.github.io/2021/04/02/k8s/istio服务网格/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
