Configuration

Table of contents

  1. Overview
  2. Configuration File Structure
  3. Configuration Options
    1. domain
    2. kindImageVersion
    3. kindConfig
    4. helmStack
    5. helmCharts
    6. loadDockerImages
    7. postInstallManifests
    8. postInstallActions
    9. postInstallPatches
  4. Configuration Profiles
    1. Creating a Profile
    2. Using a Profile
    3. Custom Profile Directory
    4. Viewing Profile Configuration
    5. Default Configuration
  5. Examples
    1. Minimal Configuration
    2. Development Cluster with Ingress
  6. Next Steps

Overview

BeKind can be customized using a YAML configuration file. By default, BeKind looks for configuration at ~/.bekind/config.yaml, but you can specify a custom location using the --config flag.

bekind start --config /path/to/custom/config.yaml

Configuration File Structure

Here’s a complete example showing all available configuration options:

domain: "7f000001.nip.io"
kindImageVersion: "kindest/node:v1.34.0"
helmCharts:
  - url: "https://kubernetes.github.io/ingress-nginx"
    repo: "ingress-nginx"
    chart: "ingress-nginx"
    release: "nginx-ingress"
    namespace: "ingress-controller"
    wait: true
    valuesObject:
      controller:
        hostNetwork: true
kindConfig: |
  kind: Cluster
  name: my-cluster
  apiVersion: kind.x-k8s.io/v1alpha4
  nodes:
  - role: control-plane
loadDockerImages:
  pullImages: true
  images:
    - gcr.io/kuar-demo/kuard-amd64:blue
postInstallManifests:
  - "file:///path/to/manifest.yaml"
postInstallActions:
  - action: restart
    kind: Deployment
    name: my-deployment
    namespace: default
postInstallPatches:
  - target:
      group: gateway.networking.k8s.io
      version: v1
      kind: GRPCRoute
      name: argocd-server-grpc
      namespace: argocd
    patch: |
      - op: replace
        path: /spec/rules/0/backendRefs/0/port
        value: 443

Configuration Options

domain

Type: string
Optional: Yes
Description: Domain to use for any ingresses that BeKind might autocreate. Assumes wildcard DNS.

domain: "7f000001.nip.io"

Currently unused/ignored in most workflows, but reserved for future features.


kindImageVersion

Type: string
Optional: Yes
Default: Latest stable KIND node image
Description: The KIND node image to use. This determines which Kubernetes version your cluster will run.

kindImageVersion: "kindest/node:v1.34.0"

You can find available versions on Docker Hub. You can also supply your own public image or a local image.


kindConfig

Type: string (multiline)
Optional: Yes
Description: A custom KIND cluster configuration. This is passed directly to KIND.

kindConfig: |
  kind: Cluster
  name: my-cluster
  apiVersion: kind.x-k8s.io/v1alpha4
  networking:
    podSubnet: "10.254.0.0/16"
    serviceSubnet: "172.30.0.0/16"
  nodes:
  - role: control-plane
    kubeadmConfigPatches:
    - |
      kind: InitConfiguration
      nodeRegistration:
        kubeletExtraArgs:
          node-labels: "ingress=host"
    extraPortMappings:
    - containerPort: 80
      hostPort: 80
    - containerPort: 443
      hostPort: 443

“Garbage in/garbage out” - BeKind passes this configuration directly to KIND without validation. Errors will come from KIND or the Kubernetes API.


helmStack

Type: array
Optional: Yes
Description: List of Helm stack names to load and install. Each stack references a stack.yaml file in ~/.bekind/helmstack/<stack-name>/.

Stacks are processed before inline helmCharts and allow you to organize and reuse Helm chart configurations across multiple clusters.

See the Helm Charts feature documentation for detailed information about Helm Stacks.

Example:

helmStack:
  - name: argocd-cilium
  - name: monitoring

This would load charts from:

  • ~/.bekind/helmstack/argocd-cilium/stack.yaml
  • ~/.bekind/helmstack/monitoring/stack.yaml

helmCharts

Type: array
Optional: Yes
Description: List of Helm charts to install after cluster creation.

See the Helm Charts feature documentation for detailed information.

Example:

helmCharts:
  - url: "https://argoproj.github.io/argo-helm"
    repo: "argo"
    chart: "argo-cd"
    release: "argocd"
    namespace: "argocd"
    wait: true
    version: "5.46.0"
    valuesObject:
      server:
        service:
          type: NodePort

loadDockerImages

Type: object
Optional: Yes
Description: Configuration for loading Docker images into the KIND cluster.

See the Loading Docker Images feature documentation for detailed information.

Example:

loadDockerImages:
  pullImages: true
  images:
    - gcr.io/kuar-demo/kuard-amd64:blue
    - quay.io/christianh814/simple-go:latest

postInstallManifests

Type: array
Optional: Yes
Description: List of Kubernetes YAML manifest files to apply after cluster setup. Supports both local files (file://) and remote URLs (http:// or https://).

See the Post Install Manifests feature documentation for detailed information.

Example:

postInstallManifests:
  - "file:///home/user/k8s/app.yaml"
  - "https://example.com/configs/service.yaml"
  - "file:///home/user/k8s/ingress.yaml"

postInstallActions

Type: array
Optional: Yes
Description: Actions to perform on Kubernetes resources after installation.

See the Post Install Actions feature documentation for detailed information.

Example:

postInstallActions:
  - action: restart
    kind: Deployment
    name: argocd-server
    namespace: argocd
  - action: delete
    kind: Pod
    namespace: default
    labelSelector:
      app: cleanup

postInstallPatches

Type: array
Optional: Yes
Description: JSON patches to apply to Kubernetes resources after installation. Provides Kustomize-like patching capabilities.

See the Post Install Patches feature documentation for detailed information.

Example:

postInstallPatches:
  - target:
      group: gateway.networking.k8s.io
      version: v1
      kind: GRPCRoute
      name: argocd-server-grpc
      namespace: argocd
    patch: |
      - op: replace
        path: /spec/rules/0/backendRefs/0/port
        value: 443
  - target:
      version: v1
      kind: Service
      name: my-service
      # namespace defaults to "default"
      # group defaults to "" (core)
    patch: |
      - op: add
        path: /metadata/labels/app
        value: my-app

Configuration Profiles

BeKind supports configuration profiles, which allow you to save and reuse different cluster configurations.

Creating a Profile

Profiles are stored in ~/.bekind/profiles/<profile-name>/config.yaml.

For example, to create an “argocd” profile:

mkdir -p ~/.bekind/profiles/argocd
nano ~/.bekind/profiles/argocd/config.yaml

You can also have multiple YAML configuration files in the same profile directory. All .yaml files in the profile directory will be executed when you run the profile.

Using a Profile

Use the run command to execute a profile:

bekind run argocd

This will look for configuration files in ~/.bekind/profiles/argocd/ and execute each one.

Custom Profile Directory

If your profiles are stored in a different location, use the --profile-dir flag:

bekind run myprofile --profile-dir /path/to/profiles

For example, if your config is at /tmp/foo/config.yaml:

bekind run foo --profile-dir /tmp

Viewing Profile Configuration

To view a profile’s configuration without running it:

bekind run argocd --view

Default Configuration

If you don’t want to use profiles, you can use bekind start with a config file:

bekind start --config ~/.bekind/config.yaml

Or place your config at ~/.bekind/config.yaml and BeKind will use it by default.


Examples

Minimal Configuration

kindImageVersion: "kindest/node:v1.34.0"

Development Cluster with Ingress

domain: "127.0.0.1.nip.io"
kindImageVersion: "kindest/node:v1.34.0"
kindConfig: |
  kind: Cluster
  name: dev
  apiVersion: kind.x-k8s.io/v1alpha4
  nodes:
  - role: control-plane
    extraPortMappings:
    - containerPort: 80
      hostPort: 80
    - containerPort: 443
      hostPort: 443
helmCharts:
  - url: "https://kubernetes.github.io/ingress-nginx"
    repo: "ingress-nginx"
    chart: "ingress-nginx"
    release: "nginx-ingress"
    namespace: "ingress-nginx"
    wait: true

Next Steps

Learn more about specific features: