MoreRSS

site iconJimmy Song | 宋净超修改

Tetrate 布道师,云原生社区 创始人,CNCF Ambassador,云原生技术专家。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Jimmy Song | 宋净超的 RSS 预览

探索 GitHub Copilot:当 AI 成为你的贴身编码助手

2025-03-27 14:57:27

过去一年中,我一直享有 GitHub Copilot 的免费使用资格,但是由于种种原因,我并没有深入地使用它。最近看到了 GitHub 官方发布的一篇关于 Copilot 的博客《Mastering GitHub Copilot: When to use AI agent mode》,让我对如何更好地使用 Copilot 有了新的灵感和思考。

在这篇文章里,我想和大家分享一下我对 Copilot 强大功能的理解,尤其是 Copilot EditsAgent Mode 这两个模式之间的差异和使用场景。最后,我还想呼吁所有开源项目的贡献者:如果你符合条件,一定要去积极申请 Copilot 免费使用资格,让自己的开发效率更上一个台阶!

为什么你的 AI 辅助写码好像“不给力”?

大多数开发者在接触 AI 辅助编码工具(比如 GitHub Copilot)时,都会或多或少地遇到一些状况,比如:

  • 生成的代码和你所需的功能“差那么一点”;
  • 需要在多个文件间跳来跳去修改,却希望 AI 能自动帮忙“通盘考虑”。

其实,这些小挫折往往不在于工具本身,而在于你是否找对了使用方式。GitHub Copilot 内部包含多个侧重点各不相同的功能,它们各自适合在不同的情景下使用。正确地选择合适的功能,就是解锁 Copilot 真正实力的关键

Copilot Edits:快速精确的“微调”

什么时候用它?

  • 小范围的修复:修复一个函数的 bug。
  • 重构特定模块:给函数或组件做局部优化。
  • 做跨文件的一致性改动:例如统一日志打印格式,或者统一变量命名方式。

Copilot Edits 的功能就像是给你配备了一个能读懂上下文的“超级编辑器”。你可以快速发出命令,让它在有限范围内对现有代码进行改动,并在提交前查看 diff,随时保持对改动的掌控。

Agent Mode:你的“多文件大管家”

与 Copilot Edits 相比,Agent Mode 更像是一个能够宏观统筹全局的 AI 助手。它不只是在一个文件里给你提建议,更可以去你的整个项目里做深度搜索、自动找出依赖关系、创建或修改多个文件,甚至可以帮你在终端里运行命令、编译、测试项目等。

适合的使用场景

  1. 构建完整功能:如“为应用添加全局的事件跟踪”。
  2. 理解和浏览陌生项目:如“帮我搞懂这个项目里认证系统是怎么运作的”。
  3. 整合测试:如“为 UserService 写测试并确保全部通过”。
  4. 需要运行大量终端操作:如“创建新的 React + TS + Redux + styled-components 项目”。
  5. 复杂的重构:如“统一替换所有 API 调用并加入新的错误处理逻辑”。

我在个人网站上的应用场景

博主(也就是我)在给个人网站的 GitHub Action 中增加一个更新索引文件的工作,可以告诉 Copilot Agent:

“给我的 GitHub Action 中增加一个更新 search index 的任务并在本地测试”

然后 Copilot Agent 会扫描我的代码库,聪明地在我的 GitHub Action 配置文件中帮我插入相应的任务,并会自动的安装依赖软件并运行测试。

image
VS Code 中的 Copilot Action

这就是 Agent Mode 的强大之处,它可以一次性处理全局级别的改动,真正让 AI 成为你的“对等”开发伙伴。

核心优势

  • 自动检索整个代码库:不用手动定位所有相关文件。
  • 自我迭代:可以一次性迭代和修复自己生成的代码。
  • 终端命令执行:在得到你授权后,会自动跑命令、编译或测试。
  • 维持整体架构一致:在改动时会考虑跨文件依赖关系,减少顾此失彼的风险。

Chat 窗口:你的“Copilot 指挥中心”

无论你是想使用 Copilot Edits 还是 Agent Mode,你都会用到 VS Code 里的 Copilot Chat 窗口:

  1. 提问常规技术问题,比如:“如何在 Node.js 中实现 JWT 认证?”
  2. 使用 /explain 理解复杂代码片段。
  3. 使用 /fix 让 Copilot 帮你调试。
  4. 使用 /tests 为给定代码自动生成测试用例。
  5. 随时在 Edits 和 Agent Mode 之间切换。

记住:你提供的上下文信息越完整,Copilot 生成的回答就越准确。请不要吝啬给它多一些提示!

二者并不冲突——混合使用才是王道

原文中强调了一点:Copilot Edits 和 Agent Mode 并不是二选一的对立关系,而是相辅相成。

  • 当你需要快速修复和微调时,选 Copilot Edits;
  • 当你需要做多文件改动、增加大型功能模块或跑终端命令等,启用 Agent Mode。

AI 只是辅助,我们才是项目的主导者,无论在任何模式下,你都随时拥有最终的决定权。与 AI 协作的关键是:在发起需求时确保“意图”足够清晰,并在生成代码后自行进行必要的审查和测试。

如何开启 Copilot Edits 和 Agent Mode

Copilot Edits

  1. 在 VS Code 中打开 Copilot Chat 窗口。
  2. 点击「Edit with Copilot」按钮,进入 Edits 视图。
  3. 把需要修改的文件加入工作集(working set),未纳入工作集的文件默认不会被修改。
  4. 向 Copilot 发出修改需求,比如“请把用户验证逻辑改成基于 JWT 的方式,并把相关函数命名统一为 verifyUserToken”。
  5. 接受修改前,一定要查看 diff,确认无误后再点「接受更改」。

Agent Mode

  1. 需使用 VS Code 1.99 或更高版本。
  2. 在 Copilot Chat 中将模式切换为「Agent」。
  3. 描述你想实现的复杂功能,例如“创建一个带有打字机动画、上下命令历史、tab 补全、主题切换功能的 Terminal 界面。”
  4. Copilot 会在后端自动迭代并提出改动建议,你需要对每一步改动进行审核并决定是否执行。
  5. 如需个性化定制,可在 VS Code 中针对工程的特定需求编写自定义提示(custom instructions)。

号召:开源贡献者可免费使用 GitHub Copilot

在国内外,你的个人和团队如果对开源社区有贡献——比如在 GitHub 上维护或积极参与开源项目,就有机会免费申请 GitHub Copilot,这对提高工作效率、让团队更专注于关键业务逻辑而言非常有帮助。

申请地址(Copilot for Open Source)

建议把你的 GitHub Profile、开源项目链接、贡献度、Stars 等信息准备好,申请通过后就可以体验到 Copilot 的强大功能。

别担心! 只要你确实为开源生态做出过贡献,GitHub 官方是很鼓励你去申请 Copilot 的免费使用资格的。需要注意的是该免费资格是按月赋予的!

结语:拥抱 AI 工具,让开发更高效

从最初的 GitHub Copilot 到如今逐渐涌现的各种 AI 编程工具,比如 CursorAmazon CodeWhispererGoogle Gemini Code Assist、以及基于大语言模型的各种插件等等,AI 编程助手已经不再是新鲜事。Cursor 的特点在于提供类似 IDE 的环境,可直接在其编辑器里集成对话式的 AI 辅助;Replit 的 Ghostwriter 则充分利用 Replit 在线编程环境的优势,为多人协作和实时预览提供极大方便。和 Copilot 相比,这些工具可能在对话交互深度、代码质量、或对特定语言和生态的支持范围上各有所长。但总体而言,它们都在让开发者摆脱那些冗杂、重复、机械的编程工作,从而腾出更多时间和精力进行架构和创新。

“AI 不会取代程序员,但会取代那些拒绝与 AI 合作的程序员。”

如果你正在或即将投入开源项目的开发,或者在商业项目中想要挖掘更多高阶生产力,都推荐你去尝试并深入学习这些 AI 编程工具。在 GitHub 官方文档 中,你还可以找到一份从入门到进阶的 Copilot 教程系列——从最初的安装到高级用法,让你快速掌握 Copilot 的精髓。也欢迎试用其他同类工具,对比各种功能优缺点,探索适合自己团队的工作流。

让我们一起拥抱 AI,做更高效的开发者吧!

如果你对 AI 编程、云原生和开源技术感兴趣,也欢迎访问我的个人博客 jimmysong.io,一起交流讨论。祝大家编码愉快,效率倍增!

超越 Sidecar:深入解析 Istio Ambient Mode 的流量机制与成本效益

2025-03-22 14:45:55

欢迎阅读我的这篇博客——“超越 Sidecar:深入解析 Istio Ambient Mode 的流量机制与成本效益”。本文内容源自我在 KCD 北京的一次演讲。主要探讨的是 Istio 全新推出的一种数据面模式 —— Ambient Mode。它的核心理念是去除 Sidecar,减少资源开销与运维复杂度。本文将带大家了解 Ambient Mode 的出现背景、核心组件、流量路径机制以及与现有 Sidecar 模式的对比,从而帮助你快速评估并上手这项新特性。

点击查看幻灯片

为什么关注 Ambient Mode?

首先,我们来思考一个问题:为什么要关注、甚至尝试这种新模式?Sidecar 在服务网格里一直都用得好好的,为什么要“去 Sidecar”呢?

让我们看看当前服务网格面临的一些问题和挑战。

服务网格的挑战

  • Sidecar 代理带来的 资源开销运维复杂度
  • 升级重启 Envoy 时,常常需要连带重启所有 Pod
  • 越来越多对 高性能、低成本 的需求

思考:有没有一种方式在保留服务网格核心能力(安全、可观测、流量控制)的同时,减少对每个 Pod 的侵入和额外资源消耗?

服务网格的几种部署模式

image
代理的位置

服务网格架构一直在探索代理部署位置的多种可能性。例如:

  • Sidecar:每个 Pod 内跑一个 Envoy。
  • Ambient:将代理从 Pod 中剥离到节点级(即本篇要谈的模式)。
  • Cilium Mesh:利用 eBPF 在内核空间做 L4,然后结合 Envoy 提供 L7 功能。
  • gRPC:直接将网格能力集成到 SDK 中。

这些模式在功能、安全、性能和管理复杂度上都有不同的侧重。Istio Ambient Mode 则是针对 Sidecar 带来的高资源消耗和运维成本,而提出的新尝试。

Ambient Mode 的诞生

  • Istio 的新一代架构,移除 Sidecar,通过 ztunnel + Waypoint Proxy 实现数据面的轻量化。
  • 节省资源、降低运维复杂度。
  • 依然支持 mTLS、策略管控,并为需要 L7 功能的流量提供可选的 Waypoint Proxy
image
部署模式象限

以下表格是对比常见服务网格部署模式的一些简要特点:

模式 安全性 效率 可管理性 性能
Sidecar 模式 高安全性,隔离的代理 资源使用率高 集中化管理但较为复杂 增加一定延迟
Ambient 模式 通过 ztunnel 提供安全性,仍在发展中 更高效,共享代理 管理更简单但功能在完善中 良好;跨可用区时需注意网络开销
Cilium mesh 中等安全性,基于 eBPF 内核级效率 配置复杂 可视场景不同而异
gRPC 应用集成安全,依赖应用自身 高效 更新管理复杂 低延迟,适用于实时场景

Istio Ambient Mode 核心概念

接下来我们正式进入第二部分,深入看看 Ambient Mode 的具体组件,包括 ztunnel、Waypoint Proxy 以及 Istio CNI 在其中扮演的角色。

Ambient Mode 的核心组件

  1. ztunnel (L4)
    • 以 Node 级代理的方式运行
    • 负责 透明流量拦截mTLS 加密
    • 适用于大部分只需 L4 转发的流量
  2. Waypoint Proxy (L7)
    • 可选部署(根据命名空间 / Service / Pod 粒度灵活配置)
    • 处理 HTTP / gRPC 等高级功能(鉴权、路由、可观测等)
  3. Istio CNI
    • 取代 istio-init 容器,负责流量劫持
    • 兼容 Sidecar 模式和 Ambient 模式
    • 允许在非特权模式下为 Pod 设置流量重定向

Ambient 模式整体架构

image
Istio Ambient 模式架构

在 Ambient 模式下,Istio 数据面可分为两层:

  1. 安全层 (ztunnel):每个节点部署一个轻量级 L4 代理。
  2. 可选的 L7 层 (Waypoint Proxy):需要 HTTP/gRPC 代理时才部署。

Control Plane 依然由 Istiod 提供,主要负责给 ztunnel、Waypoint 下发配置和证书。

Waypoint Proxy 部署策略

  • Namespace 级(默认):适用于该命名空间下所有 Workload
  • Service 级:仅特定关键服务需要 L7
  • Pod 级:更精细化控制
  • 跨 Namespace:可以使用 Gateway 资源共享

Istio CNI

  • 流量拦截:取代 istio-init 容器,使安装更加清晰简洁。
  • 支持两种模式:兼容 Sidecar 模式Ambient 模式
  • 非特权模式兼容性:允许 Pod 运行在无特权模式下,增强安全性。
  • CNI 链接(Chaining):通过添加 Istio CNI 扩展节点的 CNI 配置。
  • Pod 内部流量重定向(Ambient 模式)
    • 在 Pod 的网络命名空间内使用 iptables REDIRECT 规则。
    • 创建 Pod 内部的 socket 以拦截和代理流量。

这张图简单示意了 Istio CNI 如何与 Kubernetes 本身的网络插件(如 Calico、Cilium 等)组合在一起。它修改了本机的 CNI 配置,增加了 CNI 链,在 Kubernetes 分配完 Pod IP 后,紧接着就会执行 Istio CNI 的拦截逻辑,把网络流量规则注入到 Pod netns。并且为不同模式中 Pod 配置不同的 iptables 规则。 这样就与原本的 CNI 配置(包括网络策略)形成一个链式流程,不会相互冲突。

image
Istio CNI 插件的运行步骤

Istio CNI 插件工作原理

这张图详细描绘了当 Pod 启动时,Istio CNI 会怎么做:

image
Istio CNI 插件工作原理
  1. 它会进入 Pod 的网络命名空间,创建一套 iptables 规则,把流量劫持到 ztunnel 监听的 socket 上。
  2. 不再需要在每个 Pod 里注入 init 容器,也不需要特权权限,这就让整体部署更干净、也更安全。
  3. ztunnel会在pod的网络命名空间中建立一个socket,并且为节点上的每个pod都会建立一个。

流量路径与关键机制

介绍完组件之后,我们来看看最核心的“流量路径”。zTunnel 和 Waypoint 究竟是怎么拦截并转发流量的?我们会从透明流量拦截、HBONE 协议等角度进行解析。

透明流量拦截

在 Ambient 模式中,Istio CNI 会在 Pod 网络命名空间中注入 iptables 规则,将出站流量透明拦截到所在节点的 ztunnel 进程。之后由 ztunnel 决定是直接进行 L4 转发,还是将流量转发至 Waypoint Proxy 做进一步的 L7 处理。

如图所示,Kubelet 在节点上启动了一个 Pod,这个事件被 Istio CNI Agent 监听到,Istio CNI Agent 进入 Pod 的网络空间,设置 iptables 规则将流量重定向到本地 socket,并将 Pod 的文件描述符(FD)发送为 ztunnel。ztunnel 获取到 FD 之后就可以在 Pod 的网络空间中创建 socket。

Pod 在发送流量时,本该直连目标地址,但是 iptables 规则会把它拦截到本节点的 ztunnel 进程里,然后 ztunnel 决定这条流量需不需要交给 Waypoint 做 L7 代理。 如果不需要,就直接在 L4 层把它加密转发到目标 Pod;如果要 L7,例如鉴权,就再把流量隧道给 Waypoint。

image
透明流量拦截

数据包生命周期概览

  1. Pod → ztunnel:Pod 的流量先被 CNI 拦截到本节点 ztunnel。
  2. ztunnel:解析目标地址并进行 mTLS 加密。
  3. (如需要 L7 策略)ztunnel → Waypoint Proxy:HTTP 鉴权、路由等操作。
  4. Waypoint Proxy:完成 L7 处理后,再发回 ztunnel。
  5. ztunnel:解封装或继续转发至目标节点 ztunnel。
  6. 到达目标 Pod:目标节点 ztunnel 最终将流量交给目标 Pod。

HBONE 协议

Ambient 模式中,zTunnel 与 Waypoint 之间使用 HBONE (HTTP/2 + CONNECT) 协议来建立安全隧道,实现 mTLS 加密 和多路复用,减少额外的连接开销,简化代理转发流程。

image
HBONE 协议

下面是一个简化的 HBONE CONNECT 请求示例,利用 x-envoy-original-dst-hostx-istio-auth-userinfo 等头信息来传递路由和身份认证所需上下文。

:method: CONNECT
:scheme: https
:authority: Pod_B_IP:9080
:path: /api/v1/users?id=123
x-envoy-original-dst-host: Pod_B_IP:9080
x-forwarded-proto: hbone
x-istio-attributes: ...
...

在这个示例里,假设 ztunnel A 需要把流量发送给 目标节点 B,我们可以看到外层的 TCP 连接其实是从 ztunnel_A_IP:52368 连到 Node_B_IP:15008。这是 ztunnel A 和 ztunnel B 之间的隧道端口,15008 就是 HBONE 监听端口。

进入到 HTTP/2 层后,就会有一个 CONNECT 请求,里面的 :authority 显示的是 Pod_B_IP:9080,表示实际上要连到 Pod B 的 9080 端口。x-envoy-original-dst-host 里也能看出相同信息。

同时我们看到了一些自定义头,比如 x-forwarded-proto、x-istio-attributes 等,用来给目标 ztunnel 或后续代理带去更多上下文和安全验证信息。

可以把这个理解为:在 HTTP/2 CONNECT 之上,流量就像加了一个“内层”隧道,把应用层的请求(例如 /api/v1/users?id=123)封装在这里面,然后在 ztunnel B 端解封装并转发到真实的 Pod B。

整个过程对应用来说是透明的,但对我们来说,通过查看这种 CONNECT 请求头,可以了解 Ambient 模式如何在 HTTP/2 层做流量路由和身份认证。这就是为什么说 HBONE 比传统的 Sidecar-to-Sidecar通信更加灵活,也更便于做 mTLS 以及 L7 扩展。

同节点上的加密流量

如果源 Pod 和目标 Pod 恰好在同一个节点上,流量会走 ztunnel 的 L4 加密流程。 这里显示,ztunnel 是使用 DaemonSet 部署在每个节点上的,并且使用了host Network,共享主机的网络。Istio CNI 将 Pod 的出站流量拦截到 ztunnel的15001端口,如果源和目的 pod 在同一个节点上,ztunnel 直接在内部完成加解密后将流量发送到目的地 pod。

如果需要 L7 的流量处理,比如鉴权,ztunnel 就会与 Waypoint 代理建立 HBONE 隧道,经过 Waypoint 代理的转发到目的 Pod。

image
同节点上的加密流量

跨节点的加密流量(L4)

这是跨节点的情况,也就是最常见的场景:

源节点的 ztunnel 把流量通过 HBONE 隧道加密后发给目标节点的 ztunnel;目标节点 ztunnel 解封装,再把明文流量递给目标 Pod。只要是纯 L4 无需 L7,就不必加一层 Waypoint,减少了代理链路。

image
跨节点的加密流量(L4)

跨节点的加密流量(L7)

当我们需要 L7 处理时,流量就会多经过一下 Waypoint。也就是:

  • 源 ztunnel 先把流量隧道给 Waypoint;
  • Waypoint 在 HTTP 层做鉴权、路由等;
  • Waypoint 再用 HBONE 把流量发给目标 ztunnel;
  • 目标 ztunnel 解封装后给目标 Pod。
image
跨节点的加密流量(L7)

这个流程比 L4 多了一次代理,但好处是只有特定流量才会被 L7 代理解析,减少不必要的开销。

兜底流量(防止流量逃逸)

对于非 Istio网格内部的流量,通过 Pod IP和端口直接访问 Pod时,为了防止这些流量逃出 ztunnel的掌控,也需要拦截这些流量。如果流量是访问的应用端口,通过判断数据包上是否带有 0x539 标记,如果没有,则将其转发到 ztunnel 监听的 15006 明文端口,经 ztunnel 处理后会带上 0x539 标记,然后就可以访问应用的目标端口了;如果流量的目的端口是 15008,那么实际上就会被 ztunnel 监听和处理,判断 HBONE 协议。

image
来自非mesh内部的流量

L4 与 L7 流量差异

流量类型 处理位置 示例场景
L4 ztunnel(透明转发) TCP 级别流量,不需应用层策略
L7 ztunnel → Waypoint Proxy HTTP/gRPC 需要鉴权、熔断、路由、可观测等高级功能

对于大部分只需 TCP 层加密和转发的流量,Ambient Mode 仅通过 ztunnel 即可;只有在需要 HTTP 层策略时才会额外经过 Waypoint。

Ambient Mode vs. Sidecar Mode

有了对 Ambient 的了解后,我们还是得和原有的 Sidecar 模式做对比,来看看哪些功能还不完善,哪些场景更适合 Ambient。

Ambient 模式的限制

与传统 Sidecar 模式相比,Ambient 目前仍有一些不完善之处:

  • 混合使用 Sidecar 与 Ambient 时,难以对单个 Pod 做精准代理定制(例如 EnvoyFilter)。
  • 多集群多网络、以及 虚拟机 工作负载的支持还不够完善,生产环境使用需谨慎。
  • 一些深度定制(例如 WASM 插件)目前无法在 Ambient 下直接一对一实现。

功能与差异对比

指标 Sidecar 模式 Ambient 模式
代理位置 每个 Pod 都运行 Envoy Sidecar Node 级 ztunnel + 可选的 Waypoint Proxy
资源开销 在大规模场景下 CPU/内存消耗相对更高 相对更低:代理共享在节点/命名空间级
运维复杂度 升级 Sidecar 需滚动更新所有关联 Pod,操作较繁琐 部署/升级集中在少数组件(ztunnel / Waypoint),运维更简单
性能 每个 Pod 都有 Envoy,使得隔离性更强,但整体有额外代理开销 L4 性能较好,L7 场景需要多经过一次 Waypoint 转发
功能完整度 成熟稳定,支持多集群、VM、混合网络 尚在演进,多网络、VM 等高级场景支持仍在完善
典型使用场景 注重严格隔离或依赖特定的 EnvoyFilter、WASM 插件等深度定制 大规模集群、需要轻量化管理且大部分流量以 L4 为主的场景

选择建议

  1. 若已有 Sidecar 架构且依赖大量成熟特性:可先继续使用 Sidecar。
  2. 追求 资源节省运维简化 且大部分流量仅需 L4:可尝试 Ambient Mode
  3. 如果部分应用仍需保留 Sidecar,可考虑 混合部署,但需额外规划 Sidecar / Ambient 的边界和策略。

总结

好的,最后我们来总结一下 Ambient Mode 的优缺点,以及当前适合哪些场景。

核心要点回顾

  1. Ambient Mode:通过移除 Sidecar,降低每个 Pod 的代理负担,显著降低资源和运维成本。
  2. ztunnel + Waypoint 架构:需要 L7 功能时才启用 Waypoint,其他流量以 L4 方式快速转发。
  3. 虽然官方已宣布 Ambient Mode GA,但对于 多集群 / VM / 多网络 等仍需进一步观察、测试。
  4. 适用场景:大规模集群 + 主要以 L4 流量为主,对资源和管理要求高的团队可以重点关注。

你也可以通过 jimmysong.io 网站找到更多云原生相关的文章和实践分享。如果对此文或 Istio 有任何疑问,欢迎给我留言或在社区中交流。谢谢!

Istio 安装方式深度剖析——选择与实践指南

2025-02-27 13:47:35

随着 Istio 版本迭代,其的安装方式和工具链也在不断演进。从 istioctl 到 Helm,再到曾经的 Istio Operator,用户常常会面临选择困境:到底哪种方式最适合我的场景?在最近的交流中,我经常遇到关于 Istio 安装方式选择的问题,特别是围绕 IstioOperator API 和已废弃的 Istio Operator 组件的区别。今天,我将以技术实践者的视角,带你梳理 Istio 的安装之道,拆解关键问题,并给出生产级建议。

Istio 安装方式一览

Istio 提供了多种安装路径,每种方式都有其设计初衷和适用场景。以下是当前主流选项:

  • istioctl:官方推荐的安装工具,集验证、定制和运维于一体,几乎是生产环境的标配。
  • Helm:Kubernetes 生态的包管理利器,适合 Helm 重度用户或 CI/CD 集成场景。
  • Istio Operator(已废弃):曾经的集群内管理方案,如今已退出历史舞台。

接下来,我们逐一剖析这些方式的核心特点,以及背后的取舍逻辑。

istioctl:生产环境的不二之选

在 Istio 中,istioctl 被官方定位为首选安装工具。它的优势显而易见:

  • 强大的配置验证:在安装前,istioctl 会对配置进行静态检查,避免潜在问题。比如,使用 istioctl analyze 可以快速定位配置文件中的错误。
  • 灵活的定制能力:通过 IstioOperator API,你可以精确控制安装细节,比如只启用 Pilot 或调整网关配置。
  • 生产就绪的特性:从健康检查(istioctl verify-install)到增量升级,istioctl 提供了全生命周期支持。
  • 安全优先:相较于集群内控制器,istioctl 在本地运行,避免了高权限组件带来的安全隐患。

实践中的一个简单例子:

istioctl install --set profile=default -y

这会快速部署默认配置。如果需要更细粒度的控制,可以搭配 YAML 文件(后文详解)。

适用场景:生产环境、新用户、需要高度定制的场景。

Helm:生态集成下的备选方案

Helm 是 Kubernetes 生态的老朋友,Istio 也提供了官方 Helm chart。它的亮点在于:

  • 与 Helm 生态无缝对接:如果你的集群已经在用 Helm 管理资源,Istio 的 Helm 安装可以直接融入现有工作流。
  • 自动化友好:Helm chart 的版本化和声明式特性,非常适合 CI/CD 管道。

但 Helm 并非没有短板:

  • 验证能力不足:相比 istioctl,Helm 的配置检查较弱,错误往往在运行时暴露。
  • 组件管理复杂:比如安装 Egress Gateway,Helm chart 的支持不够完善,社区反馈中常有人提到需要额外调整(参考 GitHub Issue #43826)。

适用场景:已有 Helm 工作流、CI/CD 驱动的项目。

Istio Operator 的兴衰

如果你接触过早期 Istio,可能会对 Istio Operator 有所耳闻。这是一个运行在集群内的控制器,负责根据配置管理 Istio 安装。然而,从 1.23 版本起,它已被官方废弃。原因何在?

  • 安全考量:集群内高权限组件容易成为攻击目标,增加了运维风险。
  • 功能冗余:社区调查显示,其使用率不足 10%,而 istioctl 已能完全覆盖其功能(参考 GitHub Discussion #166)。

现有用户可以继续运行旧版本,但无法升级到 1.24+。对于新项目,我的建议是直接跳过这一选项。

拨云见日:IstioOperator API vs. Istio Operator

讨论中常出现的一个困惑是:IstioOperator API 和 Istio Operator 有什么区别?让我们一次性讲清楚:

  • IstioOperator API:一个声明式的配置接口,用于定义 Istio 安装的期望状态。它并未废弃,而是 istioctl 的核心依赖。
  • Istio Operator:已废弃的集群内控制器,过去负责解析 API 并执行安装。

类比一下:API 是设计图纸,Operator 是施工队。现在,istioctl 取代了施工队,效率更高,风险更低。

实战:如何使用 IstioOperator API

IstioOperator API 是 Istio 安装的灵魂,允许你通过 YAML 文件灵活定制配置。以下是一个典型流程:

  1. 编写配置文件

    假设我们要启用 Egress Gateway:

    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    spec:
      profile: default
      components:
        egressGateways:
          - name: istio-egressgateway
            enabled: true
    
  2. 部署配置

    执行:

    istioctl install -f istio-config.yaml
    

    这种方式的好处在于声明式管理,修改后重新运行即可实现增量更新。比如,要调整资源限制,只需更新 YAML 并再次应用。

组件更新与扩展

安装完成后,如何添加或更新组件(如 Egress Gateway)?istioctl 的答案简单直接:

  • 编辑 YAML,添加新配置。

  • 运行:

    istioctl install -f updated-config.yaml
    

    istioctl 会自动计算差异,完成增量部署。

Helm 更新则稍显繁琐,可能涉及 chart 调整或手动干预,尤其在非常规组件上。

总结与生产建议

通过这次深入剖析,我们可以得出以下结论:

  • istioctl 是王道:它兼具安全性、灵活性和生产就绪特性,适合绝大多数场景。
  • Helm 有其一席之地:如果你深陷 Helm 生态,不妨一试,但要做好额外配置的准备。
  • Istio Operator 已成历史:新项目无需考虑,现有用户应规划迁移。

作为一个在开源领域摸爬滚打的实践者,我建议从 istioctl 入手,结合 IstioOperator API,既能快速上手,又能满足复杂需求。Istio 的安装看似复杂,但掌握核心逻辑后,你会发现它其实很有条理。

有任何疑问,欢迎留言交流,一起解锁服务网格的更多玩法!

参考资料

Istio Ambient 模式:图解及概念解读

2025-02-13 18:20:14

Istio 的 Ambient 模式是一种创新的、无 Sidecar 的服务网格部署方式,通过 ztunnel 和 waypoint proxy 分离数据平面功能,简化了操作并降低了资源消耗。本篇博客将通过一份详细的术语表,帮助你更好地理解 Istio Ambient 模式中的关键概念及其背后的技术实现。

Ambient 模式

image
Ambient 模式架构图
  • 定义:Istio 的一种无 Sidecar 的数据平面模式,通过 ztunnel 和 waypoint proxy 实现服务之间的安全通信和管理。相较于 Sidecar 模式,Ambient 模式更加轻量,降低了资源消耗并简化了配置。
  • 架构:数据平面功能分为 L4 层的安全覆盖层(由 ztunnel 提供)和 L7 层的策略处理层(由 waypoint proxy 提供)。

控制平面与数据平面

image
控制平面与数据平面
  • 定义:在 Ambient 模式中,控制平面(istiod)负责管理集群内 ztunnel 和 waypoint proxy 的配置和策略,而数据平面由 ztunnel 和 waypoint proxy 组成,负责处理实际的网络流量。
  • 组件交互:ztunnel 使用 xDS APIs 从 istiod 获取配置并执行策略,管理 Pod 之间的 L4 和 L7 流量。

Istio Control Plane (istiod)

  • 定义:Istio 的控制平面组件,负责与 ztunnel 和 waypoint proxy 通信,提供 xDS 接口用于动态配置。
  • 功能istiod 使用 xDS APIs 进行配置推送,动态管理 Ambient 模式中的流量策略、证书分发以及与 Kubernetes 集群的交互。

透明性与非侵入性

  • 定义:Ambient 模式的架构旨在减少对应用的侵入性,应用无需感知数据平面的存在,Pod 无需重启或注入 Sidecar 即可加入网格。
  • 优势:提高了服务网格的灵活性,降低了操作复杂度,使应用和基础设施的生命周期更加解耦。

Sidecar Proxy

image
Sidecar 模式
  • 定义:传统 Istio 中的 Envoy 代理,与应用容器共同部署在一个 Pod 中。
  • 问题:对应用具有侵入性,Sidecar 必须在 Pod 中注入并伴随应用运行,增加了资源开销,并且使应用与代理的生命周期耦合。

Ztunnel (Zero-Trust Tunnel)

image
ztunnel
  • 定义:Ambient 模式中的关键组件,部署为 DaemonSet,为每个节点提供 L4 层的零信任隧道。
  • 功能:
    • 安全:提供 mTLS 加密和基于 SPIFFE ID 的身份验证,确保节点和工作负载之间的安全通信。
    • 可观测性:收集 L4 层的 TCP 指标和日志。
    • 连接多路复用和均衡:在节点之间建立安全的流量隧道,以优化连接和网络性能。
    • 多租户架构:单个 ztunnel 可以代表同一节点上的多个工作负载进行 L4 数据平面功能处理,这与每个应用 Pod 拥有自己代理的 Sidecar 模式形成对比。
    • 证书管理:ztunnel 代表节点内的所有 Pod 从 Istio 控制平面 (istiod) 获取 mTLS 证书,并负责证书的管理和轮换。
  • 接口:
    • pistioinpistioout:用于与节点上的 istioinistioout 接口通过 GENEVE 隧道连接。

Waypoint Proxy

image
Waypoint Proxy
  • 定义:Ambient 模式中的 L7 层代理,部署在每个命名空间级别,用于处理 L7 层请求。
  • 功能:提供 L7 授权策略,如基于 HTTP headers 的访问控制、L7 级别的遥测等。Waypoint Proxy 只处理需要的 L7 代理流量,其他 L4 流量由 ztunnel 处理。

GENEVE 隧道 (Generic Network Virtualization Encapsulation)

image
GENEVE 协议组成
  • 定义:用于在 Kubernetes 节点之间建立虚拟隧道连接,将流量从节点上的 Pod 转发到 ztunnel。
  • 在 Ambient 模式中的应用:GENEVE 隧道用于连接节点上的虚拟网络接口(istioinistioout)与 ztunnel 内的接口(pistioinpistioout)。

HBONE (HTTP-Based Overlay Network Environment)

image
HBONE 数据包格式
  • 定义:Istio 特有的安全隧道协议,用于在 Ambient 模式组件之间传输数据。HBONE 是一种基于 HTTP/2 和 HTTP CONNECT 建立的安全 mTLS 加密通道。
  • 实现方式:通过 HTTP/2 进行多路复用,通过 HTTP CONNECT 建立隧道,并使用 mTLS 确保安全性。详见 Istio 文档

Istioin 和 Istioout 虚拟接口

image
Ambient 模式中两个位于两个不同节点上的 Pod 访问路径
  • 定义:由 Istio CNI 插件在每个节点上配置的两个虚拟接口,用于处理进入和离开节点的流量。
  • 功能istioin 处理进入节点的流量,istioout 处理离开节点的流量。两者通过 GENEVE 隧道连接到 ztunnel 中相应的接口。

iptables 和流量重定向

  • 定义:用于配置 Linux 内核中的流量规则,将来自 Ambient 工作负载的流量进行重定向和标记。
  • 在 Ambient 模式中的应用:Istio CNI 插件通过 iptables 规则,将流量标记并重定向到 istioinistioout,然后通过 GENEVE 隧道传递给 ztunnel。

流量拦截与重定向 (Traffic Redirection)

  • 定义:Ambient 模式中,ztunnel 负责透明拦截所有进出 “in-mesh” Pod 的流量并将其加密后重定向到其他节点上的目标 Pod,确保网络流量符合服务网格的安全策略。
  • 机制:通过 Istio CNI 插件安装的 iptables 规则或 eBPF 程序,ztunnel 能够透明地捕获工作负载的流量,并在不改变客户端应用的情况下进行安全代理。

流量路径分类

  • Out of Mesh:Pod 没有加入服务网格,流量不会被 Ambient 数据平面处理。
  • In Mesh:Pod 被纳入 Ambient 数据平面,L4 层的流量被 ztunnel 拦截和处理,提供 L4 授权和安全加密。
  • In Mesh, Waypoint Enabled:Pod 被纳入 Ambient 数据平面且启用了 waypoint proxy,L7 层的流量通过 waypoint 进行高级策略处理。

TPROXY

image
TPROXY 作为透明代理,客户端和服务端都对其无感知
  • 定义:Linux 内核功能,用于透明拦截和重定向网络流量。
  • 在 Ambient 模式中的应用:ztunnel 使用 TPROXY 来拦截和处理流量,保留原始源 IP 和端口信息,从而实现透明代理功能。

Mutual TLS (mTLS)

image
Istio 中的安全身份架构(以 Sidecar 模式为例)
  • 定义:一种双向 TLS 认证机制,确保通信双方的身份验证和数据加密。
  • 在 Ambient 模式中的应用:通过 ztunnel 和 waypoint proxy 确保工作负载之间的 mTLS 加密,实现零信任安全。

详见 如何理解 Istio 中的 MTLS 流量加密?

SPIFFE ID

image
SPIFFE ID 格式

Istio 服务网格中所有工作负载将根据其服务账户注册 SPIFFE 标准的服务身份格式:spiffe://<trust-domain>/ns/<namespace>/sa/<service-account>

  • 定义:用于标识工作负载的身份标识符,在服务网格中用于身份管理。
  • 在 Ambient 模式中的应用:SPIFFE ID 被用于对节点和工作负载进行身份验证,以确保网络通信的安全性。

详见 为什么 Istio 要使用 SPIRE 做身份认证?

eBPF (Extended Berkeley Packet Filter)

  • 定义:eBPF 是 Linux 内核中的一种技术,用于在内核空间中运行沙盒程序,实现网络数据包处理等功能。
  • 在 Ambient 模式中的应用:eBPF 可以替代传统的 iptables 和 GENEVE 隧道,用于流量重定向和管理。eBPF 更高效、复杂度更低且易于管理。
  • eBPF 程序:
    • 应用入站
    • 应用出站
    • Ztunnel 主机入站
    • Ztunnel 入站
  • 作用:Istio CNI 使用 eBPF 程序将它们挂载在特定的 TC 点,用于处理应用和 ztunnel 的网络流量。

Waypoint Proxy 的弹性扩展

image
Waypoing Proxy 作为 Deployment 部署在 Kubernetes 中
  • 定义:在 Ambient 模式中,waypoint proxy 可以根据流量需求动态扩展,而无需为每个工作负载实例部署独立代理。
  • 优势:通过动态扩展 waypoint proxy,可以降低基础设施成本并提高资源利用率。

Ztunnel 的弹性和故障恢复

  • 定义:ztunnel 部署为 DaemonSet,如果 ztunnel 容器失效,Kubernetes 会自动重新调度,以确保节点流量的继续处理。
  • 特点:使得故障的影响范围最小化,仅影响该节点上的工作负载。

IP Set 和 ztunnel-pods-ips

  • 定义:IP Set 是用于存储 IP 地址的工具,ztunnel-pods-ips 是每个节点上用于存储 Ambient 网格 Pod IP 的集合。
  • 在 Ambient 模式中的应用:Istio CNI 插件会将每个加入 Ambient 网格的 Pod IP 添加到 ztunnel-pods-ips 中,以确保这些 Pod 的流量可以被 iptables 规则识别和处理。

连接多路复用 (Connection Multiplexing)

  • 定义:在单个物理连接中传输多条逻辑连接的技术。
  • 在 Ambient 模式中的应用:ztunnel 实现了连接多路复用,使多个工作负载可以共享相同的连接,提升网络效率。

节点网络的虚拟接口对 (veth)

  • 定义:每个 Pod 在运行时会在节点上创建一个虚拟接口对,用于将 Pod 的网络连接到节点的网络。
  • 在 Ambient 模式中的应用:veth 接口用于将 Pod 的流量连接到节点的虚拟接口(如 istioinistioout),从而将流量引导至 ztunnel 进行处理。

Waypoint Proxy 的流量路径

image
Waypoint Proxy 的流量路径
  • 定义:Waypoint Proxy 只参与服务器端的流量路径,作为 L7 代理执行服务端的请求。
  • 应用场景:当部署了 Waypoint Proxy 时,来自同一服务账户的工作负载将通过 ztunnel 重定向至 Waypoint Proxy 进行处理,然后到达目标 Pod,确保 L7 级别的策略和认证得以执行。

Istio CNI (Container Network Interface)

  • 定义:Istio 的容器网络接口插件,用于在 Kubernetes 集群中自动配置流量拦截规则。
  • 功能:Istio CNI 负责为每个新创建或加入网格的 Pod 设置必要的网络重定向规则。它通过修改 iptables 规则或应用 eBPF 程序来确保所有流量能够被 ztunnel 或 waypoint proxy 拦截和处理,从而实现服务网格的透明流量管理。
  • Istio CNI Node Agent:Istio CNI Node Agent 负责在每个节点上安装 Istio CNI 插件,并更新节点的 CNI 配置,确保当 Pod 加入服务网格时能够正确地配置流量重定向规则。在 Sidecar 模式中,CNI 插件通过 iptables 配置 Pod 的网络。在 Ambient 模式中,CNI 插件负责将新的 Pod 事件推送到 Ambient 监控服务器,以便配置 Pod 的网络重定向规则。

总结

Istio Ambient 模式通过将数据平面功能分为 L4 和 L7 层的独立组件,为用户提供了更轻量且灵活的服务网格解决方案。这种方式不仅简化了服务的部署,还大幅降低了资源开销。通过术语表的方式,我们探讨了 Ambient 模式中的各种核心概念,从 ztunnel 到 waypoint proxy,再到 iptables 和 eBPF 的使用,帮助你全面了解 Istio Ambient 模式的架构和运行机制。如果你对服务网格感兴趣或正在考虑如何优化微服务通信,希望这篇文章对你有所帮助。

免费的 AI 绘图工具推荐:Raphael.app

2025-01-21 10:02:05

在如今各种 AI 工具层出不穷的时代,找到一个好用又免费的绘图工具真的不容易。而 Raphael.app 就是一款非常值得一试的 AI 绘图工具。它简单易用,而且用英文提示词就能生成效果不错的图片。

image
Raphael.app 页面

Raphael 简介

这款以文艺复兴三杰之一拉斐尔(Raphael,全名:Raffaello Sanzio da Urbino,1483 年 4 月 6 日-1520 年 4 月 6 日)命名的工具,有以下特点:

  1. 完全免费:市面上很多 AI 绘图工具要么功能受限,要么需要订阅才能解锁更多功能,而 Raphael 完全免费(至少到撰写本文为止,网站中承诺免费),无需付费也能用它创造出不错的作品。
  2. 支持英文提示:只需要用英文简单描述你想要的图片,比如“A cat-like colorful cat”,Raphael 就可以根据提示生成对应的画面。
  3. 效果还不错:虽然和一些高端付费工具相比还有提升空间,但 Raphael 生成的图片已经足够让人满意了,尤其对于新手或尝试 AI 绘图的人来说,它完全够用。

谁适合用 Raphael?

  • 艺术爱好者:可以用它来寻找创作灵感。
  • 内容创作者:为博客、视频或社交媒体增加独特的视觉元素。
  • 学生和老师:为作业或课件增添一些创意。
  • AI 绘图初学者:零成本尝试 AI 艺术创作。

如何使用?

操作非常简单:

  1. 打开 raphael.app,无需注册或登录。
  2. 输入你想要的图片描述,用英文提示词效果会更好。
  3. 点击“生成”,等待 10 秒钟左右 AI 生成图片,这一步可能需要经过 CloudFlare 的自动人机验证。
  4. 你还可以选择对生成的图片进行精修。
  5. 下载或者直接分享生成的作品。
image
使用 Raphael 生成的图片(一只长的像猫的五彩缤纷的鸟)

总结

Raphael 是一个用起来特别方便的 AI 绘图工具,既免费又能生成效果不错的图片。不管你是想找灵感还是单纯玩玩 AI,都非常值得一试。

探索云原生可观测性:技术与团队协作的深度结合

2025-01-20 16:50:25

最近读了 TheNewStack 发布的电子书《Cloud Native Observability for DevOps Teams》,虽然这本书是 2022 年出品的,但给我了很大的启发。它不仅讨论了技术工具,还深入探讨了团队协作、文化建设和未来趋势的结合点。在这本书里,“观察”不仅仅是看到数据,而是看清背后的意义。可以说,它从根本上改变了我对可观测性的理解。

核心内容

本书从基础定义到实际操作,系统地阐述了云原生可观测性的重要性及其实现方式。通过具体的工具和策略,它帮助读者理解如何整合指标、日志、追踪和混沌工程等维度,全面掌控分布式系统的健康状况,为 DevOps 团队提供高效的决策支持。

可观测性的定义与价值

书中开篇就点明:可观测性是通过系统的外部信号推断内部状态的能力。不仅是传统的指标(Metrics)、日志(Logs)、追踪(Tracing)三根支柱的组合,而是一种综合性、全局化的分析方法。正如作者所说:

“Observability isn’t just the ability to see each piece at a time; it’s also the ability to understand the broader picture and how these pieces combine.”

云原生环境的挑战

书中特别强调了 Kubernetes 环境中日志和监控的复杂性。Kubernetes 没有内置的完整可观测性解决方案,只提供了基础功能,比如 kubectl 查看对象状态,而更高级的功能需要依赖第三方工具如 Fluentd 和 Prometheus。

实践指南

书中在实践部分提到了多种实现可观测性的具体策略和工具:

  • 应用日志:通过 Fluentd 或类似工具采集容器内的标准输出日志,帮助开发者定位应用问题。
  • 集群日志:收集 Kubernetes 核心组件如 kube-apiserver 和 etcd 的日志,适合排查系统级别的故障。
  • 事件日志:利用 kubectl get events 快速了解集群中资源的状态变化。
  • 审计日志:记录 API 请求,便于安全审查和权限问题的定位。
  • 混沌工程:利用工具如 Chaos Mesh 和 Litmus Chaos,验证系统在高压或异常情况下的表现。

这些实践指南强调了工具与策略的结合,从而实现全面的可观测性。

我的思考与观点

超越数据本身的“观察力”

书中强调,单纯收集数据并不能解决问题,关键在于跨维度数据的整合与分析。例如,在性能问题排查时,指标和追踪往往无法直接关联,而这正是现有工具的短板。未来,统一数据存储和分析视角的工具,比如 OpenTelemetry 提倡的标准化方法,可能是突破口。

AI 与可观测性的结合

随着 AI 技术的发展,可观测性工具也可以更智能化。例如,通过机器学习预测异常,或是自动推荐优化策略。这不仅能减少人为干预,还能提升故障响应速度。正如作者在混沌工程部分提到的:

“Instead of waiting for something to happen and finding out how your application fares, you put it through duress under controlled conditions to identify weaknesses and fix them.”

从团队协作到文化转型

书中提到“DevOps 的终极目标是跨团队的协作与同理心”,这点深有共鸣。尤其是在复杂分布式系统中,开发和运维团队往往各自为战,导致沟通断层。跨团队协作的关键在于工具提供的透明性与共享视角,而不仅仅是技术能力。

总结

这本书的独到之处在于它从技术和人文两个角度同时切入,它让我意识到,可观测性不仅是一组工具的集合,而是一种文化、一种能力,帮助我们更深刻地理解系统,推动团队协作,并在复杂的云原生环境中建立起真正的“透明化”。

最后,我想引用书中一段非常打动我的话来结尾:

“Observability lets you see the beautiful and complete picture that is your production software systems.”