---
myst:
html_meta:
"description": "Diagnose and fix common cdk8s-plone problems: pods not scheduling, crashes, failing probes, database connection errors, and synth failures."
"property=og:description": "Diagnose and fix common cdk8s-plone problems: pods not scheduling, crashes, failing probes, database connection errors, and synth failures."
"property=og:title": "Troubleshoot a deployment"
"keywords": "Plone, cdk8s, Kubernetes, troubleshooting, CrashLoopBackOff, probes, scheduling, synth"
---
# Troubleshoot a deployment
This guide shows you how to diagnose and fix the problems you are most likely to hit when you deploy Plone with `cdk8s-plone`.
Start by looking at the overall state, then drill into the failing object.
```shell
kubectl get pods -n
kubectl describe pod -n
kubectl logs -n
```
## `cdk8s synth` fails
If `synth` fails while rendering `PloneHttpcache`, confirm the `helm` CLI is installed and on your `PATH`.
`PloneHttpcache` renders the kube-httpcache Helm chart at synth time and shells out to `helm`.
If `synth` fails on a missing custom resource type, run the example's import step (`npm run import`) to regenerate the CRD bindings.
## Pods stay `Pending`
Describe the pod and read the `Events` section for the scheduler's reason.
```shell
kubectl describe pod -n
```
Common causes:
- Insufficient CPU or memory on the nodes. Lower `requestCpu` or `requestMemory`, or add capacity.
- A `nodeSelector` or `tolerations` setting that no node satisfies. See {doc}`/how-to/schedule-pods`.
- `PloneHttpcache` pods only schedule on amd64 nodes, because the construct hard-codes `kubernetes.io/arch=amd64`. Provide an amd64 node or use {doc}`/how-to/deploy-with-vinyl-cache` instead.
## A pod is in `CrashLoopBackOff`
Read the logs of the current and previous container starts.
```shell
kubectl logs -n
kubectl logs -n --previous
```
A backend that exits immediately almost always cannot reach its database.
See {ref}`backend-db-connection`.
(backend-db-connection)=
## The backend cannot reach the database
The backend uses RelStorage on PostgreSQL, so it needs a correct connection string and credentials.
- Confirm the database is running and reachable from the backend namespace.
- Confirm the environment variable that carries the DSN resolves from its Secret. See {doc}`/how-to/configure-env-and-secrets`.
```shell
kubectl get secret -n
kubectl exec -n deployment/ -- env | grep -i storage
```
## Pods never become ready
A pod that stays `Running` but never `Ready` is failing its readiness probe.
- Increase `readinessInitialDelaySeconds` if the backend needs longer to start.
- Increase `readinessTimeoutSeconds` or `readinessFailureThreshold` for a slow first request.
```typescript
backend: {
image: 'plone/plone-backend:6.1.3',
readinessInitialDelaySeconds: 30,
readinessTimeoutSeconds: 15,
}
```
Liveness probes are disabled by default (`livenessEnabled` defaults to `false`).
If pods restart in a loop after you enable liveness, raise `livenessInitialDelaySeconds` so the probe does not fire during startup.
## The cache does not cache
Check the cache pod logs, then confirm requests reach the cache service rather than the backend or frontend directly.
```shell
kubectl logs -n -l app.kubernetes.io/part-of=plone
kubectl run -it --rm curl --image=curlimages/curl --restart=Never -- \
curl -sI http://.:80/
```
A missing `X-Varnish` header means traffic bypasses the cache; point your ingress at the cache service. See {doc}`/how-to/configure-ingress-tls`.
For VCL behavior, see {doc}`/how-to/deploy-with-httpcache` and {doc}`/how-to/deploy-with-vinyl-cache`.
## Prometheus does not scrape the metrics
If a `ServiceMonitor` exists but no target appears in Prometheus, the selectors do not match.
- Confirm the `ServiceMonitor` namespace matches the `Prometheus` resource's `serviceMonitorNamespaceSelector`.
- Confirm its labels match the `Prometheus` resource's `serviceMonitorSelector`.
See {doc}`/how-to/enable-prometheus-monitoring` for the full setup.
## See also
- {doc}`/how-to/deploy-volto` — a complete deployment to compare against.
- {doc}`/reference/api/index` — authoritative option and default reference.
- {doc}`/explanation/architecture` — how the components depend on each other.