您的位置:首页 > 产品设计 > UI/UE

opaque integer resource pod.alpha.kubernetes.io/opaque-int-resource- 自定义资源类型

2017-09-04 20:37 656 查看

自定义资源类型

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



如上图所示: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属性中就增加了多条记录。



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

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

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

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


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

Start a proxy, so that you can easily send requests to the Kubernetes API server:

kubectl proxy


To advertise a new opaque integer resource on a Node, send an HTTP PATCH request to the Kubernetes API server

curl --header "Content-Type: application/json-patch+json" \
--request PATCH \
--data '[{"op": "add", "path": "/status/capacity/pod.alpha.kubernetes.io~1opaque-int-resource-dongle", "value": "4"}]' \ http://localhost:8001/api/v1/nodes/<your-node-name>/status[/code] 
下面是一个使用自定义资源“foo”的例子。在这个例子中POD,Kubernetes调度组件会查找同时满足2核CPU、1个自定义资源“ foo” 的节点,在这些节点上启动POD。

apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
-name: my-container
image: myimage
resources:
requests:
cpu: 2
pod.alpha.kubernetes.io/opaque-int-resource-foo: 1


清除自定义的资源

Start a proxy, so that you can easily send requests to the Kubernetes API server:

kubectl proxy


In another command window, send the HTTP PATCH request. Replace with the name of your Node:

curl --header "Content-Type: application/json-patch+json" \
--request PATCH \
--data '[{"op": "remove", "path": "/status/capacity/pod.alpha.kubernetes.io~1opaque-int-resource-dongle"}]' \ http://localhost:8001/api/v1/nodes/<your-node-name>/status[/code] 
Verify that the dongle advertisement has been removed:

kubectl describe node <your-node-name> | grep dongle


适用场景

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



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

参考:

https://kubernetes.io/docs/tasks/administer-cluster/opaque-integer-resource-node/

https://www.kubernetes.org.cn/1200.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kubernetes