Istio 基础

Istio是什么

  • Istio是Envoy Data Plane的控制平面实现之一

  • Istio是一个开源的独立服务网格,可为用户成功运行分布式微服务架构提供所需的基础设施

为什么要使用Istio

  • Istio可以轻松创建带有负载均衡、service-to-service的身份认证、细粒度的可观测性等功能的服务网格,而应用程序代码却无须或很少为些而作出改变;
  • 通过在整个服务环境中为每一个应用部署一个特殊的Sidecar形式的Proxy拦截各服务之间的所有网络通信,并由控制平面Istio进行配置和管理,进而为服务无侵入式添加如下功能
    • HTTP、gRPC、WebSocket和TCP通信的自动负载均衡;

    • 通过丰富的路由规则、重试、故障转移和故障注入对流量进行细粒度控制;

    • 支持访问控制、速率限制和配额的可插拔的策略层及配置API;

    • 集群内所有流量的自动度量、记录日志和分布式跟踪跟踪,包括集群的入口和出口;

    • 强大身份验证和授权,以及在群集中进行安全的服务间通信;

  • 在kubernetes环境中,服务网格就像一个仪表板,用于解决问题、执行流量策略、分配限制和测试代码,它允许一个中央节点来监视、跟踪和控制所有服务之间的交互

Istio系统架构

Istio系统架构介绍

  • 从完整意义上讲,Istio 服务网格逻辑上分为数据平面和控制平面

    • Istio:控制平面,由多个组件组合完成控制机制;

      • Istio的控制面板在底层集群管理平台(如Kubernetes,Mesos等)上提供了一个抽象层

    • Envoy:数据平面,以Sidecar的形式与服务进程运行在一起的智能代理Envoy

  • 迄今,Istio架构经历了三次重要变革

    • 2018年7月,Istio v1.0

      • 生产可用

    • 2019年3月,Istio v1.1

      • 完全分布式

    • 2020年3月,Istio v1.5

      • 回归单体

Istio v1.0 Architecture

  • 控制平面主要有三个组件

    • Pilot:控制平台核心组件

      • 管理和配置部署在Istio服务网格中的所有Envoy代理实例
      • 为Envoy Sidecar 提供服务发现、智能路由的流量管理功能(例如,A/B 测试、金丝雀推出等)和弹性(超时、重试、断路器等)
    • Citadel:身份和凭据管理等安全相关的功能,实现强大的服务到服务和最终用户身份验证
    • Mixer:遥测和策略

      • 通过内部插件接口扩展支持第三方组件

      • 插件的修改或更新,需要重新部署Mixer

  • 数据平面Envoy

    • 基于sidecar模式同网格中的每个服务实例一同部署
    • 拦截服务流量,强制执行控制平面中定义的策略,并收集遥测数据

Istio v1.0 系统组件的工作逻辑

  • Sidecar模式运行的Envoy根据控制平面组件Pilot定义配置略来决定如何路由流量
  • 遥测功能都由Mixer来完成

    • 响应来自数据平面的查询,包括授权、访问控制和配额等

    • 收集流量指标、日志和追踪数据等

    • 根据启用的适配器,将收集的数据存储至相应适配器的后端

  • Citadel

    • 帮助用户基于服务身份(而非网络控制机制)构建零信任的安全网络环境

    • 密钥管理

Istio v1.1 Architecture

  • Mixer
    • 将插件模型替换为使用进程外的Adapter进行扩展

      • 性能表现更差
    • 完成了Mixer与扩展间的解耦
  • Galley

    • Pilot中适配底层平台的功能独立成的组件

    • 是Istio的配置验证、摄取、处理和分发组件

    • 负责将其余的 Istio 组件与从底层平台(例如kubernetes)获取用户配置的细节隔离开来,从而将ilot与底层平台进行解耦

Istio v1.5 Architecture

  • 回归单体

    • 抛弃影响性的Mixer,遥测功能交Envoy完成

    • 将Pilot、Citadel、Galley和Sidecar Injection整合为一个单体应用istiod

  • Istiod

    • Istiod充当控制平面,将配置分发到所有Sidecar代理和网关
    • 它能够为支持网格的应用实现智能化的负载均衡机制,且相关流量绕过了kube

Pilot功能简介

  • Pilot管理和配置部署在Istio服务网格中的所有Envoy代理实例,是Istio控制平面的核心组件
    • 它主要由Platform Adapter、Abstract Model、Envoy API (xDS)和Rules API四个组件构成;
      • 平台适配器:负责适配底层平台,并完成从平台特有的服务模型到Istio服务模型的转换;
      • 抽象聚合层:聚合底层不同平台的服务和配置规则并对上提供统一的接口,从而解耦Envoy API和底层平台;
      • Envoy API:Pilot通过xDS服务器提供服务发现接口xDS API,而xDS服务器接收并维护Envoy代理的连接,并基于Envoy订阅的资源名称进行配置分发;
      • Rules API:高级流量管理规则的API接口,用户通过该API配置流量管理规则并由其转换为低级配置,而后通过discovery API分发到Envoy实例;
  • Pilot功能
    • 服务发现
    • 配置sidecar
    • 流量治理
      • A/B testing
      • Failover
      • Fault Injection
      • Canary rollout
      • Circuit breaker
      • Retries
      • Timeouts

Citadel功能简介

  • Citadel是Istio控制平面的核心安全组件,负责服务的私钥和数字证书管理,用于提供自动生成、分发、轮换及撤销私钥和数据证书的功能;
    • Kubernetes平台上,Citadel的传统工作方式是基于Secret资源将证书及私钥注入到Sidecar容器中;

    • 非容器环境中,首先通过系统上运行的Node Agent生成CSR,而后向Citadel发起证书签署请求,并将接收到的证书和私钥存储于本地文件系统提供给Envoy使用;
    • Istio 1.1版本起支持基于SDS API动态配置Secret给Envoy;

  • 另外,除了Istio的Citadel之外,还有Vault等其它证书和私钥管理系统可用

  • Istio的安全模型需要多个组件协同工作

    • Citadel管理私钥和数字证书

    • Sidecar和perimeter proxies执行服务间的安全通信

    • Pilot向代理分发认证策略和名称信息

Galley功能简介

  • Galley负责向Istio控制平面的其它组件提供支撑功能,它核验进入网格的配置信息的格式和内容的正确性,并将这些配置信息提供给Pilot和Mixer;
    • Galley从底层平台接收配置信息并完成分发,从而将其它组件同底层平台解耦

    • MCP(Mesh Configuration Protocol)是Istio网格中用于分发配置的传输协议

      • 基于gRPC

      • 与xDS协议类似,一次完整的MCP请求/响应流程包括请求、响应和ACK/NACK;

        • MeshConfigRequest

        • MeshConfigResponse

        • 以MeshConfigRequest形式发送的ACK或NACK

      • 目前尚不支持增量配置分发机制;

  • 从实现上来说,Galley通过Kubernetes的动态Admission Controller(Admission Hook)完成组件配置的校验;
    • 在Mutation阶段,实现对请求内容的修改,利用为服务注入Sidecar;

    • 在Validation阶段实现对请求内容进行校验,Galley对配置的校验即发生在此阶段;

  • 程序文件istio-galley

Istio Gateway

  • Istio Gateway用于将Istio功能(例如,监控和路由规则)应用于进入服务网格的流量

    • 通过将Envoy代理部署在服务之前,运维人员可以针对面向用户的服务进行A/B测试、金丝雀部署等

    • Istio Gateway不同于Kubernetes Ingress

    • 类似地,有必要时,也可以部署专用的Egress Gateway,运维人员可以为这些服务添加超时控制、重试、断路器等功能,同时还能从服务连接中获取各种细节指标
  • 程序文件istio-ingressgateway和istio-egressgateway

Istio Sidecar Injector

  • Istio服务网格中的每个Pod都必须伴随一个Istio兼容的Sidecar一同运行,常用的将Sidecar注入Pod中的方法有两种
    • 手工注入:使用istioctl客户端工具进行注入

    • 自动注入:使用Istio sidecar injector自动完成注入过程

      • 利用Kubernets webhook实现sidecar的自动注入

      • 创建Pod时自动注入过程发生在Admission Controller的Mutation阶段,根据自动注入配置,kube-apiserver拦截到Pod创建请求时调用自动注入服务istio-sidecar-injector生成Sidecar容器的描述并将其插入到Pod的配置清单中

Istio可视化组件Kiali

  • Kiali基于go语言开发,由两个组件构成

    • Kiali front-end:Web UI,查询后端并展示给用户

    • Kiali back-end:后端应用,负责与Istio组件通信,检索和处理数据并公开给前端组件
  • Kiali依赖于Kubernetes和Istio提供的外部服务和组件
    • prometheus:查询Prometheus中的指标数据来生成网格拓扑、显示指标、生成健康状况以及可能存在的问题等
    • Cluster API:获取和解析服务网格的配置

    • Jaeger:查询和展示追踪数据,前提是Istio需要开启追踪功能
    • Grafana:调用Grafana展示指标数据

  • Kiali 提供的功能

    • 服务拓扑图

    • 分布式跟踪

    • 指标度量收集和图标

    • 配置校验

    • 健康检查和显示

基于Kubernetes CRD描述规则

  • Istio的所有路由规则和控制策略都基于Kubernetes CRD实现,于是,其各种配置策略的定义也都保存于kube-apiserver后端的存储etcd中;
    • 这意味着kube-apiserver也就是Istio的APIServer

    • Galley负责从kube-apiserver加载配置并进行分发

  • Istio提供了许多的CRD,它们大体可分为如下几类

    • Network相关:实现流量治理,例如VirtualService、DestinationRule、Gateway、ServiceEntry、Sidecar和EnvoyFilter等,它们都由Pilot使用;
    • Security:

      • 认证策略:Policy;

      • 授权策略:Rule;

Istio 1.15.1 性能总结

Istio 负载测试网格包含了 1000 个服务和 2000 个 sidecar,全网格范围内,QPS 为 70,000。 在使用 Istio 1.15.1 运行测试后,我们得到了如下结果:

  • 通过代理的 QPS 有 1000 时,Envoy 使用了 0.5 vCPU 和 50 MB 内存
  • 网格总的 QPS 为 1000 时,istio-telemetry 服务使用了 0.6 vCPU
  • Pilot 使用了 1 vCPU 和 1.5 GB 内存。
  • 90% 的情况 Envoy 代理只增加了 6.3 ms 的延迟。

Istio的功能及其相关实现组件

  • Istio提供了如下开箱即用(Out Of The Box)的功能

    • Service Discovery / Load Balancing → ServicEntry + DestinationRule

    • Secure service-to-service communication (mTLS) → DestinationRule

    • Traffic control / shaping / shifting → VirtualService

    • Policy / Intention based access control → AuthorizationPolicy

    • Traffic metric collection → (built in)

  • 以下功能不能做到OOTB,在一定程度上,依赖用户自行定义

    • Cross-cluster Networking → EnvoyFilter + ServiceEntry + Gateway

    • External Auth / Rate Limiting → EnvoyFilter

    • Traffic Failover → EnvoyFilter

    • WASM Filters → EnvoyFilter

    • Access Logging / many unexposed Envoy features → EnvoyFilter + ?

参考文档

https://istio.io/latest/docs/

https://github.com/Istio

posted @ 2022-10-09 17:57  小吉猫  阅读(162)  评论(0编辑  收藏  举报