1、背景

Istio 默认支持代理所有 TCP 流量。包括 HTTP、HTTPS、gRPC 以及原始 TCP 协议。但为了提供额外的能力,比如路由和丰富的指标,必须确定协议。协议可以被自动检测或者手动声明。

使用非基于 TCP 的协议时,如 UDP,不会被 Istio 代理拦截,可以继续正常工作。但是不能在仅代理的组件中使用,如 Ingress 或 Egress Gateway。

2、协议选择

2.1 自动协议选择

istio 需要知道服务提供什么七层协议,从而来为其配置相应协议的 filter chain,通常最好是显式声明协议,如果没有声明,istio 会自动探测,这个探测能力比较有限(可以自动检测出 HTTP 和 HTTP/2 流量),如果未自动检测出协议,流量将会视为普通 TCP 流量。

2.2 手动协议选择

协议可以在 Service 定义中手动指定。

可以通过以下两种方式配置:

  • 通过端口名称配置:name: <protocol>[-<suffix>]
  • 在版本 1.18+ 的Kubernetes,通过 appProtocol 字段配置:appProtocol: <protocol>

支持以下协议:

协议 边车用途 网关目的
http 明文 HTTP/1.1 流量 明文 HTTP(1.1 或 2)流量
http2 明文 HTTP/2 流量 明文 HTTP(1.1 或 2)流量
https TLS 加密数据。因为 Sidecar 不会解密 TLS 流量,所以这与tls TLS 加密 HTTP(1.1 或 2)流量
tcp 不透明的TCP数据流 不透明的TCP数据流
tls TLS 加密数据 TLS 加密数据
grpc,grpc-web 与...一样http2 与...一样http2
mongomysql,redis 实验应用协议支持。要启用它们,请配置相应的 Pilot环境变量。如果未启用,则视为不透明 TCP 数据流 实验应用协议支持。要启用它们,请配置相应的 Pilot环境变量。如果未启用,则视为不透明 TCP 数据流

注意 1:网关的行为在某些情况下会有所不同,因为网关可以终止 TLS 并且可以协商协议。

2.2.1 方式一:使用服务端口名称时指定协议类型

在 Service 的 ports 中,port 的 name 需设置为 {协议名称}或{协议名称}-{自定义后缀}。例如:服务的 9090 端口是 gRPC 协议类型,可以设置 port 的 name 为 grpc-demo;服务的 3306 端口是 MySQL 数据库协议,可以设置 port 的 name 为 mysql。

YAML 示例如下:

kind: Service
metadata:
name: svc-v1
spec:
ports:
- port: 9090
name: grpc-demo # 指定该端口提供 grpc 协议的服务
- port: 3306
name: mysql    # 指定该端口提供 mysql 协议的服务

2.2.2 方式二:使用服务端口的appProtocol指定协议类型

可以使用 Service 的 appProtocol 指定协议类型。

指定协议类型为 HTTPS 的 YAML 示例如下:

kind: Service
metadata:
name: svc-v2
spec:
ports:
-port: 3306
name: database
appProtocol: https # 指定该端口提供 https 协议的服务

注意 1:ports.appProtocol 的生效优先级高于 ports.name

3、HTTP网关协议选择

与 sidecar 不同,网关默认无法自动检测将请求转发到后端服务时使用的特定 HTTP 协议。因此,除非使用显式协议选择来指定 HTTP/1.1 ( http) 或 HTTP/2 (http2grpc),否则网关将使用 HTTP/1.1 转发所有传入 HTTP 请求。

您可以通过设置服务选项来指示网关使用与传入请求相同的协议来转发请求,而不是使用显式协议选择useClientProtocol。但请注意,将此选项与不支持 HTTP/2 的服务一起使用可能存在风险,因为 HTTPS 网关始终通告对 HTTP/1.1 和 HTTP/2 的支持。因此,即使后端服务不支持 HTTP/2,现代客户端也会认为它支持并经常选择使用它。

参考:协议选择

Istio 为服务指定协议的更多相关文章

  1. 低功耗蓝牙4.0BLE编程-nrf51822开发(7)-SDP服务发现协议

    SDP的全称是Service Discovery Protocol,中文是服务发现协议.SDP(服务发现协议)是蓝牙协议体系中的核心协议,是蓝牙系统重要组成部分,是所有用户模式的基础.在蓝牙系统中.客 ...

  2. 老李推荐:第4章3节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览

    老李推荐:第4章3节<MonkeyRunner源码剖析>ADB协议及服务: ADB协议概览   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试, ...

  3. Service-Level Agreement (服务水平协议)

    Service-Level Agreement (服务水平协议) SLA是为负载测试场景定义的具体目标.例如,评测脚本中任意数量事务的平均响应时间,可以定义具体的目标或阈值.测试运行结束之后,Load ...

  4. 蓝牙—服务发现协议(SDP)

    服务搜索协议(SDP)提供了应用发现可用服务以及确定可用服务特点的方法.SDP发现协议提供下面的能力 <1>为客户提供搜索所需要服务的能力. <2>允许基于服务类型搜索服务 & ...

  5. 老李推荐:第4章1节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览 1

    老李推荐:第4章1节<MonkeyRunner源码剖析>ADB协议及服务: ADB协议概览   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试, ...

  6. LoadRunner服务水平协议SLA

    服务水平协议 (或称 SLA)是以插入的事务为设置对象来为负载测试场景定义的具体目标. Analysis 将这些目标与 LoadRunner在运行过程中收集和存储的性能相关数据进行比较,然后确定目标的 ...

  7. 为运行Microsoft Dynamics CRM 异步处理服务指定账户没有性能计数器权限

    CRM 2016 安装 为运行Microsoft Dynamics CRM 应用程序指定账户没有性能计数器权限 为运行Microsoft Dynamics CRM 异步处理服务指定账户没有性能计数器权 ...

  8. 服务级别协议(SLA)与运行水平协议(OLA)

    服务级别协议(SLA)与运行水平协议(OLA): 服务级别管理和服务级别协议在国内已被广泛接受并成用.本文试图讨论服务级别协议(SLA)和运行水平协议(OLA)的异同. 1. SLA a.定义 服务级 ...

  9. 第4章3节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览SYNC.TXT翻译参考(原创)

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...

  10. 第4章1节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览OVERVIEW.TXT翻译参考(原创)

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...

随机推荐

  1. CF 下分记录

    7.27 edu152 \(+173=2048\) B 没细看数据范围 WA 了一次 D 没判 \(i-1=0\) WA 了一次 E. Max to the Right of Min 考虑增大右端点, ...

  2. Django框架——Django与Ajax、分页器

    文章目录 1 Django与Ajax 一 什么是Ajax 优点: 二 基于jquery的Ajax实现 Ajax-->服务器-->Ajax执行流程图 三 案例 一 通过Ajax,实现前端输入 ...

  3. 11g GI监听测试增加其他本地端口

    11.2 GI中监听器的地址和端口信息被移到了 endpoints_listener.ora中. 使用 endpoints_listener.ora的情况下不应使用lsnrctl管理LISTENER, ...

  4. IEDA-Maven项目开发步骤

    1. 打开IDEA 界面,选择"New Project" 2. 输入项目名称和基本信息 输入项目名称.选择存放路径.JDK版本.以及GroupId.ArtifactId. Grou ...

  5. Java进程(基础)

    基本概念 1.进程:程序的执行过程 2.线程:一个进程可以有单个线程也就是我们说的单线程,还可以有多个线程也就是我们说的多线程, 线程 1.当一个类继承了Thread类就可以当成一个线程用 2.我们会 ...

  6. 特殊符号传到后端发生变异 &amp; &quot;&lt;&gt;

    业务遇到bug,前端传回数据 & ,到后台接收到的数据就是 & 后台接收到的数据就携带了amp;的后缀 网上查找原因,大部分说法是前端传回的数据导致,但是实际并不是,这里是框架的正则过 ...

  7. JAVA异常的不正确处理方式

    最近收到一个求助信息,异常堆栈如下: ``` java.lang.RuntimeException: FF1C1005 at test_ssh.sftp.Pool.get(Pool.java:25) ...

  8. vue element ui 组件使用 -form 表单

    表单验证rules 绑定是规则 也可以自定义规则,:model是表单的数据源 el-form-item 标签里面prop的名字要和数据源的名字一致,才能验证生效 ;提交时调用this.$refs[fo ...

  9. 【Windows 开发环境配置】NVIDIA 篇

    CUDA 从CUDA Toolkit Archive下载相应版本的离线安装包,这里以11.7为例. 打开安装包,在安装选项选择自定义模式,点击下一步. 在自定义安装选项中,仅选择CUDA组件(其中Ns ...

  10. require()、import、import()有哪些区别?

    require().import.import()是我们常用的引入模块的三种方式,代码中几乎处处用到.如果对它们存在模糊,就会在工作过程中不断产生困惑,更无法做到对它们的使用挥洒自如.今天我们来一起捋 ...