【问题标题】:Kubernetes `RuntimeHandler "runc" not supported` when creating container创建容器时不支持 Kubernetes `RuntimeHandler“runc”`
【发布时间】:2020-08-13 23:35:14
【问题描述】:

我试图指定使用 Kubernetes 部署的容器的 runtime。我遵循this link 中的指南并创建以下RuntimeClass

apiVersion: node.k8s.io/v1beta1
kind: RuntimeClass
metadata:
    name: runc
handler: runc

# $ kubeclt get RuntimeClass
# NAME   HANDLER   AGE
# runc   runc      59m

然后,我将 Pod 设置为 spec.runtimeClassName="runc"。但是,在使用 Kubernetes 进行部署时,出现以下错误:

Warning  FailedCreatePodSandBox  2m43s (x141 over 32m)  kubelet, jetson1   Failed to create pod sandbox: rpc error: code = Unknown desc = RuntimeHandler "runc" not supported

我可以使用docker--runtime=runc 运行容器而不会出现任何错误。但是在用 K8s 部署时,会出现错误。以下是我的docker info

Client:
 Debug Mode: false

Server:
 Containers: 11
  Running: 5
  Paused: 0
  Stopped: 6
 Images: 12
 Server Version: 19.03.6
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: nvidia runc
 Default Runtime: nvidia
 Init Binary: docker-init
 containerd version: 
 runc version: 
 init version: 
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.9.140-tegra
 Operating System: Ubuntu 18.04.4 LTS
 OSType: linux
 Architecture: aarch64
 CPUs: 4
 Total Memory: 3.871GiB
 Name: jetson1
 ID: HLZ4:DQKM:J7YY:OMDN:JXXZ:PFL5:YJGT:DJBM:SMSL:UTZA:WCZ4:GUD4
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

任何建议将不胜感激。谢谢!

【问题讨论】:

  • 您是如何配置运行时处理程序的?
  • @Hanx,我只是在docker中使用默认的runc处理程序,并没有修改任何东西。

标签: docker kubernetes


【解决方案1】:

虽然 runc 能够创建容器,但它是一个相当低级的组件。我们称为容器运行时的大多数工具实际上都以某种方式依赖它。 This answer to another question gives a great overview of it.

Kubernetes 中针对特定容器运行时的 RuntimeClass 功能要求它在本地节点上实现 CRI(容器运行时接口)(共享链接的“设置”部分简要介绍了它)。我做了一些快速研究,没有任何迹象表明 runc 正在直接实施 CRI。如果是这样,Kubernetes 会像你一样跳过访问 Docker;它将使用该接口直接从 kubelet 与另一个组件通信。因此,检查 Docker 设置无助于查看 runc 是否是可行的 Kubernetes 容器运行时。

因此,您应该回顾一下为什么要尝试这样做 - runc 很可能已经在您的默认容器 rumtime 堆栈中使用,而您可能没有意识到这一点。 Kubernetes 有文档for alternative container runtimes,如果你正在寻找比 Docker 更轻量级的东西,你可以考虑安装这些。

【讨论】:

  • 感谢您的回复。这样做的原因是我将我的默认 docker 运行时设置为 nvidia 以允许容器访问节点上的 GPU 资源。但是对于某些容器我不希望它能够访问GPU,所以我想将运行时设置回runc
猜你喜欢
  • 2022-12-03
  • 2021-01-12
  • 1970-01-01
  • 2018-06-24
  • 2019-04-10
  • 2020-07-29
  • 2018-09-09
  • 2021-03-17
  • 2021-04-30
相关资源
最近更新 更多