Skip to content

Commit d3de62b

Browse files
authored
Fix containerd 2.x registry TLS config via hosts.toml (#5972)
* fix: migrate registry TLS config to containerd 2.x hosts.toml approach Fixes #5161. containerd 2.0 removed inline registry.configs from config.toml. Migrated to per-registry hosts.toml under /etc/containerd/certs.d/ to support AL2023 (ships containerd 2.x by default) while maintaining 1.x compatibility. - kubeadm: rewrite kubeadm_registry_containerd_configure() to use hosts.toml - containerd addon: enable config_path in base install for future 1.x support - gitignore: ignore AI/editor metadata and local workflow directories * fix: strip colon-separated suffix from containerd v2.x config_path containerd v2.x `config default` generates config_path with colon-separated /etc/docker/certs.d suffix. The transfer service io.containerd.transfer.v1.local silently ignores such paths and never reads hosts.toml, causing registry TLS x509 verification failures. Strip the suffix to ensure hosts.toml is read. Fixes: containerd/containerd#12415 * set config_path for transfer service as well
1 parent 3f90b90 commit d3de62b

3 files changed

Lines changed: 38 additions & 5 deletions

File tree

.gitignore

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,21 @@ packages/*/*/ubuntu-*
2626
sbom/
2727

2828

29-
# ide
29+
# ide
3030
.vscode
31+
32+
# ai/editor metadata
33+
.claude
34+
.opencode
35+
.cursor
36+
.aider*
37+
.continue
38+
.codeium
39+
CLAUDE.md
40+
AGENTS.md
41+
.repomixignore
42+
43+
# local workflow
44+
plans/
45+
docs/
46+
release-manifest.json

addons/containerd/template/base/install.sh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,17 @@ function containerd_configure() {
169169
sed -i '/systemd_cgroup/d' /etc/containerd/config.toml
170170
sed -i '/containerd.runtimes.runc.options/d' /etc/containerd/config.toml
171171
sed -i 's/level = ""/level = "warn"/' /etc/containerd/config.toml
172+
# Ensure containerd reads per-registry hosts.toml files (required for 1.x; no-op on 2.x which already sets this)
173+
sed -i 's|config_path = ""|config_path = "/etc/containerd/certs.d"|' /etc/containerd/config.toml
174+
175+
# for local transfer service in 2.x
176+
sed -i "s|config_path = ''|config_path = '/etc/containerd/certs.d'|" /etc/containerd/config.toml
177+
178+
# Strip the colon-separated suffix that containerd v2.x `config default` generates.
179+
# io.containerd.transfer.v1.local (the pull path when use_local_image_pull=false) silently
180+
# ignores colon-separated config_path values and never reads hosts.toml as a result.
181+
# https://github.com/containerd/containerd/issues/12415
182+
sed -i "s|config_path = '/etc/containerd/certs\.d:/etc/docker/certs\.d'|config_path = '/etc/containerd/certs.d'|" /etc/containerd/config.toml
172183
cat >> /etc/containerd/config.toml <<EOF
173184
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
174185
SystemdCgroup = true

scripts/distro/kubeadm/distro.sh

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,14 +180,20 @@ function kubeadm_registry_containerd_configure() {
180180
echo "$registry_ip $server" >> /etc/hosts
181181
fi
182182

183-
if grep -Fq "plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"${server}\".tls" /etc/containerd/config.toml; then
183+
local hosts_toml="/etc/containerd/certs.d/${server}/hosts.toml"
184+
if [ -f "$hosts_toml" ]; then
184185
echo "Registry ${server} TLS already configured for containerd"
185186
return 0
186187
fi
187188

188-
cat >> /etc/containerd/config.toml <<EOF
189-
[plugins."io.containerd.grpc.v1.cri".registry.configs."${server}".tls]
190-
ca_file = "/etc/kubernetes/pki/ca.crt"
189+
# Use hosts.toml per-registry config — works for containerd 1.5+ and 2.x.
190+
# The old inline registry.configs approach was removed in containerd 2.0.
191+
mkdir -p "/etc/containerd/certs.d/${server}"
192+
cat > "$hosts_toml" <<EOF
193+
server = "https://${server}"
194+
195+
[host."https://${server}"]
196+
ca = ["/etc/kubernetes/pki/ca.crt"]
191197
EOF
192198

193199
CONTAINERD_NEEDS_RESTART=1

0 commit comments

Comments
 (0)