Kubernetes1.5新特性:自定义资源类型

一、自定义资源类型

Kubernetes1.5中,在CPU、内存、GPU三种类型资源的基础上新增了一种资源类型:Opaque Integer Resources,从英文直接翻译成不透明整数资源,但是我觉着应该翻译成自定义资源类型。

20170105134107

如上图所示:OpaqueIntResources属性是一个数组,代表自定义资源类型,这样其实可以允许管理员给某个节点自定义很多个资源属性,而不仅仅依赖于系统提供的CPU、内存和GPU资源,这些自定义资源属性都存放在OpaqueIntResources这个数组中。

自定义好了资源属性后,在配置POD规格文件时就可以把自定义资源属性添加进去,提交给Kubernetes调度器后,调度器会在系统中具备自定义资源的节点上进行查找,挑选满足POD规格文件资源要求的节点来运行POD。

Kubernetes1.5中,这是一个α特性,也就是说只能应用到开发测试环境中体验使用,还不能应用于生产环境中使用。

自定义资源类型(Opaque Integer Resources)前缀是”pod.alpha.kubernetes.io/opaque-int-resource-“。API server组件限制了自定义资源类型中自定义资源属性的数值,限制成只能设置成整数,比如可以设置成3、3000m和3Ki,下面是无效的设置值:0.5、1500m(在Kubernetes中500m表示0.5,1500m表示1.5,所以1500m不是整数,是无效的值)。

二、使用自定义资源

要想使用自定义资源,首先管理员需要手动在节点上配置自定义资源,然后用户在POD规格文件中配置对自定义资源的使用。因为如果管理员不手动配置自定义资源,那么Kubernetes只会使用CPU、内存、GPU这三种类型资源。

为了在节点上配置自定义资源,需要向API server组件发送PATCH类型的HTTP请求,在HTTP请求体中配置自定义资源的可用数值,这个数值只能配置成整数。

在节点上配置了一个自定义资源后,其实就是在这个节点对应的结构体NodeStatus上面Capacity属性中增加了一条记录,如果配置多个自定义资源,那么Capacity属性中就增加了多条记录。

20170105134142

在kubernetes调度器对POD进行调度的时候,会根据每个节点对应的NodeStatus结构体中Allocatable属性来判断,如果POD请求了自定义资源,请求数值小于这个节点上可用自定义资源数值的时候,那么这个节点就会作为备选节点。调度器对自定义资源的处理功能,其实同对CPU、内存、GPU资源的处理功能是相同的。

下面是一个在节点上配置自定义资源的例子:

在节点k8s-node-1上配置了一个自定义资源“foo”,并且将数值设置成5。

  1. PATCH /api/v1/nodes/k8s-node-1/statusHTTP/1.1
  2. Accept: application/json
  3. Content-Type: application/json-patch+json
  4. Host: k8s-master:8080
  5. [
  6.   {
  7.    “op”: “add”,
  8.    “path”:”/status/capacity/pod.alpha.kubernetes.io~1opaque-int-resource-foo”,
  9.    “value”: “5”
  10.   }
  11. ]

这里面需要注意: 在path变量的赋值中,“~1”是字符“/”的转义字符。

下面是一个使用自定义资源“foo”的例子。在这个例子中POD,Kubernetes调度组件会查找同时满足2核CPU、1个自定义资源“ foo” 的节点,在这些节点上启动POD。

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.  name: my-pod
  5. spec:
  6.  containers:
  7.   -name: my-container
  8.    image: myimage
  9.    resources:
  10.      requests:
  11.        cpu: 2
  12.        pod.alpha.kubernetes.io/opaque-int-resource-foo: 1

三、适用场景

通过自定义资源类型这种方式,相当于引入了IPC里面的信号量机制,可以限制指定POD在节点上运行的个数,而且还可以动态调整个数。

20170105134151

如上图所示,在节点(一)上最多只能运行五个依赖于自定义资源“foo”的POD,在节点(二)上最多只能运行三个依赖于自定义资源“foo”的POD。