kind docker time-namespaces 问题

2 阅读3分钟

问题

docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: namespace {"time" ""} does not exist: unknown


➜ make kind-init-ipv4
kind delete cluster --name=kube-ovn
Deleting cluster "kube-ovn" ...
make[1]: Entering directory '/root/f2/kube-ovn'
k8s_version=v1.36.1 jinjanate yamls/kind.yaml.j2 -o yamls/kind.yaml
jinjanate 25.3.1, Jinja2 3.1.2
make[1]: Leaving directory '/root/f2/kube-ovn'
make[1]: Entering directory '/root/f2/kube-ovn'
kind create cluster --config yamls/kind.yaml --name kube-ovn
Creating cluster "kube-ovn" ...
 ✓ Ensuring node image (kindest/node:v1.36.1) 🖼
 ✗ Preparing nodes 📦 📦
Deleted nodes: ["kube-ovn-control-plane" "kube-ovn-worker"]
ERROR: failed to create cluster: command "docker run --name kube-ovn-worker --hostname kube-ovn-worker --label io.x-k8s.kind.role=worker --privileged --security-opt seccomp=unconfined --security-opt apparmor=unconfined --tmpfs /tmp --tmpfs /run --volume /var --volume /lib/modules:/lib/modules:ro -e KIND_EXPERIMENTAL_CONTAINERD_SNAPSHOTTER --detach --tty --label io.x-k8s.kind.cluster=kube-ovn --net kind --restart=on-failure:1 --init=false --cgroupns=private kindest/node:v1.36.1" failed with error: exit status 125
Command Output: e2907ba5c24a586d837658f69fd2f7f6affd898ce6c0d8f9820b34a3cd5b55b0
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: namespace {"time" ""} does not exist: unknown

Run 'docker run --help' for more information
make[1]: *** [makefiles/kind.mk:151: kind-create] Error 1
make[1]: Leaving directory '/root/f2/kube-ovn'
make: *** [makefiles/kind.mk:159: kind-init-ipv4] Error 2

解决



linux ~/f2/kube-ovn simple-eip-qos [?] kind-kube-ovn
➜ cat /etc/docker/daemon.json
{
  "features": {
    "time-namespaces": false
  }
}

结论

你的 kind create cluster 失败,是因为当前环境的 Docker 尝试为节点容器开启 Time Namespace(时间命名空间),但底层系统内核或运行时不支持该命名空间。最快捷的修复方法是在 Docker 守护进程配置中手动禁用 time-namespaces 特性。

事实与逻辑分析

  1. 核心报错解读:报错字符串 namespace {"time" ""} does not exist 是 runc 在解析 OCI 规范中配置的命名空间类型时的直接输出结果。

  2. 触发诱因:Docker 在近期版本(29.5 及之后)中,引入了 time-namespaces 特性并默认开启。该特性使得容器拥有独立的时间控制能力,防止容器内的时间操作影响宿主机的物理时间。

  3. 环境约束:Time Namespace 属于 Linux Kernel 5.6 引入的内核特性。当新版 Docker 运行在内核较旧的环境(如 CentOS 7、旧版 Ubuntu),或者受到限制的嵌套沙箱运行时中,强行请求创建 time 命名空间会导致系统级调用被拒绝,从而使 runc 初始化容器任务时异常退出。

解决方案

方案一:显式禁用 Docker Time Namespace(最快修复路径)

通过关闭该特性,可以让 Docker 退回到不使用 Time Namespace 的兼容模式,让你的本地开发集群可以立即拉起。

  1. 编辑或创建宿主机的 /etc/docker/daemon.json 文件,在其中增加 features 的配置字段:

JSON

{
  "features": {
    "time-namespaces": false
  }
}

(注:如果该文件已有其他配置,请注意保持 JSON 结构的合法合并。)

  1. 重启 Docker 服务使配置生效:

Bash

sudo systemctl restart docker
  1. 清除之前因失败产生的废弃节点,重新触发 Makefile 目标:

Bash

kind delete cluster --name=kube-ovn
make kind-init-ipv4
方案二:升级宿主机内核(系统级根本解决)

你可以执行 uname -r 确认当前系统的内核。如果版本低于 5.6,这就是抛出该错误的根本原因。

由于日常开发经常涉及到 CNI 底层逻辑实现、网络隔离架构设计以及针对 eBPF 的追踪调试,陈旧的内核版本极易在需要新特性系统调用时成为硬性阻碍。建议在方便的时候,将测试环境操作系统的内核升级至 6.x 系列(如 6.1 或更高)。这不仅能原生提供对 Time Namespace 的完备支持,也能为高级数据面网络及协议栈功能提供最完整的 API 支撑。