diff --git a/hack/requirements.sh b/hack/requirements.sh index fdd76331f..c79a281c6 100755 --- a/hack/requirements.sh +++ b/hack/requirements.sh @@ -23,7 +23,7 @@ LOCAL_BIN_DIR="${ROOT_DIR}/bin" export PATH="${LOCAL_BIN_DIR}:${PATH}" -KIND_VERSION=0.19.0 +KIND_VERSION=0.23.0 KUBE_VERSION=1.29.0 diff --git a/pkg/consts/consts.go b/pkg/consts/consts.go index 089102333..abae68190 100644 --- a/pkg/consts/consts.go +++ b/pkg/consts/consts.go @@ -41,7 +41,7 @@ var ( EtcdBinaryPrefix = "https://github.com/etcd-io/etcd/releases/download" - KindVersion = "0.19.0" + KindVersion = "0.23.0" KindBinaryPrefix = "https://github.com/kubernetes-sigs/kind/releases/download" KindNodeImagePrefix = "docker.io/kindest" @@ -69,12 +69,34 @@ var ( // The following runtime is provided. const ( - RuntimeTypeKind = "kind" + // RuntimeTypeBinary is the binary runtime. + RuntimeTypeBinary = "binary" + + // Container runtime type, will create a container for each component. + + // RuntimeTypeDocker is the docker runtime. + RuntimeTypeDocker = "docker" + // RuntimeTypePodman is the podman runtime. + RuntimeTypePodman = "podman" + // RuntimeTypeNerdctl is the nerdctl runtime. + RuntimeTypeNerdctl = "nerdctl" + // RuntimeTypeLima is the lima runtime. + RuntimeTypeLima = "lima" + // RuntimeTypeFinch is the finch runtime. + RuntimeTypeFinch = "finch" + + // Cluster runtime type, creates a cluster and deploys the components in the cluster. + + // RuntimeTypeKind is the kind runtime. + RuntimeTypeKind = "kind" + // RuntimeTypeKindPodman is the kind runtime with podman. RuntimeTypeKindPodman = RuntimeTypeKind + "-" + RuntimeTypePodman - RuntimeTypeDocker = "docker" - RuntimeTypeNerdctl = "nerdctl" - RuntimeTypePodman = "podman" - RuntimeTypeBinary = "binary" + // RuntimeTypeKindNerdctl is the kind runtime with nerdctl. + RuntimeTypeKindNerdctl = RuntimeTypeKind + "-" + RuntimeTypeNerdctl + // RuntimeTypeKindLima is the kind runtime with lima. + RuntimeTypeKindLima = RuntimeTypeKind + "-" + RuntimeTypeLima + // RuntimeTypeKindFinch is the kind runtime with finch. + RuntimeTypeKindFinch = RuntimeTypeKind + "-" + RuntimeTypeFinch ) // The following components is provided. diff --git a/pkg/kwokctl/cmd/create/cluster/cluster.go b/pkg/kwokctl/cmd/create/cluster/cluster.go index d652b33a8..15cf72d32 100644 --- a/pkg/kwokctl/cmd/create/cluster/cluster.go +++ b/pkg/kwokctl/cmd/create/cluster/cluster.go @@ -318,7 +318,10 @@ func runE(ctx context.Context, flags *flagpole) error { } if flags.Options.Runtime == consts.RuntimeTypeKind || - flags.Options.Runtime == consts.RuntimeTypeKindPodman { + flags.Options.Runtime == consts.RuntimeTypeKindPodman || + flags.Options.Runtime == consts.RuntimeTypeKindNerdctl || + flags.Options.Runtime == consts.RuntimeTypeKindLima || + flags.Options.Runtime == consts.RuntimeTypeKindFinch { // override kubeconfig for kind defer setContext() } else { diff --git a/pkg/kwokctl/components/utils.go b/pkg/kwokctl/components/utils.go index 21d26febc..92955d556 100644 --- a/pkg/kwokctl/components/utils.go +++ b/pkg/kwokctl/components/utils.go @@ -76,12 +76,17 @@ const ( var ( runtimeTypeMap = map[string]string{ - consts.RuntimeTypeKind: RuntimeModeCluster, - consts.RuntimeTypeKindPodman: RuntimeModeCluster, - consts.RuntimeTypeDocker: RuntimeModeContainer, - consts.RuntimeTypeNerdctl: RuntimeModeContainer, - consts.RuntimeTypePodman: RuntimeModeContainer, - consts.RuntimeTypeBinary: RuntimeModeNative, + consts.RuntimeTypeBinary: RuntimeModeNative, + consts.RuntimeTypeDocker: RuntimeModeContainer, + consts.RuntimeTypePodman: RuntimeModeContainer, + consts.RuntimeTypeNerdctl: RuntimeModeContainer, + consts.RuntimeTypeLima: RuntimeModeContainer, + consts.RuntimeTypeFinch: RuntimeModeContainer, + consts.RuntimeTypeKind: RuntimeModeCluster, + consts.RuntimeTypeKindPodman: RuntimeModeCluster, + consts.RuntimeTypeKindNerdctl: RuntimeModeCluster, + consts.RuntimeTypeKindLima: RuntimeModeCluster, + consts.RuntimeTypeKindFinch: RuntimeModeCluster, } ) diff --git a/pkg/kwokctl/runtime/cluster.go b/pkg/kwokctl/runtime/cluster.go index a976bbf5c..9fd7b25e5 100644 --- a/pkg/kwokctl/runtime/cluster.go +++ b/pkg/kwokctl/runtime/cluster.go @@ -180,6 +180,9 @@ func (c *Cluster) Save(ctx context.Context) error { if !slices.Contains(conf.Options.EnableCRDs, v1alpha1.StageKind) && conf.Options.Runtime != consts.RuntimeTypeKind && conf.Options.Runtime != consts.RuntimeTypeKindPodman && + conf.Options.Runtime != consts.RuntimeTypeKindNerdctl && + conf.Options.Runtime != consts.RuntimeTypeKindLima && + conf.Options.Runtime != consts.RuntimeTypeKindFinch && len(config.FilterWithTypeFromContext[*internalversion.Stage](ctx)) == 0 { defaultStages, err := c.getDefaultStages(conf.Options.NodeStatusUpdateFrequencyMilliseconds, conf.Options.NodeLeaseDurationSeconds != 0) if err != nil { @@ -191,6 +194,9 @@ func (c *Cluster) Save(ctx context.Context) error { if !slices.Contains(conf.Options.EnableCRDs, v1alpha1.StageKind) { if conf.Options.Runtime != consts.RuntimeTypeKind && conf.Options.Runtime != consts.RuntimeTypeKindPodman && + conf.Options.Runtime != consts.RuntimeTypeKindNerdctl && + conf.Options.Runtime != consts.RuntimeTypeKindLima && + conf.Options.Runtime != consts.RuntimeTypeKindFinch && len(config.FilterWithTypeFromContext[*internalversion.Stage](ctx)) == 0 { defaultStages, err := c.getDefaultStages(conf.Options.NodeStatusUpdateFrequencyMilliseconds, conf.Options.NodeLeaseDurationSeconds != 0) if err != nil { diff --git a/pkg/kwokctl/runtime/compose/cluster.go b/pkg/kwokctl/runtime/compose/cluster.go index 136543443..249983554 100644 --- a/pkg/kwokctl/runtime/compose/cluster.go +++ b/pkg/kwokctl/runtime/compose/cluster.go @@ -49,9 +49,18 @@ type Cluster struct { runtime string + isNerdctl bool canNerdctlUnlessStopped *bool } +// NewDockerCluster creates a new Runtime for docker. +func NewDockerCluster(name, workdir string) (runtime.Runtime, error) { + return &Cluster{ + Cluster: runtime.NewCluster(name, workdir), + runtime: consts.RuntimeTypeDocker, + }, nil +} + // NewPodmanCluster creates a new Runtime for podman. func NewPodmanCluster(name, workdir string) (runtime.Runtime, error) { return &Cluster{ @@ -63,16 +72,27 @@ func NewPodmanCluster(name, workdir string) (runtime.Runtime, error) { // NewNerdctlCluster creates a new Runtime for nerdctl. func NewNerdctlCluster(name, workdir string) (runtime.Runtime, error) { return &Cluster{ - Cluster: runtime.NewCluster(name, workdir), - runtime: consts.RuntimeTypeNerdctl, + Cluster: runtime.NewCluster(name, workdir), + runtime: consts.RuntimeTypeNerdctl, + isNerdctl: true, }, nil } -// NewDockerCluster creates a new Runtime for docker. -func NewDockerCluster(name, workdir string) (runtime.Runtime, error) { +// NewLimaCluster creates a new Runtime for lima. +func NewLimaCluster(name, workdir string) (runtime.Runtime, error) { return &Cluster{ - Cluster: runtime.NewCluster(name, workdir), - runtime: consts.RuntimeTypeDocker, + Cluster: runtime.NewCluster(name, workdir), + runtime: consts.RuntimeTypeNerdctl + "." + consts.RuntimeTypeLima, + isNerdctl: true, + }, nil +} + +// NewFinchCluster creates a new Runtime for finch. +func NewFinchCluster(name, workdir string) (runtime.Runtime, error) { + return &Cluster{ + Cluster: runtime.NewCluster(name, workdir), + runtime: consts.RuntimeTypeFinch, + isNerdctl: true, }, nil } @@ -903,7 +923,7 @@ func (c *Cluster) Stop(ctx context.Context) error { } func (c *Cluster) start(ctx context.Context) error { - if c.runtime == consts.RuntimeTypeNerdctl { + if c.isNerdctl { canNerdctlUnlessStopped, _ := c.isCanNerdctlUnlessStopped(ctx) if !canNerdctlUnlessStopped { // TODO: Remove this, nerdctl stop will restart containers @@ -925,7 +945,7 @@ func (c *Cluster) start(ctx context.Context) error { return err } - if c.runtime == consts.RuntimeTypeNerdctl { + if c.isNerdctl { canNerdctlUnlessStopped, _ := c.isCanNerdctlUnlessStopped(ctx) if !canNerdctlUnlessStopped { backupFilename := c.GetWorkdirPath("restart.db") @@ -949,7 +969,7 @@ func (c *Cluster) start(ctx context.Context) error { } func (c *Cluster) stop(ctx context.Context) error { - if c.runtime == consts.RuntimeTypeNerdctl { + if c.isNerdctl { canNerdctlUnlessStopped, _ := c.isCanNerdctlUnlessStopped(ctx) if !canNerdctlUnlessStopped { err := c.SnapshotSave(ctx, c.GetWorkdirPath("restart.db")) @@ -968,7 +988,7 @@ func (c *Cluster) stop(ctx context.Context) error { if err != nil { return err } - if c.runtime == consts.RuntimeTypeNerdctl { + if c.isNerdctl { canNerdctlUnlessStopped, _ := c.isCanNerdctlUnlessStopped(ctx) if !canNerdctlUnlessStopped { // TODO: Remove this, nerdctl stop will restart containers diff --git a/pkg/kwokctl/runtime/compose/cluster_snapshot.go b/pkg/kwokctl/runtime/compose/cluster_snapshot.go index 5745ec295..0af38a67d 100644 --- a/pkg/kwokctl/runtime/compose/cluster_snapshot.go +++ b/pkg/kwokctl/runtime/compose/cluster_snapshot.go @@ -71,7 +71,7 @@ func (c *Cluster) SnapshotRestore(ctx context.Context, path string) error { }() etcdContainerName := c.Name() + "-etcd" - if conf.Runtime != consts.RuntimeTypeNerdctl { + if !c.isNerdctl { // Restart etcd and kube-apiserver components := []string{ consts.ComponentEtcd, diff --git a/pkg/kwokctl/runtime/compose/init.go b/pkg/kwokctl/runtime/compose/init.go index 30fe5cb59..81398cda7 100644 --- a/pkg/kwokctl/runtime/compose/init.go +++ b/pkg/kwokctl/runtime/compose/init.go @@ -23,6 +23,8 @@ import ( func init() { runtime.DefaultRegistry.Register(consts.RuntimeTypeDocker, NewDockerCluster) - runtime.DefaultRegistry.Register(consts.RuntimeTypeNerdctl, NewNerdctlCluster) runtime.DefaultRegistry.Register(consts.RuntimeTypePodman, NewPodmanCluster) + runtime.DefaultRegistry.Register(consts.RuntimeTypeNerdctl, NewNerdctlCluster) + runtime.DefaultRegistry.Register(consts.RuntimeTypeLima, NewLimaCluster) + runtime.DefaultRegistry.Register(consts.RuntimeTypeFinch, NewFinchCluster) } diff --git a/pkg/kwokctl/runtime/compose/self_compose.go b/pkg/kwokctl/runtime/compose/self_compose.go index f6fc2685a..8638cb8fa 100644 --- a/pkg/kwokctl/runtime/compose/self_compose.go +++ b/pkg/kwokctl/runtime/compose/self_compose.go @@ -72,7 +72,7 @@ func (c *Cluster) deleteNetwork(ctx context.Context) error { logger.Debug("Deleting network") err := c.Exec(ctx, c.runtime, args...) if err != nil { - if c.runtime != consts.RuntimeTypeNerdctl { + if !c.isNerdctl { return err } @@ -118,7 +118,7 @@ func (c *Cluster) inspectNetwork(ctx context.Context, name string) (exist bool) // On Nerdctl, need to check if --restart=unless-stopped is supported // https://github.com/containerd/containerd/pull/6744 func (c *Cluster) isCanNerdctlUnlessStopped(ctx context.Context) (bool, error) { - if c.runtime != consts.RuntimeTypeNerdctl { + if !c.isNerdctl { return false, fmt.Errorf("canNerdctlUnlessStopped only for nerdctl") } @@ -171,9 +171,11 @@ func (c *Cluster) labelArgs() []string { // https://github.com/containers/podman-compose/blob/f6dbce36181c44d0d08b6f4ca166508542875ce1/podman_compose.py#L729 args = append(args, "--label=io.podman.compose.project="+c.Name()) args = append(args, "--label=com.docker.compose.project="+c.Name()) - case consts.RuntimeTypeNerdctl: - // https://github.com/containerd/nerdctl/blob/3c9300207f45c4a0422d8381d58c5be06bb49b39/pkg/labels/labels.go#L33 - args = append(args, "--label=com.docker.compose.project="+c.Name()) + default: + if c.isNerdctl { + // https://github.com/containerd/nerdctl/blob/3c9300207f45c4a0422d8381d58c5be06bb49b39/pkg/labels/labels.go#L33 + args = append(args, "--label=com.docker.compose.project="+c.Name()) + } } return args } @@ -226,22 +228,24 @@ func (c *Cluster) createComponent(ctx context.Context, componentName string) err for _, link := range component.Links { args = append(args, "--requires="+c.Name()+"-"+link) } - case consts.RuntimeTypeNerdctl: + default: // Nerdctl does not support --link and --requires } switch c.runtime { case consts.RuntimeTypeDocker, consts.RuntimeTypePodman: args = append(args, "--restart=unless-stopped") - case consts.RuntimeTypeNerdctl: - canNerdctlUnlessStopped, err := c.isCanNerdctlUnlessStopped(ctx) - if err != nil { - logger.Error("Failed to check unless-stopped support", err) - } - if canNerdctlUnlessStopped { - args = append(args, "--restart=unless-stopped") - } else { - args = append(args, "--restart=always") + default: + if c.isNerdctl { + canNerdctlUnlessStopped, err := c.isCanNerdctlUnlessStopped(ctx) + if err != nil { + logger.Error("Failed to check unless-stopped support", err) + } + if canNerdctlUnlessStopped { + args = append(args, "--restart=unless-stopped") + } else { + args = append(args, "--restart=always") + } } } @@ -291,7 +295,7 @@ func (c *Cluster) deleteComponent(ctx context.Context, componentName string) err logger.Debug("Component does not exist") return nil } else if running { - if c.runtime == consts.RuntimeTypeNerdctl { + if c.isNerdctl { // TODO: Remove this after nerdctl fix // https://github.com/containerd/nerdctl/issues/1980 if canNerdctlUnlessStopped, _ := c.isCanNerdctlUnlessStopped(ctx); canNerdctlUnlessStopped { @@ -402,7 +406,7 @@ func (c *Cluster) startComponent(ctx context.Context, componentName string) erro if err != nil { // TODO: Remove this after nerdctl fix // https://github.com/containerd/nerdctl/issues/2270 - if c.runtime == consts.RuntimeTypeNerdctl { + if c.isNerdctl { errMessage := err.Error() switch { case strings.Contains(errMessage, "already exists"), diff --git a/pkg/kwokctl/runtime/kind/cluster.go b/pkg/kwokctl/runtime/kind/cluster.go index cd641bc02..484ba117f 100644 --- a/pkg/kwokctl/runtime/kind/cluster.go +++ b/pkg/kwokctl/runtime/kind/cluster.go @@ -73,6 +73,30 @@ func NewPodmanCluster(name, workdir string) (runtime.Runtime, error) { }, nil } +// NewNerdctlCluster creates a new Runtime for kind with nerdctl +func NewNerdctlCluster(name, workdir string) (runtime.Runtime, error) { + return &Cluster{ + Cluster: runtime.NewCluster(name, workdir), + runtime: consts.RuntimeTypeNerdctl, + }, nil +} + +// NewLimaCluster creates a new Runtime for kind with lima +func NewLimaCluster(name, workdir string) (runtime.Runtime, error) { + return &Cluster{ + Cluster: runtime.NewCluster(name, workdir), + runtime: consts.RuntimeTypeNerdctl + "." + consts.RuntimeTypeLima, + }, nil +} + +// NewFinchCluster creates a new Runtime for kind with finch +func NewFinchCluster(name, workdir string) (runtime.Runtime, error) { + return &Cluster{ + Cluster: runtime.NewCluster(name, workdir), + runtime: consts.RuntimeTypeFinch, + }, nil +} + // Available checks whether the runtime is available. func (c *Cluster) Available(ctx context.Context) error { if c.IsDryRun() { diff --git a/pkg/kwokctl/runtime/kind/init.go b/pkg/kwokctl/runtime/kind/init.go index 7305e16c6..a3b361c6b 100644 --- a/pkg/kwokctl/runtime/kind/init.go +++ b/pkg/kwokctl/runtime/kind/init.go @@ -24,4 +24,7 @@ import ( func init() { runtime.DefaultRegistry.Register(consts.RuntimeTypeKind, NewDockerCluster) runtime.DefaultRegistry.Register(consts.RuntimeTypeKindPodman, NewPodmanCluster) + runtime.DefaultRegistry.Register(consts.RuntimeTypeKindNerdctl, NewNerdctlCluster) + runtime.DefaultRegistry.Register(consts.RuntimeTypeKindLima, NewLimaCluster) + runtime.DefaultRegistry.Register(consts.RuntimeTypeKindFinch, NewFinchCluster) } diff --git a/site/content/en/_index.md b/site/content/en/_index.md index d18819f4d..6014c109b 100644 --- a/site/content/en/_index.md +++ b/site/content/en/_index.md @@ -55,22 +55,26 @@ and [contribution to KWOK][contributor guide]. Runtime indicates which medium `kwokctl` will use to start the cluster -| OS/Arch | binary | docker | podman | nerdctl | kind | kind-podman | -|:-------------:|:------:|:------:|:------:|:-------:|:-----:|:-----------:| -| linux/amd64 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | -| linux/arm64 | 🔵 | 🔵 | 🔵 | 🔵 | 🔵 | 🔵 | -| darwin/amd64 | 🟢/🟠 | 🔵 | 🔵 | 🔵/🟡 | 🔵 | 🔵 | -| darwin/arm64 | 🟢/🟠 | 🔵 | 🔵 | 🔵/🟡 | 🔵 | 🔵 | -| windows/amd64 | 🟢/🟠 | 🟣 | 🟤 | 🟤/🟡 | 🟤 | 🟤 | -| windows/arm64 | 🟣/🟠 | 🟣 | 🔴 | 🔴 | 🔴 | 🔴 | - +| \ | linux/
amd64 | linux/
arm64 | darwin/
amd64 | darwin/
arm64 | windows/
amd64 | windows/
arm64 | +|:---------------------------:|:----------------:|:----------------:|:-----------------:|:-----------------:|:------------------:|:-------------------:| +| [binary][binary-runtime] ⭐️ | 🟢 | 🔵 | 🟢 | 🟢 | 🟢 | 🟣 | +| [docker][docker-runtime] ⭐️ | 🟢 | 🔵 | 🔵 | 🔵 | 🟣 | 🟣 | +| [podman][podman-runtime] ⭐️ | 🟢 | 🔵 | 🔵 | 🔵 | 🟣 | 🟣 | +| [nerdctl][nerdctl-runtime] | 🟢 | 🔵 | 🔴 | 🔴 | 🔴 | 🔴 | +| [lima][lima-runtime] ⚠️ | 🟣 | 🟣 | 🟣 | 🟣 | 🔴 | 🔴 | +| [finch][finch-runtime] ⚠️ | 🔴 | 🔴 | 🟣 | 🟣 | 🟣 | 🟣 | +| [kind][kind-runtime] | 🟢 | 🔵 | 🔵 | 🔵 | 🟣 | 🟣 | +| **kind-podman** | 🟢 | 🔵 | 🔵 | 🔵 | 🟣 | 🟣 | +| **kind-nerdctl** ⚠️ | 🟣 | 🟣 | 🔴 | 🔴 | 🔴 | 🔴 | +| **kind-lima** ⚠️ | 🟣 | 🟣 | 🟣 | 🟣 | 🔴 | 🔴 | +| **kind-finch** ⚠️ | 🔴 | 🔴 | 🟣 | 🟣 | 🟣 | 🟣 | + +- ⭐️ Recommended +- ⚠️ Work in progress - 🟢 Supported and test covered by CI - 🔵 Supported and test by manually -- 🟣 Supported but not test yet (need help to verify) -- 🟤 Unsupported but should work in theory (need help to verify) -- 🔴 Unsupported and will not work -- 🟠 Need to build [platform-specific Kubernetes binaries] -- 🟡 Need to do some workaround to make it work +- 🟣 Supported but not fully tested +- 🔴 Unsupported yet ## Community @@ -101,3 +105,11 @@ Participation in the Kubernetes community is governed by the [Kubernetes Code of [run it using pre-built images]: {{< relref "/docs/user/all-in-one-image" >}} [simulate thousands of nodes]: {{< relref "/docs/user/kwok-manage-nodes-and-pods" >}} [platform-specific Kubernetes binaries]: {{< relref "/docs/user/kwokctl-platform-specific-binaries" >}} + +[binary-runtime]: https://kwok.sigs.k8s.io/docs/user/kwokctl-platform-specific-binaries/ +[docker-runtime]: https://docs.docker.com/get-docker/ +[podman-runtime]: https://podman.io/docs/installation +[nerdctl-runtime]: https://github.com/containerd/nerdctl/releases +[lima-runtime]: https://lima-vm.io/docs/installation/ +[finch-runtime]: https://runfinch.com/docs/getting-started/installation/ +[kind-runtime]: https://kind.sigs.k8s.io/docs/user/quick-start/ diff --git a/site/content/en/docs/generated/kwokctl_create_cluster.md b/site/content/en/docs/generated/kwokctl_create_cluster.md index 03afd5509..c58e0243f 100644 --- a/site/content/en/docs/generated/kwokctl_create_cluster.md +++ b/site/content/en/docs/generated/kwokctl_create_cluster.md @@ -34,7 +34,7 @@ kwokctl create cluster [flags] (default "docker.io/jaegertracing/all-in-one:1.53.0") --jaeger-port uint32 Port to expose Jaeger UI --kind-binary string Binary of kind, only for kind/kind-podman runtime - (default "https://github.com/kubernetes-sigs/kind/releases/download/v0.19.0/kind-linux-amd64") + (default "https://github.com/kubernetes-sigs/kind/releases/download/v0.23.0/kind-linux-amd64") --kind-node-image string Image of kind node, only for kind/kind-podman runtime '${KWOK_KIND_NODE_IMAGE_PREFIX}/node:${KWOK_KUBE_VERSION}' (default "docker.io/kindest/node:v1.29.0") @@ -80,7 +80,7 @@ kwokctl create cluster [flags] (default "docker.io/prom/prometheus:v2.49.1") --prometheus-port uint32 Port to expose Prometheus metrics --quiet-pull Pull without printing progress information - --runtime string Runtime of the cluster (binary or docker or kind or kind-podman or nerdctl or podman) + --runtime string Runtime of the cluster (binary or docker or finch or kind or kind-finch or kind-lima or kind-nerdctl or kind-podman or lima or nerdctl or podman) --secure-port The apiserver port on which to serve HTTPS with authentication and authorization, is not available before Kubernetes 1.13.0 (default true) --timeout duration Timeout for waiting for the cluster to be created --wait duration Wait for the cluster to be ready diff --git a/site/content/en/docs/generated/kwokctl_get_artifacts.md b/site/content/en/docs/generated/kwokctl_get_artifacts.md index 238b5d601..3807040d4 100644 --- a/site/content/en/docs/generated/kwokctl_get_artifacts.md +++ b/site/content/en/docs/generated/kwokctl_get_artifacts.md @@ -11,7 +11,7 @@ kwokctl get artifacts [flags] ``` --filter string Filter the list of (binary or image) -h, --help help for artifacts - --runtime string Runtime of the cluster (binary or docker or kind or kind-podman or nerdctl or podman) + --runtime string Runtime of the cluster (binary or docker or finch or kind or kind-finch or kind-lima or kind-nerdctl or kind-podman or lima or nerdctl or podman) ``` ### Options inherited from parent commands