<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Istio on Yeqown</title>
    <link>https://www.yeqown.xyz/tags/istio/</link>
    <description>Recent content in Istio on Yeqown</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    <lastBuildDate>Thu, 08 May 2025 09:35:14 +0800</lastBuildDate>
    <atom:link href="https://www.yeqown.xyz/tags/istio/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>在 Kubernetes 中实现 gRPC 流量的镜像和对比</title>
      <link>https://www.yeqown.xyz/2025/05/08/%E5%9C%A8-Kubernetes%E4%B8%AD%E5%AE%9E%E7%8E%B0gRPC%E6%B5%81%E9%87%8F%E9%95%9C%E5%83%8F/</link>
      <pubDate>Thu, 08 May 2025 09:35:14 +0800</pubDate>
      <guid>https://www.yeqown.xyz/2025/05/08/%E5%9C%A8-Kubernetes%E4%B8%AD%E5%AE%9E%E7%8E%B0gRPC%E6%B5%81%E9%87%8F%E9%95%9C%E5%83%8F/</guid>
      <description>&lt;p&gt;本文主要解决在服务重构过程中如何保证新旧服务行为一致性的问题。&lt;/p&gt;&#xA;&lt;h2 id=&#34;场景描述&#34;&gt;场景描述&lt;a class=&#34;anchor&#34; href=&#34;#%e5%9c%ba%e6%99%af%e6%8f%8f%e8%bf%b0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;现有一个 python 开发的 gRPC 微服务提供了一些 &lt;strong&gt;数据查询&lt;/strong&gt; 接口 供 上层应用使用，随着业务流量的增加运维这个服务的成本也逐渐增加，为了降低运维成本和提高性能 (木有擅长 python 高性能的开发)，因此选择了使用 go 语言对这个服务进行重写。在开发完成之后，需要对新服务的 gRPC 接口进行验证。&lt;/p&gt;&#xA;&lt;p&gt;这种场景对测试开发人员来说，实在是太熟悉了吧？典型的 &lt;strong&gt;重放验证&lt;/strong&gt;，马上能想到的验证手段就是：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;如果有存量的单元测试，那么直接重新跑一遍单元测试就能快速的完成验证。&lt;/li&gt;&#xA;&lt;li&gt;没有单元测试的情况，那么可以将新服务部署起来，通过流量复制的方式将旧服务的流量复制到新服务上，然后对比两个服务的返回结果是否一致。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre class=&#34;mermaid&#34;&gt;&#xA;flowchart LR&#xA;    %% 定义布局方向和间距&#xA;    subgraph s1[&amp;#34;方案一: 单元测试验证&amp;#34;]&#xA;        direction TB&#xA;        UT[单元测试] --&amp;gt;|执行| NS1[新服务]&#xA;    end&#xA;    &#xA;    subgraph s2[&amp;#34;方案二: 流量复制验证&amp;#34;]&#xA;        direction TB&#xA;        C[客户端] --&amp;gt;|请求| OS[旧服务]&#xA;        OS --&amp;gt;|响应| C&#xA;        OS --&amp;gt;|复制流量| NS2[新服务]&#xA;        NS2 --&amp;gt;|对比响应| OS&#xA;    end&#xA;&#xA;    %% 设置布局方向和对齐方式&#xA;    s1 ~~~ s2&#xA;&lt;/pre&gt;&#xA;&lt;p&gt;但是很遗憾 😭，并没有成熟的单元测试；测试人员也都是人肉测试，对于内部服务的接口验证帮助不大，因此这里采用第二种方式进行验证。&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;服务均采用 Kubernetes 部署。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;方案介绍&#34;&gt;方案介绍&lt;a class=&#34;anchor&#34; href=&#34;#%e6%96%b9%e6%a1%88%e4%bb%8b%e7%bb%8d&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;HTTP 流量的复制重放工具就很多很成熟了，而且往往在 网关/代理 一侧就能实现流量复制甚至对比。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;工具&lt;/th&gt;&#xA;          &lt;th&gt;分类&lt;/th&gt;&#xA;          &lt;th&gt;文档链接&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Nginx mirror&lt;/td&gt;&#xA;          &lt;td&gt;网关/代理&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://nginx.org/en/docs/http/ngx_http_mirror_module.html&#34;&gt;https://nginx.org/en/docs/http/ngx_http_mirror_module.html&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;APISIX&lt;/td&gt;&#xA;          &lt;td&gt;网关/代理&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://apisix.apache.org/docs/apisix/plugins/proxy-mirror/&#34;&gt;https://apisix.apache.org/docs/apisix/plugins/proxy-mirror/&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Istio: Virtual Service mirror&lt;/td&gt;&#xA;          &lt;td&gt;Service Mesh&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://istio.io/latest/docs/tasks/traffic-management/mirroring/&#34;&gt;https://istio.io/latest/docs/tasks/traffic-management/mirroring/&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;GoReplay&lt;/td&gt;&#xA;          &lt;td&gt;流量镜像&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/buger/goreplay&#34;&gt;https://github.com/buger/goreplay&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;tcpcopy&lt;/td&gt;&#xA;          &lt;td&gt;流量镜像&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/session-replay-tools/tcpcopy&#34;&gt;https://github.com/session-replay-tools/tcpcopy&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;tcpcopy 相比于其他工具方案，虽然不能直接使用，但是其作用于 TCP 传输层，功能会更丰富。相比之下，gRPC 流量复制工具就没有那么成熟了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>近期的一些经验总结</title>
      <link>https://www.yeqown.xyz/2024/12/17/%E8%BF%91%E6%9C%9F%E7%9A%84%E4%B8%80%E4%BA%9B%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/</link>
      <pubDate>Tue, 17 Dec 2024 16:50:41 +0800</pubDate>
      <guid>https://www.yeqown.xyz/2024/12/17/%E8%BF%91%E6%9C%9F%E7%9A%84%E4%B8%80%E4%BA%9B%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/</guid>
      <description>&lt;blockquote class=&#34;book-hint info&#34;&gt;&#xA;&lt;p&gt;这里不会过多的介绍软件的相关概念和架构，主要是针对实际问题的解决方案和思考。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;问题汇总&#34;&gt;问题汇总&lt;a class=&#34;anchor&#34; href=&#34;#%e9%97%ae%e9%a2%98%e6%b1%87%e6%80%bb&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;CDC 相关&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#11-cdc-kafka-connect-mysql-sink-%e4%be%a7%e6%b6%88%e8%b4%b9%e7%a7%af%e5%8e%8b%e9%97%ae%e9%a2%98&#34;&gt;CDC kafka-connect mysql sink 侧消费积压问题&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#12-cdc-kafka-connect-mysql-source-%e4%be%a7%e5%88%a0%e9%99%a4%e4%ba%8b%e4%bb%b6%e6%8a%95%e9%80%92%e4%ba%86%e4%b8%a4%e6%9d%a1%e4%ba%8b%e4%bb%b6%e5%af%bc%e8%87%b4%e5%88%a0%e9%99%a4%e5%8a%a8%e4%bd%9c%e6%95%b0%e6%8d%ae%e9%87%8f%e8%a2%ab%e6%94%be%e5%a4%a7&#34;&gt;CDC kafka-connect mysql source 侧删除事件投递了两条事件，导致删除动作数据量被放大&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#13-cdc-kafka-connect-mongodb-%e6%95%b0%e6%8d%ae%e5%90%8c%e6%ad%a5%e4%bb%bb%e5%8a%a1%e5%bc%82%e5%b8%b8%e6%b6%88%e6%81%af%e8%b6%85%e8%bf%87-1mb-&#34;&gt;CDC kafka-connect mongodb 数据同步任务异常（消息超过 1MB ）&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;更新于: 2025-02-06&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#14-cdc-elasticsearch-sink-%e6%80%8e%e4%b9%88%e8%87%aa%e5%ae%9a%e4%b9%89%e7%b4%a2%e5%bc%95%e5%90%8d%e7%a7%b0&#34;&gt;CDC Elasticsearch sink 怎么自定义索引名称？&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#15-%e8%87%aa%e5%ae%9a%e4%b9%89-messagetimestamprouter-%e5%ae%9e%e7%8e%b0%e5%8a%a8%e6%80%81%e7%b4%a2%e5%bc%95%e5%90%8d%e7%a7%b0&#34;&gt;自定义 transform 实现自定义索引名称&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;更新于：2025-10-11&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#16-cdc-kafka-connect-mongodb-%e4%be%a7%e5%8f%8d%e5%a4%8d%e8%bf%9b%e8%a1%8c-%e5%bf%ab%e7%85%a7-%e5%af%bc%e8%87%b4%e6%95%b0%e6%8d%ae%e5%90%8c%e6%ad%a5%e5%bc%82%e5%b8%b8&#34;&gt;CDC kafka-connect mongodb 侧反复进行 “快照” 导致数据同步异常&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;更新于：2026-06-01&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#17-cdc-elasticsearch-sink-%e5%81%87%e6%80%a7%e7%9a%84%e6%b6%88%e8%b4%b9%e5%a0%86%e7%a7%af%e9%97%ae%e9%a2%98&#34;&gt;CDC Elasticsearch sink 假性的消费堆积问题&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DMS 数据同步相关&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#21-%e6%95%b0%e6%8d%ae%e8%bf%81%e7%a7%bb%e5%ae%8c%e6%88%90%e5%90%8e%e6%80%8e%e4%b9%88%e5%af%b9%e6%af%94%e6%ba%90%e6%95%b0%e6%8d%ae%e5%92%8c%e7%9b%ae%e6%a0%87%e6%95%b0%e6%8d%ae%e6%98%af%e5%90%a6%e4%b8%80%e8%87%b4&#34;&gt;数据迁移完成后，怎么对比源数据和目标数据是否一致？&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#22-%e5%a6%82%e6%9e%9c%e4%b8%8d%e4%b8%80%e8%87%b4%e6%80%8e%e4%b9%88%e5%a4%84%e7%90%86&#34;&gt;如果不一致怎么处理？&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Istio 相关&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#31-istio-%e4%b8%ad%e5%a4%9a%e4%b8%aa-gateway-%e4%bd%bf%e7%94%a8%e7%9b%b8%e5%90%8c-hostanalyze-%e6%98%af%e6%8f%90%e7%a4%ba%e9%94%99%e8%af%af&#34;&gt;Istio 中多个 gateway 使用相同 host，analyze 是提示错误&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#32-istio-%e4%b8%ad%e4%b8%80%e4%b8%aa%e6%9c%8d%e5%8a%a1%e6%8f%90%e4%be%9b%e4%ba%86%e5%a4%9a%e4%b8%aa%e7%ab%af%e5%8f%a3%e7%9a%84%e6%9c%8d%e5%8a%a1%e6%80%8e%e4%b9%88%e9%85%8d%e7%bd%ae-virtual-service-&#34;&gt;Istio 中一个服务提供了多个端口的服务，怎么配置 Virtual Service ？&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;APISIX 相关&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#41-%e4%bd%bf%e7%94%a8-apisix-%e4%bd%9c%e4%b8%ba%e7%bd%91%e5%85%b3%e6%80%8e%e4%b9%88%e8%bf%9b%e8%a1%8c%e6%9c%89%e6%9d%a1%e4%bb%b6%e7%9a%84%e5%93%8d%e5%ba%94%e9%87%8d%e5%86%99&#34;&gt;使用 APISIX 作为网关，怎么进行有条件的响应重写？&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#42-apisix-%e6%8f%92%e4%bb%b6%e7%9a%84%e6%89%a7%e8%a1%8c%e9%a1%ba%e5%ba%8f%e6%98%af%e6%80%8e%e4%b9%88%e6%a0%b7%e7%9a%84&#34;&gt;APISIX 插件的执行顺序是怎么样的？&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ShardingSphere Proxy&lt;/p&gt;</description>
    </item>
    <item>
      <title>Istio Idle Timeout问题复现和解决</title>
      <link>https://www.yeqown.xyz/2024/03/25/istio-idle-timeout%E9%97%AE%E9%A2%98%E5%A4%8D%E7%8E%B0%E5%92%8C%E8%A7%A3%E5%86%B3/</link>
      <pubDate>Mon, 25 Mar 2024 09:37:25 +0800</pubDate>
      <guid>https://www.yeqown.xyz/2024/03/25/istio-idle-timeout%E9%97%AE%E9%A2%98%E5%A4%8D%E7%8E%B0%E5%92%8C%E8%A7%A3%E5%86%B3/</guid>
      <description>&lt;h2 id=&#34;更新&#34;&gt;更新&lt;a class=&#34;anchor&#34; href=&#34;#%e6%9b%b4%e6%96%b0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;更新-2024-04-01&#34;&gt;更新 2024-04-01&lt;a class=&#34;anchor&#34; href=&#34;#%e6%9b%b4%e6%96%b0-2024-04-01&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;通过调整 tcp_proxy 的 idle_timeout 参数后，部分中间件（redis, mongo）的异常问题不再出现，但是 mysql(sharding-spere) 和 memcached 仍然存在 &amp;ldquo;invalid connection&amp;rdquo; 错误，所以还需要找到能够解决 mysql(sharding-spere) 和 memcached 的方法。&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;上述描述的现象非常主观，不一定正确也不能作为最终结论，但是 idle_timeout 配置确实没有解决所有的问题。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;这里，需要知道 istio 在 inject 时会通过 iptables 对应用的流量进行劫持，对于 outbound 的流量 iptables 规则拦截转发到 OUTPUT 链。OUTPUT 的链转发流量到 ISTIO_OUTPUT，这个链会决定服务访问外部服务的流量发往何处。&lt;/p&gt;&#xA;&lt;p&gt;这样产生的效果是，除了应用自己建立的连接之外 envoy 也会创建一个代理连接。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ netstat -notp | grep &lt;span style=&#34;color:#ae81ff&#34;&gt;3307&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tcp         &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;             172.23.105.25:41030        x.x.x.x:3307         ESTABLISHED -      off&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;0.00/0/0&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tcp         &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;             172.23.105.25:41022        x.x.x.x:3307         ESTABLISHED 1/./app      keepalive&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;0.88/0/0&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我遇到的问题可以确定问题就出在 envoy 建立的连接上，因为应用自己建立的连接是正常的，同时还可以看到应用自己的连接开启了 keepalive, 而 envoy 建立的连接没有开启。这样可能会出现这个连接会因为超时而被关闭的情况，或者其他原因导致连接被释放。那如果可以避免将中间件的流量通过 envoy 代理，这样就可以避免这个问题。&lt;/p&gt;&#xA;&lt;p&gt;在官方的文档中也提到，https://istio.io/latest/zh/docs/tasks/traffic-management/egress/egress-control/ 对于外部服务，可以通过配置 &lt;code&gt;excludeOutboundPorts&lt;/code&gt; 或者 &lt;code&gt;excludeOutboundIPRanges&lt;/code&gt; 来使得某些服务的流量不经过 istio sidecar。其背后的原理是通过 iptables 的规则中排除这些端口或者 IP 地址。&lt;/p&gt;</description>
    </item>
    <item>
      <title>在istio服务网格中扩展自定义功能</title>
      <link>https://www.yeqown.xyz/2023/11/17/%E5%9C%A8istio%E6%9C%8D%E5%8A%A1%E7%BD%91%E6%A0%BC%E4%B8%AD%E6%89%A9%E5%B1%95%E8%87%AA%E5%AE%9A%E4%B9%89%E5%8A%9F%E8%83%BD/</link>
      <pubDate>Fri, 17 Nov 2023 22:48:59 +0800</pubDate>
      <guid>https://www.yeqown.xyz/2023/11/17/%E5%9C%A8istio%E6%9C%8D%E5%8A%A1%E7%BD%91%E6%A0%BC%E4%B8%AD%E6%89%A9%E5%B1%95%E8%87%AA%E5%AE%9A%E4%B9%89%E5%8A%9F%E8%83%BD/</guid>
      <description>&lt;h3 id=&#34;前提&#34;&gt;前提&lt;a class=&#34;anchor&#34; href=&#34;#%e5%89%8d%e6%8f%90&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;本文假设你已经对 Kubernetes、istio 和 Envoy 有一定的了解，如果你还不了解，可以先阅读下面的文章：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Kubernetes: &lt;a href=&#34;https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/&#34;&gt;https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;istio: &lt;a href=&#34;https://istio.io/latest/docs/concepts/what-is-istio/&#34;&gt;https://istio.io/latest/docs/concepts/what-is-istio/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Envoy: &lt;a href=&#34;https://www.envoyproxy.io/docs/envoy/latest/intro/what_is_envoy&#34;&gt;https://www.envoyproxy.io/docs/envoy/latest/intro/what_is_envoy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;当然不仅限于知道这些，还需要对其有一定的实践经验，这样才能更好的理解本文的内容。当然本文也不会涉及太深，只是作为 istio 的一个入门扩展教程。&lt;/p&gt;&#xA;&lt;h3 id=&#34;为什么要扩展功能背景&#34;&gt;为什么要扩展功能？#背景&lt;a class=&#34;anchor&#34; href=&#34;#%e4%b8%ba%e4%bb%80%e4%b9%88%e8%a6%81%e6%89%a9%e5%b1%95%e5%8a%9f%e8%83%bd%e8%83%8c%e6%99%af&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;用通俗的话去理解 istio 的作用就是，对我们部署在 kubernetes 上的应用进行流量控制（代理），给我们提供了：流量控制、流量监控、流量安全等功能。但是在实际的使用中，我们还是会遇到一些特殊的场景，需要我们自己基于自己的业务场景去扩展一些功能，比如：ip 白名单、ip 黑名单、统一认证等。这些功能往往和具体公司的业务场景有关，因此 istio 无法直接提供这些功能，需要我们自己去扩展。&lt;/p&gt;&#xA;&lt;h4 id=&#34;传统的扩展方式&#34;&gt;传统的扩展方式&lt;a class=&#34;anchor&#34; href=&#34;#%e4%bc%a0%e7%bb%9f%e7%9a%84%e6%89%a9%e5%b1%95%e6%96%b9%e5%bc%8f&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;在传统架构中，常常通过 API 网关这一组件来实现这一些扩展能力，常用的 API 网关有：kong、apisix、openresty，而扩展的原理就是插件，或者像 nginx/openresty 在请求链中的不同阶段提供了不同的 hook，我们可以基于这些 hook 来实现扩展功能。&lt;/p&gt;&#xA;&lt;p&gt;就我个人的经历来说，网关要么自己定制开发，要么基于openresty来实现，又或者使用一些开源的网关，如：kong、apisix，在此基础上进行二次开发。不过这些方式都是在传统API网关中去实现的，随着 Service Mesh 的发展，API网关的某些功能也被 Sidecar 代理所取代，比如：流量控制、流量监控、流量安全等。目前 Mesh 发展的趋势也是进一步在 Sidecar 代理中实现更多的功能，而不是在 API 网关中实现。&lt;/p&gt;&#xA;&lt;h3 id=&#34;envoy-的扩展能力&#34;&gt;Envoy 的扩展能力&lt;a class=&#34;anchor&#34; href=&#34;#envoy-%e7%9a%84%e6%89%a9%e5%b1%95%e8%83%bd%e5%8a%9b&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.envoyproxy.io/docs/envoy/latest/extending/extending&#34;&gt;https://www.envoyproxy.io/docs/envoy/latest/extending/extending&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=XdWmm_mtVXI&#34;&gt;https://www.youtube.com/watch?v=XdWmm_mtVXI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;envoy 提供了丰富的扩展能力，Access Logger, Access Log Filter, Clusters, Listen Filter, Network Filter, HTTP Filter 等等。这一块内容非常多，如果想要了解更多，请参考官方文档。&lt;/p&gt;&#xA;&lt;h3 id=&#34;istio-的扩展能力&#34;&gt;istio 的扩展能力&lt;a class=&#34;anchor&#34; href=&#34;#istio-%e7%9a%84%e6%89%a9%e5%b1%95%e8%83%bd%e5%8a%9b&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://istio.io/latest/docs/reference/config/networking/envoy-filter/&#34;&gt;https://istio.io/latest/docs/reference/config/networking/envoy-filter/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;istio 作为一个 Service Mesh 框架，其底层的代理是 Envoy，因此 istio 也继承了 Envoy 的扩展能力。istio 提供了 EnvoyFilter 这样一种自定义 istio Pilot 生成的 Envoy 配置的机制。可以修改某些字段的值、添加特定过滤器。对于特定命名空间中的给定工作负载，可以存在任意数量的 EnvoyFilter。这些 EnvoyFilter 的应用顺序如下：配置根命名空间中的所有 EnvoyFilter，然后是工作负载命名空间中的所有匹配的 EnvoyFilter。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
