# One-time Job to migrate redis state from docker compose to k8s (maintenance window). # The .example file is not applied by the deploy pipeline (mask *.example.yaml). # # Runbook: # 1. docker compose -f /edu_master/compose.yaml stop # SIGTERM -> redis will flush dump.rdb # 2. docker run --rm -v edu_master_redis-data:/data \ # -v /tmp/edu-master-backup:/backup \ # redis:alpine sh -c "cp /data/dump.rdb /backup/ && ls -la /backup" # 3. kubectl apply -f edu_master/k8s/namespace.yaml # 4. kubectl apply -f # seed must come BEFORE redis pod starts # 5. kubectl apply -f edu_master/k8s/restore-seed-job.yaml.example # kubectl wait --for=condition=complete job/redis-restore-seed -n edu-master --timeout=120s # 6. kubectl delete job redis-restore-seed -n edu-master # 7. kubectl apply -f edu_master/k8s/ -R # apply remaining manifests apiVersion: batch/v1 kind: Job metadata: name: redis-restore-seed namespace: edu-master spec: backoffLimit: 2 ttlSecondsAfterFinished: 3600 template: spec: restartPolicy: Never containers: - name: seed image: redis:alpine command: - /bin/sh - -ec - | ls -la /backup cp /backup/dump.rdb /data/dump.rdb chmod 644 /data/dump.rdb ls -la /data volumeMounts: - name: redis-data mountPath: /data - name: backup mountPath: /backup readOnly: true volumes: - name: redis-data persistentVolumeClaim: claimName: redis-data-pvc - name: backup hostPath: path: /tmp/edu-master-backup type: DirectoryOrCreate