nvidia kubernetes 和官方k8s的不同

nvidia kubernetes是从官方一个commit 拉出来改的,所有的改动可以通过下面的链接看到
https://github.com/NVIDIA/kubernetes/compare/dd5e1a2978fd0b97d9b78e1564398aeea7e7fe92...NVIDIA:master

主要的几个改动

  1. 添加了扩展资源的定义,对container上的ExtendedResourceRequest,对podSpec上的extendedResources,selector上的extendedResourceAffinity,node上的ExtendedResources
    https://github.com/NVIDIA/kubernetes/commit/355aff2ffc31d6403c78b68d94fa263b0de35188

  2. 重写了个Device Plugin API,去除了原来的register流程,加了adminPod initContainer接口,实现了对node上添加资源的接口定义

    1
    2
    3
    4
    5
    6
    7
     struct Device {
    ID: "GPU-fef8089b-4820-abfc-e83e-94318197576e",
    State: "Healthy",
    Attributes: {
    "memory": "8000",
    }
    }

    看意思是插件注册到某一个目录下就自动发现了,然后减少了注册的流程,有点像flexvolume插件的感觉,总体的改动感觉不错,原来的流程需要看下,我记得原来的流程分配卡的逻辑是kubelet里面实现的,感觉不太好,这里虽然好像也没改,但是加入了插件可以修改podSpec和containerSpec的逻辑
    https://github.com/NVIDIA/kubernetes/commit/23d735f02d39fd1c1464e67a355b64642cecfec6?diff=split

  3. 加了个docker hook的功能,看代码的意思是在/usr/share/containers/docker/hooks.d/目录下可以写个json,json里面可以填

    1
    2
    3
    4
    5
    type dockerHook struct {
    Runtime string `json:"runtime"`
    Annotations map[string]string `json:"annotations"`
    Images []string `json:"images"`
    }

    则在docker容器运行的时候可以判断容器上有没有annotation或者image是符合hook中所写的,如果是则启动容器的时候用json中所写的runtime来启动,另外加了个默认会看的annotation annotation.io.kubernetes.container.runtime

  4. 调度器上实现了对于extendResource的调度功能
    https://github.com/NVIDIA/kubernetes/commit/7e06c18139e44d45bd2c0c2f702dc31716f34fe2
    https://github.com/NVIDIA/kubernetes/commit/3cebd40083d69e0f65a5040fe4537e74f5a4e529
    感觉不是特别优雅,最好还是把这个资源算在普通资源调度里面比较好,现在实现是每个函数都多加了入参

  5. 困了没细看 https://github.com/NVIDIA/kubernetes/commit/df14bc461de5f639d6fd0d1eb6b7450b5a2a816b 感觉是重构了下

https://docs.google.com/document/d/1ZgKH_K4SEfdiE_OfxQ836s4yQWxZfSjS288Tq9YIWCA/edit#heading=h.56cb5eq5qgcy