@@ -199,26 +199,19 @@ sudo tar Cxzvf /opt/cni/bin ${CNI_TAR}
199199# Configure containerd
200200sudo mkdir -p /etc/containerd
201201
202- # Generate base configuration
203- sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
204-
205- # Configure based on version
206- if [ "$MAJOR_VERSION" = "2" ]; then
207- # Containerd 2.x configuration
208- cat <<EOF | sudo tee /etc/containerd/config.toml > /dev/null
202+ # Create unified configuration that works for both 1.x and 2.x
203+ # Start with a minimal config and add only what's needed
204+ cat <<'EOF' | sudo tee /etc/containerd/config.toml > /dev/null
205+ # /etc/containerd/config.toml (managed by Holodeck)
209206version = 2
210- root = "/var/lib/containerd"
211- state = "/run/containerd"
212-
213- [grpc]
214- address = "/run/containerd/containerd.sock"
215- uid = 0
216- gid = 0
217207
218208[plugins]
219209 [plugins."io.containerd.grpc.v1.cri"]
220210 sandbox_image = "registry.k8s.io/pause:3.9"
221- systemd_cgroup = true
211+ [plugins."io.containerd.grpc.v1.cri".cni]
212+ # Include both locations to survive distro variance
213+ bin_dir = "/opt/cni/bin:/usr/libexec/cni"
214+ conf_dir = "/etc/cni/net.d"
222215 [plugins."io.containerd.grpc.v1.cri".containerd]
223216 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
224217 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
@@ -229,35 +222,18 @@ state = "/run/containerd"
229222 [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
230223 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
231224 endpoint = ["https://registry-1.docker.io"]
232- EOF
233- else
234- # Containerd 1.x configuration
235- cat <<EOF | sudo tee /etc/containerd/config.toml > /dev/null
236- version = 1
237- root = "/var/lib/containerd"
238- state = "/run/containerd"
239225
240226[grpc]
241227 address = "/run/containerd/containerd.sock"
242- uid = 0
243- gid = 0
244-
245- [plugins]
246- [plugins."io.containerd.grpc.v1.cri"]
247- sandbox_image = "registry.k8s.io/pause:3.9"
248- systemd_cgroup = true
249- [plugins."io.containerd.grpc.v1.cri".containerd]
250- [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
251- [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
252- runtime_type = "io.containerd.runtime.v1.linux"
253- [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
254- SystemdCgroup = true
255- [plugins."io.containerd.grpc.v1.cri".registry]
256- [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
257- [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
258- endpoint = ["https://registry-1.docker.io"]
259228EOF
260- fi
229+
230+ # Ensure CNI directories exist
231+ sudo mkdir -p /etc/cni/net.d
232+ sudo mkdir -p /opt/cni/bin
233+
234+ # Ensure containerd directories exist
235+ sudo mkdir -p /var/lib/containerd
236+ sudo mkdir -p /run/containerd
261237
262238# Set up systemd service for containerd
263239sudo curl -fsSL "https://raw.githubusercontent.com/containerd/containerd/main/containerd.service" -o /etc/systemd/system/containerd.service
@@ -284,9 +260,22 @@ ExecStartPre=/bin/mkdir -p /run/containerd
284260ExecStartPre=/bin/chmod 711 /run/containerd
285261EOF
286262
263+ # Ensure containerd is not running with stale config
264+ sudo systemctl stop containerd || true
265+
287266# Reload systemd and start containerd
288267sudo systemctl daemon-reload
289- sudo systemctl enable --now containerd
268+ echo "Starting containerd service..."
269+ if ! sudo systemctl enable --now containerd; then
270+ echo "ERROR: Failed to start containerd service"
271+ echo "Checking service status..."
272+ sudo systemctl status containerd || true
273+ echo "Checking journal logs..."
274+ sudo journalctl -xeu containerd -n 50 || true
275+ echo "Checking config file syntax..."
276+ sudo containerd config dump || true
277+ exit 1
278+ fi
290279
291280# Wait for containerd to be ready
292281timeout=60
@@ -307,11 +296,43 @@ containerd --version
307296runc --version
308297sudo ctr version
309298
299+ # Verify CNI configuration
300+ echo "Verifying containerd CNI configuration..."
301+ if ! sudo grep -q 'bin_dir = "/opt/cni/bin:/usr/libexec/cni"' /etc/containerd/config.toml; then
302+ echo "ERROR: CNI bin_dir not properly configured in containerd"
303+ exit 1
304+ fi
305+
306+ if ! sudo grep -q 'conf_dir = "/etc/cni/net.d"' /etc/containerd/config.toml; then
307+ echo "ERROR: CNI conf_dir not properly configured in containerd"
308+ exit 1
309+ fi
310+
311+ if ! sudo grep -q 'SystemdCgroup = true' /etc/containerd/config.toml; then
312+ echo "ERROR: SystemdCgroup not enabled in containerd config"
313+ exit 1
314+ fi
315+
316+ # Verify with crictl
317+ if command -v crictl &> /dev/null; then
318+ echo "Checking CRI configuration..."
319+ sudo crictl info | grep -E "cni|Cni" || true
320+ fi
321+
322+ # Note about nvidia-container-toolkit compatibility
323+ echo ""
324+ echo "Note: This containerd configuration is designed to be compatible with nvidia-container-toolkit."
325+ echo "When nvidia-ctk runtime configure is run later, it will:"
326+ echo " - Add nvidia runtime configuration"
327+ echo " - Preserve our CNI settings (bin_dir and conf_dir)"
328+ echo " - May change default_runtime_name to 'nvidia'"
329+ echo "This is expected and will not affect CNI functionality."
330+
310331# Test containerd functionality
311332sudo ctr images pull docker.io/library/hello-world:latest
312333sudo ctr run --rm docker.io/library/hello-world:latest test
313334
314- # Containerd installation completed successfully!
335+ echo " Containerd installation and CNI configuration completed successfully!"
315336`
316337
317338type Containerd struct {
@@ -322,7 +343,7 @@ func NewContainerd(env v1alpha1.Environment) *Containerd {
322343 var version string
323344
324345 if env .Spec .ContainerRuntime .Version == "" {
325- version = "1.7.26 "
346+ version = "1.7.28 "
326347 } else {
327348 // remove the 'v' prefix from the version if it exists
328349 version = strings .TrimPrefix (env .Spec .ContainerRuntime .Version , "v" )
0 commit comments