Kubernetes Cluster in Container Nodes

The kind plugin implements a Kubernetes-in-Docker (KinD) cluster for containerlab deployments.

Using the Plugin

  • Add plugin: [ kind ] to lab topology.

  • Add a node with device: kind to the lab topology. The kind plugin will automatically create control-plane and worker nodes using the kind-node device.

  • Set the number of worker nodes in the cluster with the kind.workers node parameter. Without this parameter, the plugin deploys a single-node Kubernetes cluster

For example, the following topology deploys a 3-node cluster with no external connectivity (the cluster is connected to the kind Docker network created by containerlab):

provider: clab
plugin: [ kind ]

nodes:
  kc:
    device: kind
    kind.workers: 2

The names of the cluster members are derived from the cluster name. In our example, the three containers would be named kc-control-plane, kc-worker and kc-worker2:

$ docker ps
CONTAINER ID   IMAGE                          COMMAND                  CREATED          STATUS          PORTS                       NAMES
49f3a87d7742   kindest/node:v1.34.3           "/usr/local/bin/entr…"   11 minutes ago   Up 10 minutes   127.0.0.1:35301->6443/tcp   kc-control-plane
832e14fe9842   kindest/node:v1.34.3           "/usr/local/bin/entr…"   11 minutes ago   Up 10 minutes                               kc-worker2
509551e5ca05   kindest/node:v1.34.3           "/usr/local/bin/entr…"   11 minutes ago   Up 10 minutes                               kc-worker

Lab Connectivity

You can connect the KinD cluster node to any number of netlab links. When creating the control-plane and worker nodes, the kind plugin automatically connects them to the same links if the links are stub or LAN links. For point-to-point links, the kind plugin replaces the link between the cluster node and another node with a series of point-to-point links.

For example, netlab creates three links when given this topology:

provider: clab
plugin: [ kind ]

nodes:
  kc:
    device: kind
    kind.workers: 2
  sw:
    device: frr

links: [ kc-sw ]

Link Name

Origin Device

Origin Port

Destination Device

Destination Port

kc-control-plane

eth1

sw

eth1

kc-worker

eth1

sw

eth2

kc-worker2

eth1

sw

eth3

On the other hand, the following topology using a LAN link results in all three cluster nodes connected to the same switch port:

provider: clab
plugin: [ kind ]

nodes:
  kc:
    device: kind
    kind.workers: 2
  sw:
    device: frr

links: 
- interfaces: [ kc, sw ]
  type: lan

Origin Device

Origin Port

Link Name (NET)

Description

sw

eth1

X_1

sw -> [kc-control-plane,kc-worker,kc-worker2]

kc-control-plane

eth1

X_1

kc-control-plane -> [sw,kc-worker,kc-worker2]

kc-worker

eth1

X_1

kc-worker -> [sw,kc-control-plane,kc-worker2]

kc-worker2

eth1

X_1

kc-worker2 -> [sw,kc-control-plane,kc-worker]

Other Networking Parameters

  • IPv4/IPv6 forwarding is enabled on the KinD containers. To disable it, set the netlab_ip_forwarding parameter of the cluster node to False (more details), for example:

provider: clab
plugin: [ kind ]

nodes:
  kc:
    device: kind
    kind.workers: 2
    netlab_ip_forwarding: False
  • KinD containers do not have loopback interfaces. To add the loopback interface to KinD containers, set the loopback parameter of the cluster node to True.

Additional Cluster Node Parameters

You can influence the parameters of the control-plane or worker nodes using the attributes of the cluster node. The following parameters are copied from the cluster node (device kind) to KinD containers:

  • The box, role, and loopback parameters

  • The routing dictionary (allowing you to specify custom static routes)

  • All parameters starting with netlab_ (allowing you to disable IP forwarding).

Setting Parameters on Individual KinD Containers

You can also change the parameters of individual KinD containers:

  • Add them to the lab topology (use the node names the plugin will use)

  • Set the node device to kind-node if you haven’t specified the default device in the lab topology (the plugin overrides this value anyway).

  • Set the parameters you want to change, for example, clab.exec to execute commands on individual containers once they’re started.

  • You can also use the config node parameter to execute scripts on individual KinD containers after they’ve been configured.

Example:

provider: clab
plugin: [ kind ]

nodes:
  kc:
    device: kind
    kind.workers: 2
  kc-control-plane:
    clab.exec:
    - echo "kubectl get services"
    config: [ kconf ]
    device: kind-node

Warning

  • The clab.exec commands are executed after ‌containerlab starts the container but before the containers are configured with ‌netlab initial

  • The ‌config scripts are executed as the last step in the ‌netlab initial process (after the IP addressing and routing have been configured)

  • You cannot use ‌clab.binds or ‌clab.config_templates parameters; containerlab does not use these parameters on members of KinD clusters.

Using kubectl As Part of Lab Configuration

Use clab.exec or config parameter on the control-plane node to configure Kubernetes in your KinD cluster. The clab.exec commands are shell commands (for example, ‌ kubectl get services), the config custom configuration templates are Linux scripts, for example:

#!/bin/bash
kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml

With a creative shebang (requiring coreutils 8.30 or later), you can use kubectl to apply the Kubernetes configuration from the custom configuration template, for example:

#!/usr/bin/env -S kubectl apply -f
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80