Platform Architecture Basics
This section introduces the building blocks of an internal developer platform on Kubernetes, contrasting a paved, self-service path with raw cluster access.
Search across all documentation pages
This section introduces the building blocks of an internal developer platform on Kubernetes, contrasting a paved, self-service path with raw cluster access.
The examples move from a single Deployment a developer might write by hand toward the abstractions a platform provides.
kubectl configured (containerd is the node runtime).# verify your tooling versions
kubectl version --short
docker version --format '{{.Server.Version}}'
helm version --shortWithout abstraction, every team hand-writes the same boilerplate.
apiVersion: apps/v1
kind: Deployment
metadata:
name: checkout-api
spec:
replicas: 2
selector:
matchLabels:
app: checkout-api
template:
metadata:
labels:
app: checkout-api
spec:
containers:
- name: app
image: registry.example.com/checkout-api:1.4.0
ports:
- containerPort: 8080Requests and limits are the baseline for scheduling and stability.
resources:
requests:
cpu: "250m"
memory: "256Mi"
limits:
memory: "512Mi"Probes let Kubernetes route traffic and restart correctly.
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
livenessProbe:
httpGet:
path: /healthz
port: 8080Security defaults belong in the golden path, not in a developer's memory.
securityContext:
runAsNonRoot: true
allowPrivilegeEscalation: false
seccompProfile:
type: RuntimeDefault
capabilities:
drop: ["ALL"]runAsNonRoot aligns with the restricted Pod Security Standard.RuntimeDefault seccomp blocks dangerous syscalls.A Service gives pods a stable virtual IP and DNS name.
apiVersion: v1
kind: Service
metadata:
name: checkout-api
spec:
selector:
app: checkout-api
ports:
- port: 80
targetPort: 8080port is what clients call; targetPort is the container port.checkout-api.<namespace>.svc.Docker builds the artifact; containerd runs it in-cluster.
# multi-stage build keeps the runtime image small and rootless
FROM golang:1.23 AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /app ./cmd/checkout
FROM gcr.io/distroless/static:nonroot
COPY --from=build /app /app
USER nonroot
ENTRYPOINT ["/app"]nonroot base pairs with runAsNonRoot.docker build uses BuildKit by default in Engine 29.Start closed and open only what is needed.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes: ["Ingress"]podSelector matches every pod in the namespace.ingress rules, all inbound traffic is denied.The platform wires horizontal scaling from a single input.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: checkout-api
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: checkout-api
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70minReplicas and maxReplicas on CPU.autoscaling/v2 API supports memory and custom metrics too.Instead of kubectl apply, the platform reconciles from Git.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: checkout-api
namespace: argocd
spec:
project: default
source:
repoURL: https://git.example.com/apps/checkout-api
path: deploy
targetRevision: main
destination:
server: https://kubernetes.default.svc
namespace: checkout
syncPolicy:
automated:
prune: true
selfHeal: trueselfHeal reverts manual drift back to the declared state.prune removes resources deleted from Git.A chart turns the developer's small input into full manifests.
# render what the platform would apply, from a few values
helm template checkout-api ./golden-path-chart \
--set image=registry.example.com/checkout-api:1.4.0 \
--set port=8080helm template lets teams preview the generated output.Stack versions: This page was written for Kubernetes 1.36.2, Docker Engine 29.6.1 (BuildKit default), containerd (CRI runtime on nodes), Helm 3, Compose v2, Argo CD (latest - verify at build), and Gateway API (GA - verify controller support at build).
Reviewed by Chris St. John·Last updated Jul 16, 2026