Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 4 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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`
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile.dev
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
12 changes: 6 additions & 6 deletions crates/controlplane/src/cli/gateway.rs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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(())
}
}
Expand Down
2 changes: 1 addition & 1 deletion crates/controlplane/src/cli/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
2 changes: 1 addition & 1 deletion crates/controlplane/src/controller/gateway.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion deploy/gatewayclass.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Loading