Troubleshooting — S2 Fresh AWS
Symptom → cause → fix. Sorted by frequency observed in real deploys.
1. Pod stuck in ImagePullBackOff
Symptom: kubectl get pods shows ImagePullBackOff.
Cause: Node can't reach the container registry, or IRSA on the node group doesn't include AmazonEC2ContainerRegistryReadOnly (if pulling from private ECR).
Fix:
kubectl describe pod <name> -n openbox | grep -A 5 Events
# Look for 401/403 vs DNS/network errors
# For private ECR:
aws iam attach-role-policy \
--role-name <node-group-role> \
--policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
# For public registries: check node egress (NAT gateway route, DNS resolution)
2. Pod CrashLoopBackOff — "no permission to decrypt with KMS key"
Symptom: openbox-backend or openbox-core crashes with AccessDeniedException from KMS.
Cause: IRSA role missing kms:Decrypt on the specific CMK, OR the ServiceAccount annotation doesn't match Terraform output.
Fix:
# Verify SA has the IRSA annotation
kubectl get sa openbox-backend -n openbox -o yaml | grep eks.amazonaws.com/role-arn
# Should equal: terraform output backend_irsa_role_arn
# Fix by editing values-prod.yaml and helm upgrade
3. Aurora / RDS DNS unresolvable from pods
Symptom: Pods log getaddrinfo ENOTFOUND <rds-endpoint>.
Cause: Pods are in a subnet that can't reach RDS security group / RDS VPC.
Fix: Verify RDS security group ingress allows the EKS node security group on port 5432. If EKS + RDS are in different VPCs, need VPC peering or Transit Gateway (out of Openbox scope — customer decision).
4. Elasticsearch OOMKilled (self-hosted Temporal variant)
Symptom: elasticsearch-master pods get OOMKilled, Temporal frontend logs "no available nodes".
Cause: Chart default resources: {} doesn't reserve enough JVM heap; ES container evicted under load.
Fix: Pin resources in values-prod.yaml:
temporal:
elasticsearch:
replicas: 3
resources:
requests: { cpu: 500m, memory: 2Gi }
limits: { cpu: 1500m, memory: 2Gi }
esJavaOpts: "-Xms1g -Xmx1g"
5. HPA reports <unknown> for target metric
Symptom: kubectl get hpa -n openbox shows <unknown> in TARGETS column.
Cause: metrics-server addon not installed or not running.
Fix:
kubectl get deployment metrics-server -n kube-system
# If missing, install:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
6. cert-manager Certificate stuck in Pending
Symptom: TLS not working; kubectl describe certificate shows waiting for ACME challenge.
Cause: DNS challenge can't reach the domain, OR HTTP-01 challenge blocked by cluster network policies.
Fix:
kubectl describe challenge -n openbox
# Follow the specific ACME error. Common: A record not yet propagated.
# Verify domain resolves to ingress:
dig +short openbox.your-domain.com
# Should match ingress ALB DNS.
7. Istio sidecar injection not happening
Symptom: Pods have 1 container instead of 2 (no istio-proxy); mTLS not working.
Cause: Namespace missing istio-injection=enabled label.
Fix:
kubectl label namespace openbox istio-injection=enabled
kubectl rollout restart deployment -n openbox
8. Argo Rollouts CRD missing (chart canary strategy)
Symptom: helm install fails with no matches for kind "Rollout" in version "argoproj.io/v1alpha1".
Cause: Argo Rollouts CRDs not installed and chart is configured for canary strategy.
Fix (option A — install Argo Rollouts):
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts \
-f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
Fix (option B — disable canary in chart):
# values-prod.yaml
openbox-guardrails-service:
rollout:
enabled: false
9. helm upgrade --wait times out
Symptom: Chart install hits the --timeout 15m limit; some pods still Pending.
Cause: Insufficient node capacity for HPA min replicas + guardrail model-hosts memory (each 3.5 Gi).
Fix:
kubectl describe node | grep -A 5 "Allocated resources"
# If close to 100%, either scale up node group OR reduce HPA minReplicas in values.
10. First login fails: "Cannot connect to identity service"
Symptom: Backend UI redirects to Keycloak but page never loads.
Cause: Keycloak pod is still bootstrapping (JVM warmup + DB migrations, ~2-3 min on cold start) OR ingress not routing /auth/* to Keycloak service.
Fix:
kubectl logs deploy/identity-service -n openbox --tail 50
# Look for "Keycloak … started" line
kubectl get ingress -n openbox openbox -o yaml | grep -A 2 "path:"
# Verify /auth or / route points to identity-service:8080
Still stuck?
- Check
kubectl get events -n openbox --sort-by='.lastTimestamp' | tail -30for recent errors - Review System requirements — the cluster may be under-provisioned
- File an issue at github.com/OpenBox-AI/openbox-manifest-k8s-cluster/issues