diff --git a/.claude/skills/development-loop/bug-reports/HTTPRouteSimpleSameNamespace.md b/.claude/skills/development-loop/bug-reports/HTTPRouteSimpleSameNamespace.md index 966a7a5..1ad40c9 100644 --- a/.claude/skills/development-loop/bug-reports/HTTPRouteSimpleSameNamespace.md +++ b/.claude/skills/development-loop/bug-reports/HTTPRouteSimpleSameNamespace.md @@ -87,7 +87,7 @@ After fixing the ConfigMap SSA conflict, the ConfigMaps are now being created su ``` Returns HTTP 200 with correct response from backend. -2. **The data plane routing is working correctly.** The Pingora-based proxy successfully: +2. **The data plane routing is working correctly.** The proxy-core data plane successfully: - Loads configuration from ConfigMap - Routes requests to backend services via Kubernetes DNS - Returns proper HTTP responses diff --git a/CLAUDE.md b/CLAUDE.md index 6b7463b..c303bbb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ The current year is 2026. This file provides guidance to Claude Code (claude.ai/ ## Project Overview -Multiway is a Kubernetes [Gateway API](https://gateway-api.sigs.k8s.io/) implementation written in Rust (2024 edition). It implements a split-architecture controller: a **control plane** that reconciles Gateway API resources and a **data plane** (built on [Pingora](https://github.com/cloudflare/pingora)) that proxies HTTP traffic. The controller name is `io.multiway/gateway-controller`. +Multiway is a Kubernetes [Gateway API](https://gateway-api.sigs.k8s.io/) implementation written in Rust (2024 edition). It implements a split-architecture controller: a **control plane** that reconciles Gateway API resources and a **data plane** (built on [proxy-core](crates/proxy-core/), a [monoio](https://github.com/bytedance/monoio)-based HTTP proxy) that proxies HTTP traffic. The controller name is `io.multiway/gateway-controller`. ## Build and Development Commands @@ -64,7 +64,7 @@ Do not commit or mark work as done until validation passes. multiway/ ├── crates/ │ ├── controlplane/ # Core controller logic (binary: `multiway`) -│ ├── dataplane/ # Pingora-based HTTP proxy (binary: `multiway-dataplane`) +│ ├── dataplane/ # proxy-core HTTP proxy (binary: `multiway-dataplane`) │ └── gateway-crds/ # Auto-generated Rust bindings for Gateway API CRDs ├── .crds/v1.2.1/ # Gateway API v1.2.1 CRD YAML definitions ├── conformance/ # Gateway API conformance test suite (Docker + K8s Job) @@ -220,7 +220,7 @@ Each reconciler follows the same fetch → compute → execute pattern. ## Data Plane -The data plane (`crates/dataplane/`) is a Pingora-based HTTP proxy: +The data plane (`crates/dataplane/`) is a proxy-core (monoio-based) HTTP proxy: - **Config source**: Reads a ConfigMap (`multiway-config-{gateway_name}`) containing JSON `GatewayConfig` - **Hot reload**: Watches ConfigMap via K8s API (not filesystem mounts) using `arc-swap` for atomic config swaps @@ -248,7 +248,7 @@ Managed resource names follow the pattern `multiway-{gateway_name}`. ``` multiway version # Print version multiway controller [OPTIONS] # Run the control plane -multiway gateway [OPTIONS] # Run the data plane (Pingora) +multiway gateway [OPTIONS] # Run the data plane (proxy-core) ``` - Global options: `--log-level`, `--log-format` (text/json), `--enable-colors` diff --git a/Dockerfile b/Dockerfile index 903fe55..49a3472 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,7 +19,7 @@ ARG TARGETARCH # Install ALL build dependencies (union of controlplane + dataplane needs) # - musl-dev, pkgconfig: basic Rust/C compilation # - cmake, perl, make: aws-lc-rs (controlplane TLS) -# - clang, clang-dev, linux-headers, g++: Pingora (dataplane proxy) +# - clang, clang-dev, linux-headers, g++: monoio/io-uring (dataplane proxy) RUN apk add --no-cache \ musl-dev \ pkgconfig \ diff --git a/Dockerfile.dev b/Dockerfile.dev index 2996e24..c72516f 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -19,7 +19,7 @@ ARG TARGETARCH # Install ALL build dependencies (union of controlplane + dataplane needs) # - musl-dev, pkgconfig: basic Rust/C compilation # - cmake, perl, make: aws-lc-rs (controlplane TLS) -# - clang, clang-dev, linux-headers, g++: Pingora (dataplane proxy) +# - clang, clang-dev, linux-headers, g++: monoio/io-uring (dataplane proxy) RUN apk add --no-cache \ musl-dev \ pkgconfig \ diff --git a/README.md b/README.md index 0243f7a..4a80901 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ A Kubernetes Gateway API implementation built with Rust, featuring separate cont Multiway consists of two main components that run as separate processes in a Kubernetes cluster: - **Control Plane** (`multiway-controlplane`) - Watches Gateway API resources and configures data plane instances -- **Data Plane** (`multiway-dataplane`) - HTTP/HTTPS proxy powered by Pingora, with one deployment per Gateway resource +- **Data Plane** (`multiway-dataplane`) - HTTP/HTTPS proxy powered by proxy-core (monoio-based), with one deployment per Gateway resource ## Prerequisites diff --git a/crates/controlplane/src/cli/gateway.rs b/crates/controlplane/src/cli/gateway.rs index 9d7a804..9ef85f8 100644 --- a/crates/controlplane/src/cli/gateway.rs +++ b/crates/controlplane/src/cli/gateway.rs @@ -1,8 +1,8 @@ //! Gateway data plane command //! //! This module provides the CLI command for running the Gateway data plane. -//! The data plane is a Pingora-based HTTP proxy that reads its configuration -//! from a file (typically a ConfigMap mounted in Kubernetes). +//! The data plane is a proxy-core HTTP proxy that reads its configuration +//! from a Kubernetes ConfigMap via the API. use miette::Result; use tracing::info; @@ -34,18 +34,18 @@ impl Gateway { "Starting Gateway data plane" ); - // TODO: This is a placeholder for the Pingora-based data plane - // The actual implementation will be in the dataplane crate + // TODO: This is a placeholder — the actual data plane is in the dataplane crate + // (multiway-dataplane binary) which uses proxy-core for HTTP proxying. println!( "Gateway data plane starting with config: {}", self.config_path ); println!( - "This is a placeholder - the Pingora data plane will be implemented in the dataplane crate" + "This is a placeholder - the proxy-core data plane runs as a separate binary (multiway-dataplane)" ); // For now, just exit successfully - // In production, this would start the Pingora server + // In production, the data plane runs as multiway-dataplane Ok(()) } } diff --git a/crates/controlplane/src/cli/mod.rs b/crates/controlplane/src/cli/mod.rs index 8837491..847b84f 100644 --- a/crates/controlplane/src/cli/mod.rs +++ b/crates/controlplane/src/cli/mod.rs @@ -74,7 +74,7 @@ pub struct GatewayArgs { pub enum CliCommand { /// Print the CLI version and exit Version, - /// Run the gateway data plane (Pingora-based HTTP proxy) + /// Run the gateway data plane (proxy-core HTTP proxy) Gateway(GatewayArgs), /// Run the Gateway API controller (watches GatewayClass, Gateway, HTTPRoute) Controller(ControllerArgs), diff --git a/crates/controlplane/src/controller/gateway.rs b/crates/controlplane/src/controller/gateway.rs index bc5eeb0..7197a3a 100644 --- a/crates/controlplane/src/controller/gateway.rs +++ b/crates/controlplane/src/controller/gateway.rs @@ -8,7 +8,7 @@ //! - Gateway status reflects the state of the infrastructure //! //! For this implementation: -//! - We create a Deployment running the Pingora-based data plane +//! - We create a Deployment running the proxy-core data plane //! - We create a Service to expose the data plane //! - We create a ConfigMap with the gateway configuration //! - We update the Gateway status with addresses and listener status diff --git a/deploy/gatewayclass.yaml b/deploy/gatewayclass.yaml index d0e0572..686f8f8 100644 --- a/deploy/gatewayclass.yaml +++ b/deploy/gatewayclass.yaml @@ -6,4 +6,4 @@ metadata: app.kubernetes.io/name: multiway spec: controllerName: io.multiway/gateway-controller - description: Gateway API implementation using Pingora data plane + description: Gateway API implementation using proxy-core data plane