13 · 14 OctoberPocteo exhibits at BIGTECH AFRICA 2026 · Cité de la Culture, Tunis. Come and see us.bigtech.africa
Built on PKE Flex · see the product
Use case · PKE Flex

A cluster for every pull request. Gone when it merges.

Open a pull request, get a real Kubernetes cluster in your pool in about a minute. Close it, the cluster is gone.

Own API server, CRDs, RBAC
Production version and policies
URL, TLS, quotas, clean-up included
acme/shopOpen
feat: new checkout flow #1428
feat/checkout → main
P pke-bot · Preview ready in 58 s
pr-1428.preview.pocteo.tn
Your Flex pool · Team8 vCPU · 16 GB
pr-1428
pr-1431
ci-882
demo-q4
free
free
4 live · 2 freeenv=preview
pr-1428.preview.pocteo.tn
Checkout · new
Lifetime
09:12 opened 09:13 ready 11:40 merged 11:40 deleted
2 h 28 min of capacity, not a month
~1 minto a ready cluster
2 callscreate on open, delete on close
1 poolany number of previews
0environments left behind
The problem

One staging environment, one queue

Every branch waits for the same shared staging. It idles most of the week and drifts from production.

Beforeshared staging
#1428 checkout flowdeploying
#1431 VAT roundingwaiting
#1436 wishlistwaiting
#1440 bump postgresblocked
used40 of 168 h
Afterone cluster per pull request
pr-1428
pr-1431
pr-1436
pr-1440
four reviews in parallel2–4 h each
Reviews wait in line
Paid 168 h a week, used 40
Drift with every manual fix
Definition

Short-lived by design

A production-like environment that exists only while someone needs it.

Mirrors productionsame version, same policies
Made by the pipelinefrom a template, never by hand
Own datafixtures seeded on every start
One URLanyone on the team can open it
How long one lives
CI run
20 min
pull request review
2–4 h
QA campaign
2 days
workshop
1 week
permanent staging
720 h a month
Step by step

Pull request to preview URL in three minutes

Auto-plays · click a step.

Current state: Creating
Platform log · 09:12Pull request opened
$ pke flex create pr-1428 --pool team --ttl 72h \
--tag env=preview,app=shop --branch feat/checkout
Pool team: 8 vCPU, 16 GB. 4 clusters live, room for 2 more.
Creating virtual cluster pr-1428...
pr-1428
API server · starting Application · not yet URL · reserved Policies · pending
env=previewapp=shoppr=1428ttl=72h

Capacity is already reserved: creating a virtual cluster is scheduling pods, not booting machines.

Isolation

A cluster per pull request, not a namespace

Namespaces share everything cluster-wide. Dedicated clusters cost like it. Flex sits in between.

Namespace per pull request
one shared control planeno CRDs, no own versionblast radius: the whole cluster
PKE Flex: a virtual cluster each
own API server, CRDs, RBACproduction version by tagabout a minute, from your pool
Dedicated cluster each
own nodes, own control plane15–25 min to createone bill per environment
Division of labour

Two calls from your pipeline. The rest is the product.

Your pipeline
Trigger on open and close
Build the image
pke flex create pr-1428 \ --pool team --ttl 72h \ --tag env=preview,app=shop pke flex delete pr-1428
PKE Flexincluded
Cluster in about a minute
Own API server, CRDs, RBAC
pr-N.preview.your-domain
TLS on the wildcard
Version and policies by tag
Quotas from the pool
TTL, sleep, delete
SSO kubeconfig per cluster
Fixtures or masked snapshot
gVisor sandboxes
Cost

Pay for the pool, not per environment

Reserve a pool once. Previews come and go inside it; the invoice does not move.

How many previews fit in your pool?

6previews at once in a Team pool

With previews that live about 3 hours, that is room for roughly 12 pull requests a day, 264 a month, with no change to the pool.

vCPU is the limit here (1 + 0.3 per cluster). Control plane of each virtual cluster included. Pools on the PKE Flex page.

One week, hour by hour paid, idle · 168 hstaging used · 40 ha preview · 2–4 h
1 poolreserved, billed monthly
0fees per environment
Liveupgrade, no restart
Data

Every preview gets its own data

Seeded by the template, deleted with the cluster.

Database with fixturesseeded in seconds, syntheticdefault
Masked snapshot from Primeproduction-shaped, PII maskedregression tests
Schema onlymigrations, no rowsmigration reviews
Shared staging databasepreviews contaminate each otheravoid
Beyond pull requests

The same pattern, six more ways

Create from a template, tag it, use it, delete it.

Tests per pipeline runa fresh cluster each run
QA on demandan afternoon on the release branch
Demo environmentsone per prospect, gone after the call
Training and workshopsa cluster per trainee
Coding-agent sandboxesown cluster, hard TTL
Hotfix rehearsalproduction's exact version
Wiring

Two calls from your pipeline, or none with Argo CD

Every Flex cluster is registered in your Argo CD with its tags the moment it exists.

1Open → create the cluster
2Push → redeploy the same cluster
3Close → delete it. The TTL does it anyway.
.github/workflows/preview.yml
# .github/workflows/preview.yml on: pull_request: types: [opened, synchronize, closed] jobs: preview: runs-on: ubuntu-latest env: CLUSTER: pr-${{ github.event.number }} steps: - uses: actions/checkout@v4 - name: Create the preview cluster (idempotent) if: github.event.action != 'closed' run: | pke flex create $CLUSTER --pool team --ttl 72h \ --tag env=preview,app=shop \ --branch ${{ github.head_ref }} - name: Deploy this commit if: github.event.action != 'closed' run: | helm upgrade --install shop ./deploy/chart \ --kubeconfig $CLUSTER.kubeconfig \ --set image.tag=$CLUSTER-${{ github.sha }} \ --set ingress.host=$CLUSTER.preview.pocteo.tn - name: Comment the URL if: github.event.action == 'opened' run: gh pr comment ${{ github.event.number }} \ --body "Preview ready: https://$CLUSTER.preview.pocteo.tn" - name: Delete it when the pull request closes if: github.event.action == 'closed' run: pke flex delete $CLUSTER
Create on open, redeploy on every push, comment the URL once, delete on close. pke flex create is idempotent, so the same job serves open and synchronize.
Getting started

A working week to previews on every pull request

Day 1One service, one label
Day 2Data fixtures
Day 3Tests on the preview
Day 4Quotas, TTL, sleep
Day 5Every repository

Give your next pull request its own cluster

Reserve a pool, add the workflow, open a pull request.