This guide walks through deploying Praxis on a Kubernetes cluster and routing HTTP traffic through it.
- Kubernetes 1.32+
- kubectl configured for your cluster
- Gateway API CRDs installed (v1.5.1)
- A LoadBalancer provider (MetalLB for bare-metal/KIND, or a cloud provider)
Install the Gateway API CRDs if you haven't already:
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.5.1/standard-install.yamlApply the operator manifests:
kubectl apply -f https://raw.githubusercontent.com/praxis-proxy/praxis-operator/main/deploy/rbac.yaml
kubectl apply -f https://raw.githubusercontent.com/praxis-proxy/praxis-operator/main/deploy/deployment.yaml
kubectl apply -f https://raw.githubusercontent.com/praxis-proxy/praxis-operator/main/deploy/gatewayclass.yamlThis creates:
- A
praxis-systemnamespace with the operator Deployment and RBAC - A
praxisGatewayClass registered with controller namepraxis.sh/gateway-controller
Verify the operator is running:
kubectl -n praxis-system rollout status \
deployment/praxis-operatorVerify the GatewayClass is accepted:
kubectl get gatewayclass praxisThe ACCEPTED column should show True.
Create a namespace and a simple HTTP echo service:
apiVersion: v1
kind: Namespace
metadata:
name: demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo
namespace: demo
spec:
replicas: 1
selector:
matchLabels:
app: echo
template:
metadata:
labels:
app: echo
spec:
containers:
- name: echo
image: hashicorp/http-echo
args: ["-text=hello from praxis"]
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: echo
namespace: demo
spec:
selector:
app: echo
ports:
- port: 5678
targetPort: 5678kubectl apply -f backend.yaml
kubectl -n demo rollout status deployment/echoCreate a Gateway with an HTTP listener on port 8080:
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: my-gateway
namespace: demo
spec:
gatewayClassName: praxis
listeners:
- name: http
port: 8080
protocol: HTTPkubectl apply -f gateway.yamlWait for the Gateway to become programmed:
kubectl -n demo get gateway my-gatewayThe PROGRAMMED column should show True. The
operator creates a Deployment, ConfigMap, and
LoadBalancer Service named praxis-my-gateway in the
demo namespace.
Route traffic from the Gateway to the echo backend:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: echo-route
namespace: demo
spec:
parentRefs:
- name: my-gateway
rules:
- backendRefs:
- name: echo
port: 5678kubectl apply -f httproute.yamlVerify the route is accepted:
kubectl -n demo get httproute echo-routeGet the Gateway's assigned address:
GW_IP=$(kubectl -n demo get gateway my-gateway \
-o jsonpath='{.status.addresses[0].value}')
echo "${GW_IP}"Send a request:
curl http://${GW_IP}:8080/Expected output:
hello from praxiskubectl delete namespace demoThe Gateway's child resources (Deployment, ConfigMap, Service) are automatically deleted via owner references.
- Architecture: how the operator works internally
- Gateway API Support: supported features and conformance status
- Configuration: environment variables, RBAC, and resource tuning
- Troubleshooting: common problems and debugging