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:
@@ -2,7 +2,7 @@
|
|||||||
# Namespace is substituted at runtime via envsubst
|
# Namespace is substituted at runtime via envsubst
|
||||||
# No persistence — uses emptyDir
|
# No persistence — uses emptyDir
|
||||||
# Credentials: minioadmin/minioadmin (hardcoded for ephemeral sandbox)
|
# 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
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
@@ -100,98 +100,3 @@ spec:
|
|||||||
- port: 9000
|
- port: 9000
|
||||||
targetPort: 9000
|
targetPort: 9000
|
||||||
protocol: TCP
|
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
|
|
||||||
|
|||||||
@@ -312,14 +312,6 @@ if ! kubectl wait --for=condition=ready pod -l app=minio -n "$NAMESPACE" --timeo
|
|||||||
exit 2
|
exit 2
|
||||||
fi
|
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"
|
stage_end "infra_deploy" "ok"
|
||||||
|
|
||||||
# ══════════════════════════════════════════════════════════════════════════════
|
# ══════════════════════════════════════════════════════════════════════════════
|
||||||
@@ -402,6 +394,15 @@ envsubst < "$REPO_ROOT/infra/inttest/services.yaml" \
|
|||||||
| kubectl apply -n "$NAMESPACE" -f -
|
| kubectl apply -n "$NAMESPACE" -f -
|
||||||
|
|
||||||
log "Waiting for all API services to become ready ..."
|
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
|
if ! kubectl wait --for=condition=ready pod -l tier=api -n "$NAMESPACE" --timeout=120s; then
|
||||||
log "FATAL: API services did not become ready"
|
log "FATAL: API services did not become ready"
|
||||||
log "Pod statuses:"
|
log "Pod statuses:"
|
||||||
|
|||||||
Reference in New Issue
Block a user