STATUS: EXPERIMENT - Let us know what you think
NOTE: the original experiment started on master
while the next-gen work will be on main
k3c
brings the Classic ™ Docker images manipulation UX to your
k3s
development workflow. It is designed to enable the rapid feedback
when developing and testing local container images in k3s
and rke2
.
Currently k3s
, the lightweight Kubernetes distribution,
provides a great solution for Kubernetes from dev to production. While
k3s
satisifies the Kubernetes runtime needs, one still needs to run
docker
(or a docker-like tool) to actually develop and build the container
images. k3c
is intended to replace docker
for just the functionality
needed for building and manipulating images in the Kubernetes ecosystem.
There really is nothing better than the classic Docker UX of build/push/pull/tag
.
This tool copies the same UX as classic Docker (think Docker v1.12). The intention
is to follow the same style but not be a 100% drop in replacement. Behaviour and
arguments have been changed to better match the behavior of the Kubernetes ecosystem.
k3c
, similar to k3s
and old school docker, is packaged as a single binary, because nothing
is easier for distribution than a static binary.
Fundamentally k3c
is a built on the Container Runtime Interface (CRI),
containerd, and buildkit.
k3c
enables building k3s
-local images by installing a DaemonSet Pod that runs both buildkitd
and k3c agent
and exposing the gRPC endpoints for these active agents in your cluster via a Service. Once installed, the k3c
CLI
can inspect your installation and communicate with the backend daemons for image building and manipulation with merely
the KUBECONFIG that was available when invoking k3c install
. When building k3c
will talk directly to the buildkit
service but all other interactions with the underlying containerd/CRI are mediated by the k3c agent
(primarily
because the containerd
client code assumes a certain level of co-locality with the containerd
installation).
# more to come on this front but builds are currently a very manual affair
# git clone --branch=trunk https://github.com/rancher/k3c.git ~/Projects/rancher/k3c
# cd ~/Projects/rancher/k3c
go generate # only necessary when modifying the gRPC protobuf IDL, see Dockerfile for pre-reqs
make ORG=<your-dockerhub-org> build publish
Have a working k3s
installation with a working $HOME/.kube/config
or $KUBECONFIG
, then:
# Installation on a single-node cluster
./bin/k3c install --agent-image=docker.io/${ORG}/k3c
# Installation on a multi-node cluster, targeting a Node named "my-builder-node"
./bin/k3c install --agent-image=docker.io/${ORG}/k3c --selector k3s.io/hostname=my-builder-node
k3c
currently works against a single builder node so you must specify a narrow selector when
installing on multi-node clusters. Upon successful installation this node will acquire the "builder" role.
Build images like you would with docker
$ ./bin/k3c --help
Usage:
k3c [flags]
k3c [command]
Available Commands:
build Build an image
help Help about any command
images List images
install Install builder component(s)
pull Pull an image
push Push an image
rmi Remove an image
tag Tag an image
uninstall Uninstall builder component(s)
Flags:
-x, --context string kubeconfig context for authentication
--debug
--debug-level int
-h, --help help for k3c
-k, --kubeconfig string kubeconfig for authentication
-n, --namespace string namespace (default "k3c")
-v, --version version for k3c
Use "k3c [command] --help" for more information about a command.
- Automated builds for clients on MacOS (amd64/arm64), Windows (amd64), and Linux client/server (amd64/arm64/arm).
Copyright (c) 2020-2021 Rancher Labs, Inc.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.