A simple and small container environment for development and debug purposes.
Podshell is a small set of userland tools you can shell into. The container starts as a regular user (podshell, uid 1000) to play nice with potential admission policies. A set of useful packages is already installed to provide a functional shell. The package list is not exhaustive, but can be extended at runtime via either binenv or dbin:
- Run
binenvto install various packages from their original GitHub release repositories, by runningbinenv update,binenv searchandbinenv install <pkg>. - Run
dbinto install various static binaries from the Toolpacks repository, by runningdbin install,dbin search,dbin listanddbin run.
In a podshell, you can use sudo to switch to root if needed. That should be sufficient to run debugging or development tasks that may need root. Optionally, you can run the container as root, by setting securityContext.runAsUser: 0 in a container spec.
Imperative as a Pod in Kubernetes and removed on exit:
kubectl run -it --rm --restart=Never --image=ghcr.io/mpepping/podshell:latest shellDeclarative as a Pod in Kubernetes:
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
labels:
name: podshell
name: podshell
spec:
containers:
- image: ghcr.io/mpepping/podshell:latest
imagePullPolicy: Always
name: shell
command: ["sleep"]
args: ["86400"]
EOFAs an imperative Deployment one-liner in Kubernetes:
kubectl create deployment shell --image=ghcr.io/mpepping/podshell:latest -- sleep infinitOr using docker or podman as container runtime:
docker run -ti --rm ghcr.io/mpepping/podshell:latest ||\
podman run -ti --rm ghcr.io/mpepping/podshell:latestYou can use these yaml examples to deploy the podshell as a privileged daemonset or deployment in Kubernetes.
As a privileged daemonset:
kubectl apply -f k8s/daemonset.yamlThis DaemonSet manifest will:
- Ensure a pod with our Docker image is running indefinitely on every node.
- Use
hostPID,hostIPC, andhostNetwork. - Mount the entire host filesystem to
/hostin the containers.
In order to make use of these workloads, you can exec into a pod of choice by name:
kubectl -n kube-system get pods -l name=podshell -o name
kubectl -n kube-system exec -it PODNAME bashIf you know the specific node name that you're interested in, you can exec into the debug pod on that node with:
NODE_NAME="talos-dev-worker-1"
POD_NAME=$(kubectl -n kube-system get pods -l name=podshell --field-selector spec.nodeName=${NODE_NAME} -ojsonpath='{.items[0].metadata.name}')
kubectl -n kube-system exec -it ${POD_NAME} bashAs a privileged deployment, instead of a daemonset example:
kubectl apply -f k8s/deployment.yamlRun make or see the Makefile.
❯ make
help This help.
build Build the image
push Push the image
clean Remove the image
start Start the container
stop Stop the container
test Test the container buildOpen an issue or PR.