kubectl-warp

by ernoaapa

ernoaapa / kubectl-warp

Kubernetes CLI plugin for syncing and executing local files in Pod on Kubernetes

223 Stars 21 Forks Last release: over 1 year ago (v0.0.2) Apache License 2.0 22 Commits 2 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:


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

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.sh
and when the container start with
./test.sh
as 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

  1. Install rsync with your preferred package manager
  2. Download
    kubectl-warp
    binary from releases
  3. Add it to your
    PATH

Usage

When the plugin binary is found from

PATH
you can just execute it through
kubectl
CLI
shell
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 ```shell

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

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

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.