Skip to main content

Deploying Gate with Kubernetes as API Gateway

In this example, we will deploy Gate in K8s as API Gateway that routes requests to a defined service based on configured request URL.

info

This is just an example of deployment. You should adjust it to your infrastructure.

Prerequisites​

This tutorial uses Gate's Docker image.

Architecture​

UserYour Kubernetes clusterGate deploymentservice-1 deploymentservice-2 deploymentGate pod 1service-1 pod 1service-2 pod 1Gate pod [n]...service-1 pod [n]...service-2 pod [n]...KubernetesLoad balancerGateGate K8Sserviceservice-1 K8Sserviceservice-2 K8Sserviceservice-1service-2Gateservice-1service-2

Example configuration​

gate-api-gateway.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: gate
spec:
replicas: 3
selector:
matchLabels:
app: gate
template:
metadata:
labels:
app: gate
spec:
containers:
- name: gate
image: slashid/gate
command: [gate, --env]
ports:
- containerPort: 8080
env:
- name: GATE_PORT
value: "8080"
- name: GATE_DEFAULT_TARGET
value: http://products.default.svc.cluster.local:80/
- name: GATE_URLS_0_PATTERN
value: "*/products"
- name: GATE_URLS_0_TARGET
value: http://products.default.svc.cluster.local:80/
- name: GATE_URLS_1_PATTERN
value: "*/orders"
- name: GATE_URLS_1_TARGET
value: http://orders.default.svc.cluster.local:80/
- name: GATE_LOG_LEVEL
value: debug
- name: GATE_LOG_FORMAT
value: text
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: products
spec:
replicas: 3
selector:
matchLabels:
app: products
template:
metadata:
labels:
app: products
spec:
containers:
- name: products
image: slashid/example-service
env:
- name: PORT
value: "80"
- name: SERVICE_NAME
value: products
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: orders
spec:
replicas: 3
selector:
matchLabels:
app: orders
template:
metadata:
labels:
app: orders
spec:
containers:
- name: orders
image: slashid/example-service
env:
- name: PORT
value: "80"
- name: SERVICE_NAME
value: orders
---
apiVersion: v1
kind: Service
metadata:
labels:
app: gate
name: gate
spec:
externalTrafficPolicy: Local
ports:
- port: 8080
targetPort: 8080
selector:
app: gate
sessionAffinity: None
type: LoadBalancer
---
apiVersion: v1
kind: Service
metadata:
labels:
app: products
name: products
spec:
ports:
- port: 80
targetPort: 80
selector:
app: products
sessionAffinity: None
---
apiVersion: v1
kind: Service
metadata:
labels:
app: orders
name: orders
spec:
ports:
- port: 80
targetPort: 80
selector:
app: orders
sessionAffinity: None

Testing locally​

You can test this setup locally (for example, with Docker Desktop Kubernetes).

kubectl apply -f gate-api-gateway.yaml

Once the deployment is running, you can check if requests go through Gate.

curl -v http://localhost:8080/
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.79.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 81
< Content-Type: application/json
< Servicehostname: products-57c5667b6c-kg6qh
< Servicename: products
< Via: gate
<
{
"service_hostname": "products-57c5667b6c-kg6qh",
"service_name": "products"
}

If the Via: 1.0 gate header is present, it means that everything works properly and gate is up and running.

curl -v http://localhost:80/products
> GET /products HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.79.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 81
< Content-Type: application/json
< Servicehostname: products-57c5667b6c-kg6qh
< Servicename: products
< Via: 1.0 gate
<
{
"service_hostname": "products-57c5667b6c-kg6qh",
"service_name": "products"
}
curl -v http://localhost:80/orders

> GET /orders HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.79.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 77
< Content-Type: application/json
< Servicehostname: orders-66cfb49594-mw6nf
< Servicename: orders
< Via: 1.0 gate
<
{
"service_hostname": "orders-66cfb49594-mw6nf",
"service_name": "orders"
}