Files
klaster/utils/kubectl-run-with-pvc.sh

146 lines
3.7 KiB
Bash
Executable File

#!/usr/bin/env bash
# A utility script to run a kubectl pod with one or more PVCs mounted.
# Original: https://gist.github.com/yuanying/3aa7d59dcce65470804ab43def646ab6
# Modified to add help message, -n and -x options, and other improvements.
IMAGE="gcr.io/google-containers/ubuntu-slim:0.14"
COMMAND="/bin/bash"
NAMESPACE=""
CONTEXT=""
SUFFIX=$(date +%s | shasum | base64 | fold -w 10 | head -1 | tr '[:upper:]' '[:lower:]')
usage_exit() {
cat <<EOF
kubectl-run-with-pvc - Run a temporary pod with PersistentVolumeClaims mounted
USAGE:
$0 [-c command] [-i image] [-n namespace] [-x context] [-h] PVC [PVC ...]
DESCRIPTION:
Creates an ephemeral Kubernetes pod that mounts one or more PersistentVolumeClaims (PVCs).
Each PVC is mounted at /pvcs/<claimName>. The pod is automatically removed when you exit.
Useful for inspecting, debugging, or manipulating data in PVCs without having to deploy
a persistent pod or job.
OPTIONS:
-i IMAGE
Container image to use in the pod.
Default: gcr.io/google-containers/ubuntu-slim:0.14
-c COMMAND
Command to execute in the container.
Default: /bin/bash
-n NAMESPACE
Kubernetes namespace where the pod will be created.
Default: current namespace (from kubectl config)
-x CONTEXT
kubectl context to use for this operation.
Default: current context (from kubectl config)
-h
Display this help message and exit.
EXAMPLES:
# Mount a single PVC and get an interactive shell
$0 my-pvc
# Mount multiple PVCs
$0 data-pvc logs-pvc config-pvc
# Use a specific namespace
$0 -n my-namespace my-pvc
# Use a different context and namespace
$0 -x prod-cluster -n production my-pvc
# Use Alpine Linux instead of Ubuntu
$0 -i alpine:latest -c sh my-pvc
# Run a command non-interactively
$0 -c "ls -lh /pvcs/my-pvc" my-pvc
MOUNT PATHS:
Each PVC is mounted to: /pvcs/<claimName>
Example: If you mount 'database-pvc', it will be at /pvcs/database-pvc
NOTES:
- Pod name is auto-generated: pvc-mounter-<random-suffix>
- Pod is removed when you exit (--rm flag)
- Uses hostNetwork: true for networking access
- Requires kubectl configured and permissions to create pods
PREREQUISITES:
- kubectl installed and configured
- PVCs must already exist in the target namespace
- User must have permission to create pods in the target namespace
EOF
exit 1
}
while getopts i:c:n:x:h OPT
do
case $OPT in
i) IMAGE=$OPTARG
;;
c) COMMAND=$OPTARG
;;
n) NAMESPACE=$OPTARG
;;
x) CONTEXT=$OPTARG
;;
h) usage_exit
;;
\?) usage_exit
;;
esac
done
shift $(($OPTIND - 1))
# Require at least one PVC
if [ $# -eq 0 ]; then
echo "Error: At least one PVC name is required" 1>&2
usage_exit
fi
VOL_MOUNTS=""
VOLS=""
COMMA=""
for i in $@
do
VOL_MOUNTS="${VOL_MOUNTS}${COMMA}{\"name\": \"${i}\",\"mountPath\": \"/pvcs/${i}\"}"
VOLS="${VOLS}${COMMA}{\"name\": \"${i}\",\"persistentVolumeClaim\": {\"claimName\": \"${i}\"}}"
COMMA=","
done
KUBECTL_CMD="kubectl"
[ -n "$CONTEXT" ] && KUBECTL_CMD="$KUBECTL_CMD --context=$CONTEXT"
[ -n "$NAMESPACE" ] && KUBECTL_CMD="$KUBECTL_CMD --namespace=$NAMESPACE"
$KUBECTL_CMD run -it --rm --restart=Never --image=${IMAGE} pvc-mounter-${SUFFIX} --overrides "
{
\"spec\": {
\"containers\":[
{
\"args\": [\"${COMMAND}\"],
\"stdin\": true,
\"tty\": true,
\"name\": \"pvc\",
\"image\": \"${IMAGE}\",
\"volumeMounts\": [
${VOL_MOUNTS}
]
}
],
\"volumes\": [
${VOLS}
]
}
}
" -- ${COMMAND}