AMI创建后containerd运行时配置未持久化问题求助
问题原因及解决方法
核心原因
- EKS节点初始化脚本覆盖配置:AWS EKS默认的节点bootstrap脚本(
/etc/eks/bootstrap.sh)会在节点启动时重新生成或修改/etc/containerd/config.toml,以适配EKS集群环境,这会直接覆盖你制作AMI时手动添加的NVIDIA Runtime配置。 - 未固化配置或跳过自动重置:制作AMI前若未确保配置写入磁盘、未禁用初始化流程的配置重置逻辑,会导致自定义配置无法持久化到AMI中。
解决方法
方法1:修改Bootstrap脚本,跳过配置重置
在制作AMI的源实例上,编辑/etc/eks/bootstrap.sh,添加判断逻辑避免覆盖已有自定义配置:
# 找到脚本中生成containerd配置的部分,替换为以下逻辑 if grep -q "nvidia" /etc/containerd/config.toml; then echo "自定义containerd配置已存在,跳过重置" else # 保留原有的默认配置生成代码 containerd config default > /etc/containerd/config.toml # 其他原有的配置修改代码 fi
方法2:添加Post-Bootstrap钩子应用自定义配置
- 在源实例创建
/etc/eks/post-bootstrap.sh脚本:
#!/bin/bash # 覆盖containerd配置为自定义内容 cat > /etc/containerd/config.toml << EOF root = "/var/lib/containerd" state = "/run/containerd" version = 2 [grpc] address = "/run/containerd/containerd.sock" [plugins] [plugins."io.containerd.grpc.v1.cri"] sandbox_image = "602401143452.dkr.ecr.eu-central-1.amazonaws.com/eks/pause:3.5" [plugins."io.containerd.grpc.v1.cri".cni] bin_dir = "/opt/cni/bin" conf_dir = "/etc/cni/net.d" [plugins."io.containerd.grpc.v1.cri".containerd] default_runtime_name = "nvidia" discard_unpacked_layers = true [plugins."io.containerd.grpc.v1.cri".containerd.runtimes] [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia] privileged_without_host_devices = false runtime_engine = "" runtime_root = "" runtime_type = "io.containerd.runc.v2" [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options] BinaryName = "/usr/bin/nvidia-container-runtime" SystemdCgroup = true [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] runtime_type = "io.containerd.runc.v2" [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] SystemdCgroup = true [plugins."io.containerd.grpc.v1.cri".registry] config_path = "/etc/containerd/certs.d:/etc/docker/certs.d" EOF systemctl restart containerd
- 赋予脚本执行权限:
chmod +x /etc/eks/post-bootstrap.sh
- 修改
/etc/eks/bootstrap.sh,在脚本末尾添加:
/etc/eks/post-bootstrap.sh
方法3:制作AMI前固化配置
在源实例修改完配置后,执行以下操作确保配置写入磁盘并禁用自动重置:
# 重启containerd使配置生效 systemctl restart containerd # 强制写入磁盘 sync # 停止containerd避免运行时临时文件干扰快照 systemctl stop containerd
随后停止源实例,制作AMI。
方法4:通过启动模板UserData注入配置(托管节点组适用)
如果使用EKS托管节点组,可在启动模板的UserData中直接注入完整的自定义配置:
#!/bin/bash cat > /etc/containerd/config.toml << EOF # 此处粘贴你的完整自定义config.toml内容 EOF systemctl restart containerd
验证步骤
- 使用修改后的AMI启动测试节点
- 登录节点检查
/etc/containerd/config.toml是否包含NVIDIA Runtime配置 - 运行
systemctl status containerd确认服务正常 - 部署GPU测试Pod验证Runtime功能
内容的提问来源于stack exchange,提问作者Abiud Rds
相关产品推荐
相关产品推荐

