README.md
May 8, 2019 ยท View on GitHub

kubectl (Kubernetes CLI) plugin which is like kubectl run with rsync.
It creates temporary Pod and synchronises your local files to the desired container and executes any command.
Why
Sometimes you need to develop/execute your code in Kubernetes, because access to database, insufficient resources locally, need access to some specific device, use specific architecture, etc. The full build image, push, deploy cycle is way too slow for real development.
Use cases
This can be used for example to build and run your local project in Kubernetes where's more resources, required architecture, etc. while using your prefed editor locally.
Alternatives
kubectl cp- Does full file copying, which is slow if a lot of files- NFS - requires a lot of extra installation and configuration
Other similar
- telepresence - Executes locally and tunnels traffic from Kubernetes
- docker-sync - Only for Docker
How it works
kubectl warp is basically just combination of, simplified and modified version of kubectl run, sshd-rsync container and kubectl port-forward to access the container.
1. Start the Pod
First the warp generates temporary SSH key pair and and starts a temporary Pod with desired image and sshd-rsync container with the temporary public SSH public key as authorized key.
The sshd-rsync is just container with sshd daemon running in port 22 and rsync binary installed so the local rsync can sync the files to the shared volume over the SSH.
The Pod have the sshd-rsync container defined twice, as init-container to make the initial sync before the actual container to start, and as a sidecar for the actual container to keep the files in-sync. The init-container waits one rsync execution and completes after succesfully so the actual containers can start.
2. Open tunnel
To sync the files with rsync over the SSH, warp opens port forwarding from random local port to the Pod port 22, what the sshd-rsync init- and sidecar-container listen.
3. Initial sync
At first, the Pod is in init state, and only the sshd-rsync is running and waiting for single sync execution. When the initial sync is done, the container completes succesfully so the Pod starts the actual containers.
The initial sync is needed so that we can start the actual container with any command. E.g. if we have shell script
test.shand when the container start with./test.shas the command, the file must be there available before the execution.
4. Continuous syncing
When the initial sync is done, the actual container start with sshd-rsync as a sidecar. The warp command continuously run rsync command locally to update the files in the Pod.
Install
With Krew (Kubernetes plugin manager)
Install Krew, then run the following commands:
krew update
krew install warp
MacOS with Brew
brew install rsync ernoaapa/kubectl-plugins/warp
Linux / MacOS without Brew
- Install rsync with your preferred package manager
- Download
kubectl-warpbinary from releases - Add it to your
PATH
Usage
When the plugin binary is found from PATH you can just execute it through kubectl CLI
kubectl warp --help
Basics
# Start bash in ubuntu image. Files in current directory will be synced to the container
kubectl warp -i -t --image ubuntu testing -- /bin/bash
# Start nodejs project in node container
cd examples/nodejs
kubectl warp -i -t --image node testing-node -- npm run watch
Exclude / Include
Sometimes some directories are too unnecessary to sync so you can speed up the initial sync with
--exclude and --include flags, those gets passed to the rsync command, for more info see rsync manual
# Do not sync local node_modules, because we fetch dependencies in the container as first command
cd examples/nodejs
kubectl warp -i -t --image node testing-node --exclude="node_modules/***" -- npm install && npm run watch
Examples
There's some examples with different languages in examples directory
Development
Prerequisites
- Golang v1.11
- Go mod enabled
Build and run locally
go run ./main.go --image alpine -- ls -la
# Syncs your local files to Kubernetes and list the files
Build and install locally
go install .
# Now you can use `kubectl`
kubectl warp --help