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资源类型--pod和job
- kubernetes1.5新特性:自定义资源类型
- String类型转int类型,Integer.valueOf与Integer.parseInt的区别。
- Integer类型、int类型类型、String类型的相互转换
- java中integer和int类型的区别
- kubernetes创建资源对象yaml文件例子--pod
- [置顶] kubernetes资源对象--pod和job
- 基本数据类型和封装类之int和Integer
- JAVA里面的int类型 和Integer类型,有什么不一样
- 关于Integer对象比较,和int基本类型比较的一些问题
- String类型转int类型,Integer.valueOf与Integer.parseInt的区别。
- integer(int) 整数类型
- java基本数据类型与封装类型详解(int和Integer区别)
- java学习(4) int Integer 基本类型与封装类型的理解
- Java数据类型中String、Integer、int相互间的转换
- 82-资源resource类型
- String类型转int类型,Integer.valueOf与Integer.parseInt的区别。
- kubernetes资源类型--deployment
- VC 中自定义资源 FindResource\LoadResource\LockResource 简介使用
- 面试题解析:4 包装类和原生数据类型的区别 例如:Integer 和 int的区别