Capítulo 12: Integración con Contenedores

Por: Artiko
firecrackercontainerdkata-containersdockerkubernetesmicrovm

Capítulo 12: Integración con Contenedores

Firecracker puede integrarse con el ecosistema de contenedores, permitiendo ejecutar imágenes Docker/OCI como microVMs con aislamiento fuerte, de forma transparente para las herramientas existentes.

Opciones de integración

HerramientaDescripciónUso típico
firecracker-containerdRuntime containerd oficial para FirecrackerInfraestructura propia
Kata ContainersRuntime alternativo para Kubernetes/containerdKubernetes con VMs
IgniteCLI de Weaveworks para VMs como contenedoresDesarrollo local

firecracker-containerd

firecracker-containerd es el runtime oficial que permite usar Firecracker como backend de containerd. Cada contenedor corre en su propia microVM.

Arquitectura

graph LR
    A[Docker/nerdctl/kubectl] -->|CRI| B[containerd]
    B -->|snapshotter| C[devmapper snapshotter]
    B -->|runtime| D[firecracker-containerd runtime]
    D -->|API| E[Firecracker VMM]
    E -->|KVM| F[microVM]
    F -->|rootfs| G[Imagen OCI como ext4]

Instalación de firecracker-containerd

# Prerrequisitos: containerd instalado
sudo apt-get install -y containerd

# Descargar release de firecracker-containerd
FC_VERSION="1.0.0"
ARCH="$(uname -m)"
curl -fsSL "https://github.com/firecracker-microvm/firecracker-containerd/releases/download/v${FC_VERSION}/firecracker-containerd_${FC_VERSION}_linux_${ARCH}.tar.gz" \
  | sudo tar -xz -C /usr/local/bin

# Binarios instalados:
# - firecracker-containerd (runtime shim)
# - firecracker-ctr (cliente de prueba)
# - fcnet-setup (setup de red)
# - snapshotter (plugin de containerd)

Configurar containerd para usar Firecracker

# /etc/containerd/config.toml
version = 2

[plugins."io.containerd.grpc.v1.cri".containerd]
  snapshotter = "devmapper"
  default_runtime_name = "firecracker"

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.firecracker]
  runtime_type = "aws.firecracker"

[proxy_plugins]
  [proxy_plugins.devmapper]
    type = "snapshot"
    address = "/run/firecracker-containerd/snapshotter.sock"
# Reiniciar containerd
sudo systemctl restart containerd

Ejecutar contenedor en microVM

# Ejecutar un contenedor Alpine en una microVM Firecracker
sudo firecracker-ctr --address /run/firecracker-containerd/containerd.sock \
  run --runtime "aws.firecracker" \
  --snapshotter "devmapper" \
  --rm \
  docker.io/library/alpine:3.19 \
  my-test-vm \
  sh

Kernel personalizado para contenedores

Las imágenes de contenedores no incluyen kernel. Debes proveer el kernel:

# /etc/firecracker-containerd/runtime-config.json
{
  "kernel_image_path": "/var/lib/firecracker-containerd/kernels/vmlinux",
  "kernel_args": "console=ttyS0 noapic reboot=k panic=1 pci=off nomodule",
  "drive": {
    "is_read_only": false
  },
  "machine_config": {
    "vcpu_count": 1,
    "mem_size_mib": 512
  }
}

Kata Containers con Firecracker

Kata Containers es un proyecto de la CNCF que usa Firecracker (entre otros VMMs) como runtime. Permite ejecutar pods de Kubernetes en microVMs.

Instalar Kata con Firecracker runtime

# Instalar kata-containers
sudo snap install kata-containers --classic

# O desde el release
KATA_VERSION="3.4.0"
curl -fsSL "https://github.com/kata-containers/kata-containers/releases/download/${KATA_VERSION}/kata-static-${KATA_VERSION}-amd64.tar.xz" \
  | sudo tar -xJ -C /

# Verificar que el runtime de Firecracker está disponible
kata-runtime --kata-config /opt/kata/share/defaults/kata-containers/configuration-fc.toml check

Configurar Kubernetes para usar Kata+Firecracker

# RuntimeClass para Kata con Firecracker
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: kata-fc
handler: kata-fc
---
# Pod usando el RuntimeClass
apiVersion: v1
kind: Pod
metadata:
  name: secure-pod
spec:
  runtimeClassName: kata-fc
  containers:
    - name: app
      image: nginx:alpine

ContainerD + Kata en containerd

# /etc/containerd/config.toml - agregar runtime Kata
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.kata-fc]
  runtime_type = "io.containerd.kata-fc.v2"

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.kata-fc.options]
  ConfigPath = "/opt/kata/share/defaults/kata-containers/configuration-fc.toml"

Ignite (Weaveworks)

Ignite proporciona una experiencia similar a Docker para microVMs Firecracker:

# Instalar ignite
curl -fsSL "https://github.com/weaveworks/ignite/releases/latest/download/ignite-amd64" \
  -o /usr/local/bin/ignite
chmod +x /usr/local/bin/ignite

# Ejecutar una VM con imagen OCI (¡como Docker!)
sudo ignite run weaveworks/ignite-ubuntu \
  --name my-vm \
  --cpus 2 \
  --memory 1GB \
  --ssh

# Conectar por SSH
sudo ignite ssh my-vm

# Listar VMs
sudo ignite ps

# Detener
sudo ignite stop my-vm
sudo ignite rm my-vm

Comparativa de opciones

Criteriofirecracker-containerdKata + FirecrackerIgnite
Integración K8sMediaNativaNo
Facilidad de usoMediaComplejaAlta
MadurezAltaMuy altaMedia
Caso de usoInfraestructura FaaSK8s con VMsDev/test

Referencia