MoreRSS

site iconJimmy Song | 宋净超修改

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

Inoreader Feedly Follow Feedbin Local Reader

Jimmy Song | 宋净超的 RSS 预览

免费的 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.”

使用 Envoy 实现 HTTP/2 CONNECT 隧道:原理与实践

2025-01-14 18:28:37

在最近对 Istio Ambient 模式的研究中,我发现 HTTP2 Connect 方法被用作创建隧道的核心技术,以实现透明流量的拦截和转发。HTTP/2 CONNECT 隧道是一种强大的工具,可以在已有的 HTTP/2 连接中创建高效的隧道,用于传输原始的 TCP 数据。这篇文章通过一个简单的 Demo,展示了如何使用 Envoy 来实现 HTTP/2 CONNECT 隧道的基本功能。

什么是 HTTP2 Connect 方法以及 HBONE 隧道?

HTTP2 Connect 方法是一种标准化的方式来创建隧道,用于透明地传输数据。特别是在 Istio 的 Ambient 模式中,它为代理数据平面之间的通信提供了一种高效的手段。HBONE(HTTP-Based Overlay Network Environment)隧道则是基于这种 HTTP2 Connect 技术的实现,用于 Istio 中的透明流量拦截和转发。通过使用 HBONE,数据可以有效地通过 HTTP2 隧道安全传输,替代了传统的 Sidecar 模式。这一创新设计极大地简化了服务网格的管理和部署。

HBONE 是 Istio 特有的术语,它是一种安全隧道协议,用于在 Istio 组件之间进行通信。在当前的 Istio 实现中,HBONE 协议包含了三个开放标准:

  • HTTP/2
  • HTTP CONNECT
  • Mutual TLS (mTLS)

HTTP CONNECT 用于建立隧道连接,mTLS 用于安全地加密连接,而 HTTP/2 用于在单一安全隧道中多路复用应用连接流并传输附加的流级元数据。更多关于 HBONE 隧道的细节可以参考官方文档:HBONE 详细介绍

使用 HTTP2 Connect 建立隧道的基本原理

HTTP2 Connect 方法允许我们创建一个类似于 VPN 的隧道,通过这个隧道可以安全地传递数据。建立隧道的基本步骤如下:

  1. 首先,客户端向代理发送一个普通的 TCP 或 HTTP 链接请求。
  2. 代理接收到请求后,代表客户端向目标服务器发送一个带有 CONNECT 方法的 HTTP2 请求。
  3. 如果服务器允许建立隧道,那么它会返回一个 HTTP2 200 OK 的响应给代理。
  4. 随后,客户端、代理和服务器之间的双向流数据就可以通过这个隧道进行传输。

这种方法能够使得数据的传输过程更加透明且安全,特别适用于需要高效通信和端到端加密的场景。

下图展示了 HTTP2 Connect 方法建立隧道的基本过程。

image
HTTP2 Connect 方法建立隧道的基本过程

Demo:使用 Envoy 与上游 Server 建立 HTTP/2 Connect 隧道

本示例展示了一个基础场景:

  1. 客户端:向 Envoy 代理发送文本消息。
  2. Envoy:接收客户端的 TCP 数据,将其封装为 HTTP/2 CONNECT 请求,并与上游服务器建立加密隧道。
  3. 服务器:接收来自 Envoy 的 HTTP/2 CONNECT 流量,解封装并返回响应给客户端。

架构图如下:

image
架构图

我们将使用 Node.js 来编写客户端和服务端,并将服务端和 Envoy 代理运行在容器中,在本地通过客户端访问 Envoy 代理从而达到访问客户端的目的。

完整的目录结构如下:

envoy-http2-tunnel/
├── certs/
│   ├── openssl.cnf
│   ├── server.crt
│   ├── server.key
├── client/
│   └── client.js
├── docker-compose.yml
├── envoy.yaml
└── server/
    ├── Dockerfile
    └── server.js

核心功能展示

1. HTTP/2 CONNECT 隧道的基本实现

  • 客户端通过普通的 TCP 连接与 Envoy 通信。
  • Envoy 将 TCP 数据封装为 HTTP/2 CONNECT 请求,发送到上游服务器。
  • 服务器接收并解封装隧道中的数据,进行处理后返回响应。
  • 隧道通信对客户端完全透明。

2. Envoy 的透明代理能力

  • Envoy 作为中间代理,将客户端与服务器之间的通信逻辑完全封装。
  • 客户端无需支持复杂的协议(如 HTTP/2 或 TLS),Envoy 代理完成所有协议转换。

3. 加密通信的实现

  • Envoy 与服务器之间的通信通过 TLS 加密,确保隧道内的数据安全。
  • 服务器终止 TLS,处理解密后的数据。

4. 隧道的简化使用场景

  • 通过该 Demo,可以快速理解 HTTP/2 CONNECT 隧道的建立和基本数据传输流程。

环境准备

1. 安装 Node.js

确保你的系统已安装 Node.js(版本 >= 10.10.0),因为 http2 模块在该版本后稳定。

2. 安装 Docker 和 Docker Compose

3. 创建项目目录

在你的工作空间中创建一个新目录并进入:

mkdir envoy-http2-tunnel
cd envoy-http2-tunnel

生成自签名证书

由于 Envoy 和服务器之间需要加密通信,我们需要生成包含正确配置的自签名证书。

1. 创建证书目录和 OpenSSL 配置文件

创建 certs 目录:

mkdir certs
cd certs

创建 openssl.cnf,内容如下:

[ req ]
default_bits       = 2048
default_md         = sha256
prompt             = no
distinguished_name = dn
req_extensions     = req_ext

[ dn ]
C            = US
ST           = California
L            = San Francisco
O            = My Company
OU           = My Division
CN           = server

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1   = server
DNS.2   = localhost

2. 生成密钥和证书

运行以下命令生成密钥和证书:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout server.key -out server.crt -config openssl.cnf

这将在 certs 目录中生成 server.keyserver.crt 文件。

配置 Envoy 代理

我们需要配置 Envoy,使其能够接受客户端的普通 TCP 连接,将数据通过 HTTP/2 CONNECT 隧道传递给服务器。

1. 创建 Envoy 配置文件

在项目根目录创建 envoy.yaml,内容如下:

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        protocol: TCP
        address: 0.0.0.0
        port_value: 10000
    filter_chains:
    - filters:
      - name: envoy.filters.network.tcp_proxy
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
          stat_prefix: tcp_stats
          cluster: tunnel_cluster
          tunneling_config:
            hostname: server:8080
          access_log:
          - name: envoy.access_loggers.stdout
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
              log_format:
                json_format:
                  start_time: "%START_TIME%"
                  method: "%REQ(:METHOD)%"
                  path: "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%"
                  protocol: "%PROTOCOL%"
                  response_code: "%RESPONSE_CODE%"
                  response_flags: "%RESPONSE_FLAGS%"
                  bytes_received: "%BYTES_RECEIVED%"
                  bytes_sent: "%BYTES_SENT%"
                  duration: "%DURATION%"
                  upstream_service_time: "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%"
                  x_forwarded_for: "%REQ(X-FORWARDED-FOR)%"
                  user_agent: "%REQ(USER-AGENT)%"
                  request_id: "%REQ(X-REQUEST-ID)%"
                  upstream_host: "%UPSTREAM_HOST%"
                  upstream_cluster: "%UPSTREAM_CLUSTER%"
                  downstream_local_address: "%DOWNSTREAM_LOCAL_ADDRESS%"
                  downstream_remote_address: "%DOWNSTREAM_REMOTE_ADDRESS%"
  clusters:
  - name: tunnel_cluster
    connect_timeout: 5s
    type: LOGICAL_DNS
    lb_policy: ROUND_ROBIN
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
        sni: server
        common_tls_context:
          validation_context:
            trusted_ca:
              filename: "/certs/server.crt"
          alpn_protocols: [ "h2" ]
    http2_protocol_options: {}
    load_assignment:
      cluster_name: tunnel_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: server
                port_value: 8080

2. 关键点

  • Envoy 监听 TCP 连接,将流量通过 HTTP/2 CONNECT 隧道转发到服务器。
  • 客户端只需与 Envoy 建立 TCP 连接,发送文本消息。
  • Envoy负责隧道的建立和加密,客户端无需感知。

实现服务器

1. 创建服务器目录和文件

在项目根目录创建 server 目录:

mkdir server

server 目录中创建 server.jsDockerfile

2. 编写 server.js

server/server.js 中添加以下代码:

const http2 = require('http2');
const fs = require('fs');

const server = http2.createSecureServer({
  key: fs.readFileSync('/certs/server.key'),
  cert: fs.readFileSync('/certs/server.crt'),
});

server.on('stream', (stream, headers) => {
  const method = headers[':method'];
  const path = headers[':path'];

  if (method === 'CONNECT') {
    console.log(`Received CONNECT request for ${path}`);

    // 响应 200,建立隧道
    stream.respond({
      ':status': 200,
    });

    // 在隧道内处理数据
    stream.on('data', (chunk) => {
      const message = chunk.toString();
      console.log(`Received from client: ${message}`);

      // 回应客户端
      const response = `Echo from server: ${message}`;
      stream.write(response);
    });

    stream.on('end', () => {
      console.log('Stream ended by client.');
      stream.end();
    });
  } else {
    // 对于非 CONNECT 请求,返回 404
    stream.respond({
      ':status': 404,
    });
    stream.end();
  }
});

server.listen(8080, () => {
  console.log('Secure HTTP/2 server is listening on port 8080');
});

注意:

  • 监听 secureConnection 事件,直接处理 TLS 连接后的 socket。
  • 在 socket 上接收数据,处理来自客户端的文本消息,并回复。

3. 创建 Dockerfile

server/Dockerfile 中添加以下内容:

FROM node:14

WORKDIR /app

COPY server.js .

EXPOSE 8080

CMD ["node", "server.js"]

实现客户端

1. 创建客户端目录和文件

在项目根目录创建 client 目录:

mkdir client

client 目录中创建 client.js

2. 编写 client.js

client/client.js 中添加以下代码:

const net = require('net');

// 创建与 Envoy 的 TCP 连接
const client = net.createConnection({ port: 10000 }, () => {
  console.log('Connected to Envoy.');

  // 发送消息给服务器
  let counter = 1;
  const interval = setInterval(() => {
    const message = `Message ${counter} from client!`;
    client.write(message);
    counter += 1;
  }, 1000);

  // 关闭连接
  setTimeout(() => {
    clearInterval(interval);
    client.end();
  }, 5000);
});

client.on('data', (data) => {
  console.log(`Received from server: ${data.toString()}`);
});

client.on('end', () => {
  console.log('Disconnected from server.');
});

client.on('error', (err) => {
  console.error('Client error:', err);
});

说明:

  • 客户端Envoy 建立普通的 TCP 连接,发送文本消息。
  • 该客户端的存在只是为了触发 Envoy 与服务器建立隧道。

创建 Docker Compose 文件

在项目根目录创建 docker-compose.yml

version: '3.8'

services:
  envoy:
    image: envoyproxy/envoy:v1.32.1
    volumes:
      - ./envoy.yaml:/etc/envoy/envoy.yaml
      - ./certs:/certs  # 挂载证书目录
    ports:
      - "10000:10000"
    networks:
      - envoy_network
    depends_on:
      - server
    command: /usr/local/bin/envoy -c /etc/envoy/envoy.yaml --service-cluster envoy --log-level debug

  server:
    build:
      context: ./server
    networks:
      - envoy_network
    expose:
      - "8080"
    volumes:
      - ./certs:/certs  # 挂载证书目录

networks:
  envoy_network:

运行示例

1. 启动 Docker Compose

在项目根目录下,运行:

docker-compose up --build

预期输出:

  • Envoy 容器: 显示启动信息和调试日志。
  • 服务器容器: 显示 Secure HTTP/2 server is listening on port 8080

2. 运行客户端

打开新的终端窗口,进入 client 目录:

cd client

运行客户端:

node client.js

预期输出:

Connected to Envoy.
Received from server: Echo from server: Message 1 from client!
Received from server: Echo from server: Message 2 from client!
Received from server: Echo from server: Message 3 from client!
Received from server: Echo from server: Message 4 from client!
Received from server: Echo from server: Message 5 from client!
Disconnected from server.

3. 检查服务器日志

在 Docker Compose 的输出中,你应该能看到服务器的日志:

envoy_1   | {"downstream_remote_address":"192.168.65.1:46306","path":null,"request_id":null,"bytes_sent":160,"protocol":null,"upstream_service_time":null,"bytes_received":88,"response_code":0,"user_agent":null,"downstream_local_address":"172.21.0.3:10000","upstream_host":"172.21.0.2:8080","start_time":"2024-12-03T11:37:59.542Z","upstream_cluster":"tunnel_cluster","duration":5012,"response_flags":"-","method":null,"x_forwarded_for":null}
server_1  | Secure HTTP/2 server is listening on port 8080
server_1  | New secure connection established.
server_1  | Received from client: Message 1 from client!
server_1  | Received from client: Message 2 from client!
server_1  | Received from client: Message 3 from client!
server_1  | Received from client: Message 4 from client!
server_1  | Received from client: Message 5 from client!
server_1  | Connection ended by client.

4. 检查 Envoy 日志

在 Envoy 的日志中,你可以看到它使用 HTTP/2 CONNECT 隧道与服务器建立连接的记录。

测试通信

  • 客户端通过 TCP 连接向 Envoy 代理发送文本消息。
  • Envoy将客户端的 TCP 流量通过 HTTP/2 CONNECT 隧道转发给 服务器
  • 服务器接收到来自客户端的消息,处理并回复。
  • Envoy将服务器的回复通过隧道传回给 客户端
  • 客户端收到服务器的回复。

注意事项

  • 证书管理: 确保证书正确配置,并在 Envoy 和服务器中正确使用。
  • Docker 网络: 使用 Docker Compose 定义的网络,容器可以通过服务名称互相通信。
  • 端口冲突: 确保端口 10000(Envoy)和 8080(服务器)未被占用。
  • TLS 配置: 在示例中,Envoy 与服务器之间的通信使用 TLS 和 HTTP/2,确保了安全性。

隧道建立过程

下图展示了客户端、Envoy 代理和服务器之间的交互,反映了数据的传递和隧道连接的建立的流程。

image
隧道建立流程

说明:

  1. 客户端与 Envoy 建立 TCP 连接

    • 客户端向 Envoy 发起 TCP 连接请求。
    • Envoy 接受连接,建立新的 TCP 代理会话(ConnectionId: 0)。
  2. Envoy 创建到服务器的连接

    • Envoy 尝试连接上游集群 tunnel_cluster,创建新的连接(ConnectionId: 1)。
  3. 建立 HTTP/2 CONNECT 隧道

    • Envoy 与服务器建立 HTTP/2 连接。
    • Envoy 发送 HTTP/2 CONNECT 请求,目标主机名为 server:8080
    • 服务器响应 200 OK,隧道建立成功。
  4. 数据传输

    • 消息传递循环
      • 客户端发送数据(Message N)到 Envoy。
      • Envoy 将数据通过隧道转发给服务器。
      • 服务器处理数据并返回响应(Echo Message N)给 Envoy。
      • Envoy 将响应转发给客户端。
    • 日志记录
      • 服务器记录收到的消息,例如 Received from client: Message N from client!
  5. 连接关闭

    • 客户端发送 FIN 请求,通知关闭连接。
    • Envoy 将 FIN 转发给服务器,关闭隧道。
    • 服务器响应 ACK 确认关闭。
    • Envoy 向客户端发送 ACK,完成连接关闭。
  6. 日志记录

    • Envoy 记录连接关闭日志,包括 ConnectionId 和统计信息。
    • 服务器记录日志,显示流已由客户端结束,例如 Stream ended by client.

结语

虽然这是一个入门示例,但它为理解和进一步探索 HTTP/2 CONNECT 隧道功能提供了坚实的基础。在下一篇博客中讲解通过两个 Envoy 代理实现的隧道,带你进一步了解 Istio ambient 模式中的 HBONE 透明隧道。

参考

AI 工具推荐 Napkin.ai:让复杂想法一键变成直观图表

2025-01-09 18:26:54

在工作中,我们经常需要清晰地传达复杂的想法,但单靠文字有时候实在不够直观。这时候,一张清晰的图表往往能让人一眼看懂你的思路。

image
抽象概念可视化的好处(本图使用 napkin.ai 生成)

今天想给大家推荐一个特别好用的工具——Napkin.ai。它可以自动把你的文字内容变成图表,比如信息图、流程图等等,让你的想法更容易被理解和传播。

image
Napkin 界面

Napkin.ai 的核心功能

  1. 文本自动变图表:把文字粘贴到 Napkin.ai,系统会自动生成相关的图表,完全不用自己动手画。
  2. 图表样式多样:根据你的内容,Napkin.ai 会提供多种图表样式,你可以选择最适合的那个。
  3. 支持自定义:图表生成后还能调整,比如更改图标、颜色、字体等,让它看起来更符合你的风格。
  4. 多种格式导出:生成的图表可以导出为 PNG、SVG 或 PDF,用起来很方便。

适合谁用

image
Napkin 如何提升沟通效率(本图使用 napkin.ai 生成)

不管你是市场营销人员、内容创作者,还是需要做商业演示的专业人士,Napkin.ai 都能帮你提升沟通效果,让你的内容更吸引人。

如何开始?

  1. 打开 napkin.ai
  2. 注册一个账号(免费),目前高级版本还在 beta 阶段,暂未收费,未来的收费还未公开。
  3. 粘贴文字,生成图表,然后根据需要调整。
  4. 导出图表,用在你的工作或分享中。

这款工具真的非常方便,试一次就会爱上!支持中文,而且免费使用,无次数限制。如果你也需要一个帮手来把复杂想法变得更直观,赶紧去试试吧!

Cilium 2024 年度报告解读

2025-01-07 18:28:38

近日 Cilium 项目发布了 2024 年度报告,见 Github。这份报告详细回顾了 Cilium 在过去一年中所取得的重大成就,并展望了其在云原生网络和安全领域的未来发展方向。Cilium 项目自首次提交以来,历经近十年发展,其势头持续强劲,正引领云原生网络和安全领域的新变革。

image
Cilium 2024 年度报告概述

Cilium 的卓越发展

2024 年是 Cilium 发展历程中至关重要的一年,它不仅巩固了其作为 Kubernetes 事实标准 CNI 的地位,更发展成为 Kubernetes 环境下的综合网络堆栈。Cilium 的演进展示了其应对现代云原生环境挑战的卓越能力,从最初的 pod 到 pod 连接方案,扩展到一个统一网络、可观察性和安全性的项目,这一切都由 eBPF 技术驱动。

image
Cilium 在 2024 年的演变

关键里程碑与重大成就

image
关键里程碑与重大成就
  • 社区蓬勃发展:Cilium 社区持续壮大,贡献者和贡献公司数量不断增加,用户遍布金融、物流、媒体、电信等众多行业。自加入 CNCF 以来,贡献公司数量增长了 90%,达到 1,011 家,个人贡献者增长了 252%,达到 4,464 人。Cilium 还是 CNCF 生态系统中第三大发展最快的项目。
  • 技术创新:Cilium 在 2024 年发布了 1.15 和 1.16 两个主要版本,带来了诸多创新功能。
    • Cilium 1.15: 引入了对 Gateway API 1.0 的全面支持,使 Cluster Mesh 的可扩展性翻倍,增强了可观测性,将流量与网络策略关联,并扩展了 BGP 的功能,以更好地集成外部世界。
    • Cilium 1.16: 以“更快、更强、更智能”为主题,通过 netkit 消除了虚拟网络开销,实现了主机和容器之间的性能对等;引入了 BGPv2 API,支持用户定义复杂的网络策略;支持多播数据路径;并显著优化了 CPU 和内存使用,同时将尾部延迟降低了高达 5 倍。
  • 广泛应用:用户调查显示,Cilium 正在逐步接管 Kubernetes 网络堆栈,Cluster Mesh、BGP 和 Gateway API 等功能已广泛应用于生产环境。95% 的受访者运行多个 Kubernetes 集群,而 Cilium 被 CNCF 技术雷达评为顶级多集群管理工具。
  • 行业认可:Cilium 荣获 OpenUK 2024 年度开源软件奖。同时,在 CNCF 的多集群管理技术雷达中,Cilium 被评为最值得采用的技术,并在实用性和成熟度方面均获得最高分。
  • eBPF 安全:eBPF 基金会发布了两份重要研究报告,提升了基于 eBPF 部署的安全性与操作指导:
    • eBPF 安全威胁模型:详细阐述了 eBPF 的潜在风险,并提供了相应的缓解策略。
    • eBPF 验证器代码审计:强调了验证器在保障 eBPF 部署安全方面的作用,并提出了改进建议。

用户反馈与应用案例

来自用户的反馈和案例进一步印证了 Cilium 在性能、成本效益以及功能方面的优势。用户普遍认为,Cilium 有效降低了网络成本和 CPU 消耗,同时提供了卓越的性能和低延迟。此外,Cilium 的可观察性工具(如 Hubble)以及网络策略功能也受到了用户的广泛好评。

未来展望

image
Cilium 2025 年发展展望

展望 2025 年,Cilium 的发展势头将持续增强。平台工程和整合趋势正在重塑组织管理 Kubernetes 网络的方式,而 Cilium 正处于这场变革的核心。我们预计:

  • Cilium 堆栈将进一步整合网络功能。
  • Tetragon 在高级安全可观察性方面的应用将更加普及。
  • Cilium 将更深入地集成外部和传统工作负载至 Kubernetes 环境。
  • Cilium 不仅会被广泛用作 CNI,更将作为全面的 Kubernetes 网络解决方案。
  • Tetragon 将不断进化,提供更强大的检测能力和更具行动力的威胁响应方案。
  • Cilium 的混合云和多云集成将在 2025 年发挥更大的作用。

Cilium 对外部工作负载、4 层负载均衡以及 BGP 增强功能的支持将弥合 Kubernetes 原生系统与传统系统之间的鸿沟。

总结

Cilium 项目在 2024 年取得了巨大成功,确立了其在 Kubernetes 网络领域的领导地位。Cilium 不仅仅是一个 CNI,更是一个涵盖网络、可观察性和安全性的综合 Kubernetes 网络解决方案。随着云原生技术的不断发展,Cilium 将继续引领行业创新,为用户提供更强大、更可靠的云原生网络解决方案。

:本文中的图片利用 napkin.ai 制作。

Istio Ambient 模式中的数据包生命周期及流量优化

2025-01-07 15:07:30

本文围绕 Istio Ambient 模式下的数据包生命周期进行深入剖析,从初始数据包的流量拦截与目标解析,到后续数据包的快速转发与优化策略,帮助读者理解 Ambient 模式背后的技术逻辑和性能实践。

数据包生命周期概览:从内核态到用户态

在 Ambient 模式中,数据包的处理路径从 Pod 内核态网络栈开始,经由 iptables 规则被拦截后进入 ztunnel 的用户态处理逻辑。ztunnel 负责透明代理、策略验证、加密隧道建立等任务,最终将数据包通过内核态网络再次转发给目标服务或下一个 ztunnel。其核心思想是通过首次数据包的详细解析和标记,为后续数据包铺路,从而减少重复开销。

下图展示了 Istio Ambient 模式中从 Pod 到 ztunnel 的数据包生命周期:

image
Istio Ambient 模式中从 Pod 到 ztunnel 的数据包生命周期

接下来,我们将详细介绍首个数据包与后续数据包的处理路径,并分析其中的技术要点与优化手段。

首个数据包路径:从拦截到目标解析

当应用程序在 Pod 内发出数据包(如 HTTP 请求),数据包首先经过 Pod 的网络命名空间和内核态网络栈进行处理。

透明拦截与目标解析

iptables 规则对出站流量进行筛选,若发现目标地址为非本地资源且数据包未携带特定标记,则将数据包重定向至 ztunnel 的透明代理端口(如 1500615008)。借助 IP_TRANSPARENTSO_ORIGINAL_DST 选项,ztunnel 可提取数据包的原始目标地址,实现无缝透明代理。

用户态处理:策略验证与加密隧道

数据包进入 ztunnel 用户态后,将经历以下处理流程:

  1. 策略验证:RBAC 验证、mTLS 加密判定。
  2. 目标流量处理:对网格内部流量,通过 HTTP/2 CONNECT 隧道(HBONE)加密与跨节点传输;对网格外流量,直接通过本地 TCP 连接透传。

完成处理后,ztunnel 基于数据包解析结果建立出站连接(如 HTTP/2 隧道或明文 TCP),并将数据包送回内核态,最终转发至目标服务或下一个 ztunnel。

后续数据包路径:利用 Conntrack 与隧道复用

首个数据包完成解析与策略验证后,Linux 内核的连接跟踪(conntrack)记录连接状态与标记。后续数据包无需再次经历复杂的拦截与解析,直接进入 ztunnel 的 inbound socket。

连接跟踪与快速转发

后续数据包基于 conntrack 跟踪机制,快速到达 ztunnel 的 inbound socket。ztunnel 可直接识别目标地址与安全策略,避免重复的解析与验证。

隧道与明文连接优化

  1. HBONE 隧道:支持多路复用,提高加密流量处理效率。
  2. 明文连接:对无需加密的流量,直接复用现有 TCP 连接,进一步减少处理开销。

技术要点与优化策略

  • 透明代理:利用 IP_TRANSPARENT 实现透明流量捕获与目标解析。
  • 内核与用户态高效协作:首个数据包通过用户态完成深度处理,后续数据包借助 conntrack 与 inbound socket 实现快速转发,降低上下文切换成本。
  • 多路复用:借助 HTTP/2 隧道实现高效加密与负载均衡,优化传输性能。

实践建议

  1. 多平台适配:根据平台特性调整透明代理实现。
  2. 调优与监控:结合 ztunnel 日志与服务网格监控工具,优化流量路径与性能表现。

总结

Istio Ambient 模式通过数据包生命周期设计,在透明代理、性能优化与安全策略间实现平衡。zTunnel 通过高效的用户态处理与内核态快速转发,将应用程序的透明体验与底层网络优化有效结合,助力服务网格的实践与推广。