Spin up a Palworld dedicated server on Kubernetes with one CR.
You declare a PalworldServer; the operator builds Deployment, PVC, services, and Envoy Gateway exposure around the official Pocketpair image.
Congrats to Pocketpair on Palworld 1.0 — 1.0 announcement · Steam.
Site: dataknifeai.github.io/palworld-operator · Operator image: harbor.dataknife.net/library/palworld-operator
flowchart LR
CR["PalworldServer CR"] --> Op["Operator"]
Op --> Stack["Deployment · PVC · Services<br/>ConfigMap · Secret"]
Stack --> EG["Envoy Gateway"]
EG --> Players["Players"]
- Default game image:
ghcr.io/pocketpairjp/palserver - Credentials: bring-your-own Secret refs, or set
spec.generateSecrets: true - No cluster? Same official image via Docker Compose (
make compose-up)
Full resource layout: docs/ARCHITECTURE.md.
cp compose/.env.example compose/.env # set SERVER_PASSWORD / ADMIN_PASSWORD
make compose-up
# Join Multiplayer Game → 127.0.0.1:8211
make compose-downDetails (RAM, ports, LAN): docs/LOCAL.md.
Prerequisites: Kubernetes 1.28+, Envoy Gateway (GatewayClass envoy), a StorageClass for saves, and one dedicated external IP per server (spec.gateway.address).
# Optional: bring-your-own credentials (skip if using spec.generateSecrets: true)
kubectl -n game-servers create secret generic palworld-server-secrets \
--from-literal=admin-password='CHANGE_ME_ADMIN' \
--from-literal=server-password='CHANGE_ME_JOIN'
kubectl apply -k config/default
kubectl apply -f config/samples/palworld_v1alpha1_palworldserver.yaml
kubectl get palworldserver -n game-serversConnect with .status.connectionAddress / .status.connectionPort (default 8211 UDP).
The operator learns/seeds DedicatedServerName from REST worldguid (or spec.dedicatedServerName) so Recreate rolls keep the world. Opt-in image auto-update: spec.update.autoUpdateImage (see docs/PALWORLD_SERVER.md).
Read join/admin passwords from the credentials Secret (docs/CONNECT.md):
kubectl get secret palworld-server-secrets -n game-servers \
-o jsonpath='{.data.server-password}' | base64 -d; echoTune the sample CR for VIP, StorageClass, and resources — BYO Secret or generateSecrets: true.
kubectl delete palworldserver palworld-server -n game-servers| Doc | Contents |
|---|---|
| docs/FAQ.md | Incapable version, passwords, world pin, updates, sizing |
| docs/LOCAL.md | Docker Compose — local / minimal PC |
| docs/CONNECT.md | In-game join, passwords, community, crossplay |
| docs/ARCHITECTURE.md | Owned resources, Gateway layout |
| docs/PALWORLD_SERVER.md | Ports, mounts, INI/env, Steam updates |
| docs/GITLAB_MIRROR.md | GitHub CI + GitLab Harbor publish |
| CHANGELOG.md | Release notes / known gaps |
Go 1.25+ and golangci-lint. Common targets: make generate manifests, make test, make lint, make ci, make build.
See docs/GITLAB_MIRROR.md and TASKS.md.
Apache License 2.0 — see LICENSE. Maintained by DataKnifeAI.
