fix: remove bucket-init job, wait for pods before readiness check

- Remove minio-bucket-init Job entirely (seed_minio.py creates bucket)
- Wait for pods to exist before kubectl wait --for=condition=ready
- Fixes 'no matching resources found' race when pods are still ContainerCreating
This commit is contained in:
Celes Renata
2026-04-19 19:25:49 +00:00
parent b2b8aca7c6
commit 4df513d096
2 changed files with 10 additions and 104 deletions
+1 -96
View File
@@ -2,7 +2,7 @@
# Namespace is substituted at runtime via envsubst
# No persistence — uses emptyDir
# Credentials: minioadmin/minioadmin (hardcoded for ephemeral sandbox)
# Includes a Job that waits for MinIO readiness and creates the stonks-normalized bucket
# Bucket creation is handled by seed_minio.py (no separate init job needed)
---
apiVersion: apps/v1
kind: Deployment
@@ -100,98 +100,3 @@ spec:
- port: 9000
targetPort: 9000
protocol: TCP
---
apiVersion: batch/v1
kind: Job
metadata:
name: minio-bucket-init
namespace: ${NAMESPACE}
labels:
app: minio
tier: infra
app.kubernetes.io/part-of: stonks-oracle
spec:
backoffLimit: 4
template:
metadata:
labels:
app: minio-bucket-init
tier: infra
spec:
imagePullSecrets:
- name: dockerhub-credentials
automountServiceAccountToken: false
securityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
seccompProfile:
type: RuntimeDefault
restartPolicy: OnFailure
containers:
- name: bucket-init
image: registry.celestium.life/dockerhub-cache/library/python:3.12-slim
imagePullPolicy: IfNotPresent
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
resources:
requests:
cpu: 50m
memory: 64Mi
limits:
cpu: 250m
memory: 128Mi
env:
- name: HTTP_PROXY
value: ""
- name: HTTPS_PROXY
value: ""
- name: http_proxy
value: ""
- name: https_proxy
value: ""
- name: NO_PROXY
value: "*"
- name: no_proxy
value: "*"
command: ["python", "-c"]
args:
- |
import urllib.request, urllib.error, time
# Disable all proxy usage in urllib
no_proxy_handler = urllib.request.ProxyHandler({})
opener = urllib.request.build_opener(no_proxy_handler)
urllib.request.install_opener(opener)
endpoint = "http://minio:9000"
max_wait = 60
# Wait for MinIO readiness
print("Waiting for MinIO to be ready...")
start = time.time()
while time.time() - start < max_wait:
try:
r = urllib.request.urlopen(f"{endpoint}/minio/health/ready", timeout=3)
if r.status == 200:
print("MinIO is ready.")
break
except Exception:
pass
time.sleep(2)
else:
raise SystemExit("MinIO did not become ready within 60s")
# Create bucket via S3 PUT request
bucket = "stonks-normalized"
req = urllib.request.Request(f"{endpoint}/{bucket}", method="PUT")
try:
urllib.request.urlopen(req, timeout=5)
print(f"Bucket '{bucket}' created successfully.")
except urllib.error.HTTPError as e:
if e.code == 409:
print(f"Bucket '{bucket}' already exists.")
else:
raise
+9 -8
View File
@@ -312,14 +312,6 @@ if ! kubectl wait --for=condition=ready pod -l app=minio -n "$NAMESPACE" --timeo
exit 2
fi
log "Waiting for minio-bucket-init job ..."
if ! kubectl wait --for=condition=complete job/minio-bucket-init -n "$NAMESPACE" --timeout=120s; then
log "WARNING: minio-bucket-init job did not complete within 120s"
log "Bucket-init pod logs:"
kubectl logs -l app=minio-bucket-init -n "$NAMESPACE" --tail=30 2>&1 || true
kubectl describe job/minio-bucket-init -n "$NAMESPACE" 2>&1 | tail -20 || true
fi
stage_end "infra_deploy" "ok"
# ══════════════════════════════════════════════════════════════════════════════
@@ -402,6 +394,15 @@ envsubst < "$REPO_ROOT/infra/inttest/services.yaml" \
| kubectl apply -n "$NAMESPACE" -f -
log "Waiting for all API services to become ready ..."
# Wait for pods to be created by the ReplicaSet controller before checking readiness.
# kubectl wait fails immediately with "no matching resources found" if no pods exist yet.
for i in $(seq 1 30); do
POD_COUNT=$(kubectl get pods -n "$NAMESPACE" -l tier=api --no-headers 2>/dev/null | wc -l)
if [ "$POD_COUNT" -ge 4 ]; then
break
fi
sleep 2
done
if ! kubectl wait --for=condition=ready pod -l tier=api -n "$NAMESPACE" --timeout=120s; then
log "FATAL: API services did not become ready"
log "Pod statuses:"