前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Istio Ambient 模式流量管理实现机制详解(三)

Istio Ambient 模式流量管理实现机制详解(三)

作者头像
赵化冰
发布于 2022-10-31 02:30:34
发布于 2022-10-31 02:30:34
50700
代码可运行
举报
运行总次数:0
代码可运行

本文将继续介绍 ambient 模式下四层流量处理的实现机制。本文将以 bookinfo 应用中 productpage 访问 reviews 的请求路径为例进行分析,以理清一个请求从 client 端发出到 server 端处理的完整流程。

reviews 有三个版本的 deployment,我们首先为 v1 和 v2 设置反亲和和亲和规则,以确保 reviews v1 和 productpage 部署在同一个 node 上,reviews v2 和 productpage 部署在不同 node 上,以分析 client 和 server 分别处于相同 node 和不同 node 中这 两种情况。

reviews v1 的反亲和设置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: reviews-v1
......
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - productpage
            topologyKey: kubernetes.io/hostname

reviews v2 的亲和设置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: reviews-v2
......
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - productpage
            topologyKey: kubernetes.io/hostname

运用上面的设置后,可以看到 productpage 和 reviews-v2 被调度到了 ambient-worker2 上,而 reviews-v1 被调度到了 ambient-worker 上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~ k get pod -ocustom-columns=NAME:.metadata.name,IP:.status.podIP,NODE:.spec.nodeName
NAME                              IP            NODE
details-v1-76778d6644-lm8q8       10.244.1.10   ambient-worker
productpage-v1-7c548b785b-mhjm6   10.244.2.3    ambient-worker2
ratings-v1-85c74b6cb4-t4pq6       10.244.2.2    ambient-worker2
reviews-v1-67f5987496-7z5ts       10.244.1.23   ambient-worker
reviews-v2-c9f46564b-vt78n        10.244.2.23   ambient-worker2
reviews-v3-75f494fccb-vm2pv       10.244.2.22   ambient-worker2

查看 reviews service IP。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~ k get svc|grep reviews
reviews       ClusterIP   10.96.183.192   <none>        9080/TCP   39d

从上面的命令行输出可以看到 productpage pod IP 是 10.244.2.3,reviews service IP 是 10.96.183.192 。我们需要关注这两个 IP 地址,因为他们将会被用到 Outbound Listener 的匹配条件中。

Outbound 流量处理

当应用 pod 发出的请求被拦截后,会通过 TPROXY 发送到 ztunnel 的 15001 端口。如下图所示:

ambient 模式 outbound 流量劫持(ptp 网络)

备注:如果想要详细了解 outbound 流量拦截的机制,可以参考本系列中第二篇的 outbound 流量劫持 部分的内容。

ztunnel 采用了 Envoy Internal Listener 机制来创建一个 HTTP CONNECT 隧道,通过该隧道对 outbound 流量进行加密传输。该机制采用了两层 Listener 来对 outbound 流量进行处理,分别是对外接收请求的 Outbound Listener,以及和 server 端创建 HTTP CONNECT 隧道的 Internal Listener。

备注:如果想要了解 HTTP CONNECT 隧道的原理和 Envoy Internal Listener 机制,可以参考本系列的第一篇文章 HBONE 隧道原理

Outbound Listener

通过下面的命令可以查看 Outbound Listener 的配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~ k -n istio-system exec ztunnel-gzlxs curl "127.0.0.1:15000/config_dump"|fx 'x.configs[2].dynamic_listeners[0]'|fx

从下图中的命令行输出可以看到,ztunnel 在 15001 上创建了一个名为 “ztunnel_outbound” 的 listener,该 listener 中 filter_chain_matcher 提供了一个树状的匹配规则,该匹配规则的逻辑如下:

  1. 通过源 IP 匹配 productpage 的 pod ip (source-ip:10.244.2.3)
  2. 通过目的 IP 匹配 reviews 的 service IP (ip:10.196.183.192)
  3. 通过目的 Port 匹配 reviews 的 service port (port:9080)

匹配的 action 即为 Listener 中选中的 filter chain 的名称,即 spiffe://cluster.local/ns/default/sa/bookinfo-productpage_to_http_reviews.default.svc.cluster.local_outbound_internal

查看该 filter chain 的配置,可以看到其中配置了一个 TCP Proxy filter,对应的 cluster 是和 filter chain 同名的 spiffe://cluster.local/ns/default/sa/bookinfo-productpage_to_http_reviews.default.svc.cluster.local_outbound_internal.local_outbound_internal

ztunnel outbound listener 配置

需要注意的是,ztunnel_outbound listener 中还配置了一个 Original Source Listener Filter,这表示 Envoy 在和 upstream cluster 建立连接时将使用 downstream 请求的原始源地址,而不是使用 ztunnel 自身的 IP 地址。在本例中,ztunnel 在转发 productpage 向 reviews 发起的请求时,会采用 productpage 的 pod IP 10.244.2.3 作为源地址。

通过下面的命令可以查看 spiffe://cluster.local/ns/default/sa/bookinfo-productpage_to_http_reviews.default.svc.cluster.local_outbound_internal 这个 cluster 的定义。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~ k -n istio-system exec ztunnel-gzlxs curl "127.0.0.1:15000/config_dump"|fx 'x.configs[1].dynamic_active_clusters'|fx

通过下面的命令查看该 cluster 中的 endpoint:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~ k -n istio-system exec ztunnel-gzlxs curl "127.0.0.1:15000/config_dump?include_eds"|fx 'x.configs[2]'.dynamic_endpoint_configs|fx

可以看到有三个 endpoint,endpoint 的地址类型是 Envoy Internal Listener。endpoint 对应的 internal listener 是 outbound_tunnel_lis_spiffe://cluster.local/ns/default/sa/bookinfo-productpage。三个 endpoint 中设置的 endpoint_id 分别是 reviews-v1,reviews-v2 和 reviews-v3 三个 pod 的 IP。 在转发请求时,envoy 会根据负载均衡算法选择一个 endpoint。

endpoint 中设置了下面的 filter_metadata,这些 metadata 将被 Internal Listener 用于和 server 端创建 HTTP CONNECT 隧道。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"metadata": {
  "filter_metadata": {
    "tunnel": {
      "destination": "10.244.1.23:9080",
      "address": "10.244.1.23:15008"
    },
    "envoy.transport_socket_match": {
      "tunnel": "h2"
    }
  }
}

Internal Listener

Internal Listener 中采用了一个 TCP Proxy 来创建隧道,并将请求通过该隧道转发到选定的 endpoint (由 endpoint 配置中 Envoy Interanl Addressendpoint_id 指定)。TCP Proxy 中的 tunneling_config 表明该 TCP Proxy 将创建一个 HTTP CONNECT 隧道。

ztunnel outbound internal listener 配置

在 Internal Listener 中,我们需要重点关注下面几个配置:

  • set_dst_address 这个 listener filter 会将 endpoint 的 filter_metada 中的 tunnel::address 值取出来,放到 filter state 的 envoy.network.transport_socket.original_dst_address 中,作为创建隧道时的目的地址。假如选中的 endpoint 为 “10.244.1.23”,则会采用 "10.244.1.23:15008 作为创建隧道时的目的地址。同时,由于ztunnel_outbound listener 中还配置了一个 Original Source Listener Filter,因此 ztunnel 创建的隧道的 TCP 连接为 (productpage pod IP:随机端口 –> reviews pod IP:15008)。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"listener_filters": [
  {
    "name": "set_dst_address",
    "typed_config": {
      "@type": "type.googleapis.com/xds.type.v3.TypedStruct",
      "type_url": "type.googleapis.com/istio.set_internal_dst_address.v1.Config",
      "value": {}
    }
  }
],
  • 为了 server 端能从隧道中拿到原始的请求地址,tunneling_config 中将 HTTP CONNECT header 中的 host 字段设置值为 %DYNAMIC_METADATA(tunnel:destination)%,即从 filter 的 metadata 中取出 tunnel::destination 这个 key 的值作为 host。该 metadata 来自于前面 endpoint 中的配置,其取值为 pod IP: service port。假设 envoy 选中 endpoint_id 为 10.244.1.23:9080 这个 endpoint,从上面 endpoint 的配置中可以看到,其 host 则为 10.244.1.23:9080 。配置中还为 HTTP CONNECT 请求增加了一个 x-envoy-original-dst-host header,取值和 host 相同。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"tunneling_config": {
  "hostname": "%DYNAMIC_METADATA(tunnel:destination)%",
  "headers_to_add": [
    {
      "header": {
        "key": "x-envoy-original-dst-host",
        "value": "%DYNAMIC_METADATA([\"tunnel\", \"destination\"])%"
      }
    }
  ]
}

Internal Listener 中 TCP Proxy 指定的 Cluster outbound_tunnel_clus_spiffe://cluster.local/ns/default/sa/bookinfo-productpage 的配置如下。可以看到其类型为 ORIGINAL_DST,会使用前面 internal listener 中 set_dst_address listener filter 设置的 pod IP: 15008 来和 server 端创建连接。

该 Cluster 中设置了 tls 的 SDS 配置,采用下面的命令可以看到该 SDS 包含了 productpage 的客户端证书,以及验证服务器身份使用的根证书。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~ k -n istio-system exec ztunnel-gzlxs curl "127.0.0.1:15000/config_dump?include_eds"|fx 'x.configs[6]'|fx

Outbound 处理总览

通过对 ztunnel 配置的分析,我们可以看到,在 ztunnel 中,Outbound 方向流量的处理过程如下:

  1. ztunnel_outbound listener 在 15001 端口接收 pod 上劫持后通过 TPROXY 转发到 ztunnel 的出向流量。
    1. ztunnel_outbound 的 filter_chain_matcher 中的 match 条件选中 spiffe://cluster.local/ns/default/sa/bookinfo-productpage_to_http_reviews.default.svc.cluster.local_outbound_internal.local_outbound_internal filter chain。
    2. spiffe://cluster.local/ns/default/sa/bookinfo-productpage_to_http_reviews.default.svc.cluster.local_outbound_internal.local_outbound_internal filter chain 中配置 的 tcp_proxy 对应的 cluster 为 spiffe://cluster.local/ns/default/sa/bookinfo-productpage_to_http_reviews.default.svc.cluster.local_outbound_internal
    3. spiffe://cluster.local/ns/default/sa/bookinfo-productpage_to_http_reviews.default.svc.cluster.local_outbound_internal cluster 中有三个 endpoint,endpoint 对应的是 Internal Listener outbound_tunnel_lis_spiffe://cluster.local/ns/default/sa/bookinfo-productpage。endpoint 往 filter_metata 中设置了请求的隧道目的地址(reviews pod IP:15008)和真实目的地址(reviews pod IP:9080)。
  2. 请求转发到 Internal Listener 后的处理。
    1. set_dst_address 这个 listener filter 将 filter_metada 中的 tunnel::address 值取出来,放到 filter state 的 envoy.network.transport_socket.original_dst_address 中,作为创建隧道时的目的地址(reviews pod IP:15008),并将真实的目的地址(reviews pod IP:9080)放到 host,和 x-envoy-original-dst-host 这个 header 中,以便于 server 端从隧道取出请求后转发到真实目的地。
    2. outbound_tunnel_lis_spiffe://cluster.local/ns/default/sa/bookinfo-productpage 中配置了一个 tcp_proxy,该 tcp_proxy 被设置为采用 HTTP 隧道转发请求。
    3. tcp_proxy 中设置的 cluster 为 outbound_tunnel_clus_spiffe://cluster.local/ns/default/sa/bookinfo-productpage。该 cluster 的类型为 ORIGINAL_DST,即采用 envoy.network.transport_socket.original_dst_address 中的地址(reviews pod IP:15008)作为目的地址创建 TCP 连接。

ztunnel outbound 流量处理

Inbound 流量处理

未完待续 …

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Istio Ambient 模式流量管理实现机制详解(三)
本文将继续介绍 ambient 模式下四层流量处理的实现机制。本文将以 bookinfo 应用中 productpage 访问 reviews 的请求路径为例来分析一个请求从 client 端发出到 server 端处理的四层流量处理流程。
赵化冰
2023/02/25
3480
Istio Ambient 模式流量管理实现机制详解(三)
初探 Istio Ambient 模式
Ambient 是 Istio 刚刚宣布支持的一种新的数据面模式,在本篇文章中,我们将尝试安装 Istio 的 ambient 模式,并采用 bookinfo demo 来体验 ambient 提供的 L4 和 L7 能力。
赵化冰
2022/09/28
7860
初探 Istio Ambient 模式
Try out Istio Ambient mode
Ambient is a new data-plane model that Istio has just announced support for. In this post, we will try to install Istio’s ambient model and use the bookinfo demo to experience the L4 and L7 capabilities offered by ambient.
赵化冰
2022/09/28
2620
Try out Istio Ambient mode
Istio流量管理实现机制深度解析-基于1.4.0更新
基于1.4.0更新,和最新版本1.6.0的架构基本相同,具有较大参考价值。 目录 前言 Pilot高层架构 统一的服务模型 标准数据面 API 业务DSL语言 Istio流量管理相关组件 控制面组件 数据面组件 命令行工具 数据面标准API 基本概念和术语 XDS服务接口 XDS服务接口的最终一致性考虑 ADS聚合发现服务 Bookinfo 示例程序分析 Bookinfo程序结构 xDS接口调试方法 Envoy启动过程分析 Envoy配置分析 Bookinfo端到端调用分析 小结 参考资料 前言 Is
腾讯云原生
2020/09/10
1.3K1
Istio Ambient 模式流量管理实现机制详解(一)
Istio ambient 模式采用了被称为 HBONE 的方式来连接 ztunnel 和 waypoint proxy。HBONE 是 HTTP-Based Overlay Network Environment 的缩写。虽然该名称是第一次看到,其实 HBONE 并不是 Istio 创建出来的一个新协议,而只是利用了 HTTP 协议标准提供的隧道能力。简单地说,ambient 模式采用了 HTTP 的 CONNECT 方法 在 ztunnel 和 waypoint proxy 创建了一个隧道,通过该隧道来传输数据。本文将分析 HBONE 的实现机制和原理。
赵化冰
2022/10/04
7080
Istio Ambient 模式流量管理实现机制详解(一)
Istio的流量管理(实操一)(istio 系列三)
使用官方的Bookinfo应用进行测试。涵盖官方文档Traffic Management章节中的请求路由,故障注入,流量迁移,TCP流量迁移,请求超时,熔断处理和流量镜像。不含ingress和Egree,后续再补充。
charlieroro
2020/05/20
8330
Istio流量管理之请求路由分析
前面我们了解了 Gateway 和 VirtualService 资源对象的作用,以及它们是如何影响 Envoy 的配置的,那么这些资源对象又是如何影响流量的呢?通过 Istio 如何实现流量管理的呢?
我是阳明
2023/11/09
4780
Istio流量管理之请求路由分析
Istio的运维-诊断工具(istio 系列五)
在参考官方文档的时候发现环境偶尔会出现问题,因此插入一章与调试有关的内容,便于简单问题的定位。涵盖官方文档的诊断工具章节
charlieroro
2020/06/11
2.9K0
Istio Envoy 配置解读
前面我们创建了一个 Gateway 和 VirtualService 对象,用来对外暴露应用,然后我们就可以通过 ingressgateway 来访问 Bookinfo 应用了。那么这两个资源对象是如何实现的呢?
我是阳明
2023/11/06
7900
Istio Envoy 配置解读
Istio 使用 Gateway API 实现流量管理
Gateway API 是由 SIG-NETWORK 社区管理的开源项目,项目地址:https://gateway-api.sigs.k8s.io/。主要原因是 Ingress 资源对象不能很好的满足网络需求,很多场景下 Ingress 控制器都需要通过定义 annotations 或者 crd 来进行功能扩展,这对于使用标准和支持是非常不利的,新推出的 Gateway API 旨在通过可扩展的面向角色的接口来增强服务网络。
我是阳明
2023/12/26
6800
Istio 使用 Gateway API 实现流量管理
Istio从A到Y
Istio 是一款开源服务网格,允许您连接、保护、控制和观察应用程序的服务。我们将了解如何安装 Istio,以及如何使用它来保护和监控我们的服务。
云云众生s
2024/07/21
4690
Istio从A到Y
Istio Ambient 模式 HBONE 隧道原理详解
Istio ambient 模式采用了被称为 HBONE 的方式来连接 ztunnel 和 waypoint proxy。HBONE 是 HTTP-Based Overlay Network Environment 的缩写。简单地说,ambient 模式采用了 HTTP CONNECT 方法 在 ztunnel 和 waypoint proxy 创建了一个隧道,通过该隧道来传输数据。本文将分析 HBONE 的实现机制和原理。
赵化冰
2022/09/28
7470
Istio Ambient 模式 HBONE 隧道原理详解
Istio: 服务网格领域的新王者
Istio 是当前 Service Mesh 领域最完善的解决方案,同源自 kubernetes 项目团队。
钟华
2019/02/12
4.4K0
Istio Ambient 模式流量管理实现机制详解(二)
ambient 模式中,所有 pod 通过 node 上的 ztunnel 之间创建的安全通道进行通信,如下图所示:
赵化冰
2022/10/04
5580
Istio Ambient 模式流量管理实现机制详解(二)
Istio 安全设置笔记
Istio 为网格中的微服务提供了较为完善的安全加固功能,在不影响代码的前提下,可以从多个角度提供安全支撑,官方文档做了较为详细的介绍,但是也比较破碎,这里尝试做个简介兼索引,实现过程还是要根据官方文档进行。
崔秀龙
2019/07/23
8620
Istio安全-授权(实操三)
部署Bookinfo。由于下例在策略中使用了principal和namespace,因此需要启用mutual TLS。
charlieroro
2020/09/03
1.4K0
Service Mesh - Istio流量控制篇(下)
部署 httpbin 服务,同样,官方demo已经提供了该配置文件,执行如下命令应用即可:
端碗吹水
2020/12/23
1K0
Service Mesh - Istio流量控制篇(下)
10个 Istio 流量管理 最常用的例子,你知道几个?
为了方便理解,以Istio官方提供的Bookinfo应用示例为例,引出 Istio 流量管理的常用例子。
万猫学社
2022/12/01
3960
10个 Istio 流量管理 最常用的例子,你知道几个?
Istio 入门(五):访问控制和流量管理
主要演示了使用 Istio Gateway、VirtualService 对外暴露服务的访问地址 ,以及基于 Istio 实现可观察性的 Kiali 组件。让我们回在上一章中部署的 bookinfo 示例已经学习了什么:
痴者工良
2023/07/24
9610
Istio 入门(五):访问控制和流量管理
如何降低Istio服务网格中Envoy的内存开销?
在Istio服务网格中,每个Envoy占用的内存也许并不算多,但所有sidecar增加的内存累积起来则是一个不小的数字。在进行商用部署时,我们需要考虑如何优化并减少服务网格带来的额外内存消耗。
CNCF
2019/12/04
2K0
推荐阅读
相关推荐
Istio Ambient 模式流量管理实现机制详解(三)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档