This episode dissects the Multigress architecture: the control plane and data plane, the components of the multigress controller, integration with the Gateway API, the Envoy or HAProxy backend, the traffic flow from GatewayClass to HTTPRoute, and Multigress-specific CRDs.

Now that you understand why Multigress exists, it's time to dissect how it works internally. Episode 2 explains the main architecture of Multigress: the separation of control plane and data plane, the components involved, the request flow from client to backend pod, and how Multigress integrates with the Kubernetes Gateway API.
This architecture is the foundation for all the practical episodes that follow. If you understand who reads the configuration and who processes traffic, troubleshooting in episodes 7 and 20 will feel much easier.
The control plane is the brain of Multigress. Its main component is the multigress-controller, a pod that watches Kubernetes resources like GatewayClass, Gateway, and HTTPRoute. When something changes, the controller compares the actual state with the desired state, then pushes new configuration to the data plane.
The controller also manages status: you can see the Accepted or Ready conditions on every resource, and if there's an error, the controller writes it into the status.conditions field.
The data plane is the hand that processes every request. By default, Multigress uses Envoy as the proxy — chosen for its rich filter ecosystem, HTTP/2 and HTTP/3 support, and built-in observability. The second option is HAProxy for teams more comfortable with traditional configuration.
kubectl apply -f route.yaml → multigress-controller → Envoy/HAProxy → backend podThe flow above happens within seconds of you applying a route.
When you apply configuration, there are four objects connected to each other:
multigress. A cluster can have several classes.apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: multigress
spec:
controllerName: multigress.io/multigress-controller
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: main-gateway
namespace: multigress-system
spec:
gatewayClassName: multigress
listeners:
- name: http
protocol: HTTP
port: 80The manifest above is the minimal pair used throughout the series. After applying it, check its status:
kubectl get gateway main-gateway -n multigress-system
kubectl describe gateway main-gateway -n multigress-systemThe kubectl describe gateway main-gateway -n multigress-system command shows the listener conditions. Pay attention to the Status section — that's where configuration errors usually become obvious.
When an HTTP request arrives:
backendRefs.These five steps are the mental model you'll use throughout the series.
Multigress uses the stable Gateway API resources from the standard channel: GatewayClass, Gateway, HTTPRoute, TLSRoute, GRPCRoute, and ReferenceGrant. Because these are standards, your configuration can be moved to another implementation when needed — that's the core value of being vendor-neutral.
Beyond the standard, Multigress provides additional CRDs for features that don't yet exist in the core Gateway API. Some we'll use:
kubectl get crd | grep multigressAfter the installation in episode 3, the command above will show the standard Gateway API CRDs as well as the CRDs above.
Tip
Rule of thumb: use standard Gateway API resources as much as possible. Use the specific CRDs only when the standard features aren't enough, so your configuration stays portable.
Episode 2 mapped the Multigress architecture: a control plane that translates intent into configuration, an Envoy or HAProxy data plane that processes traffic, and the Gateway API resource layer that acts as the shared language between them.
The key takeaways:
In the next episode 3 we'll install Multigress in the cluster using Helm, apply the first Gateway, create a simple HTTPRoute, and verify the installation, services, and logs. Get your cluster ready — the real practice starts now.