k8s pod的调度可以通过污点-容忍或者cpu、内存资源需要来控制,但是这两种方法均有缺点,无法很好地精确控制pod调度到某节点的数量。
需要规定某些节点对应这类型pod最多只能启动N个。实现方法有两种:
一、利用Request和Limit
这种方法,计算单个pod消耗资源大小与node所拥有的资源,在deplyomet上面设置对应的资源配置即可。由于这种方法是通过计算当前node的剩余资源满足条件才会触发调度,假设我需要预留剩余资源给其他类型pod,这样还需要把其他类型的pod的消耗也考虑进来,并且因为调度顺序的关系,没办法精确不同类型pod的数量。
requests:
cpu: "100m"
memory: "21474836480"
limits:
cpu: "100m"
memory: "21474836480"
假设总共CPU资源是10 要让A、B两种资源各最多只能启动5个Pod,那么A pod 的requests cpu是5 ,B pod的request cpu也是5,但是实际情况会出现A pod启动了6个,B pod启动了4个。显然是没办法满足要求的。
二、利用节点扩展资源的方法
第2种方法在node上发布一种新的扩展资源(假设这种资源名字dongle),并且规定这种资源的数目4。在deplyomet上面设置特定消耗这种数量。具体操作如下:
发送一个HTTP PATCH请求到Kubernetes API server。
PATCH /api/v1/nodes/k8snode/status HTTP/1.1
Accept: application/json
Content-Type: application/json-patch+json
Host: k8s-master:8080
[
{
"op": "add",
"path": "/status/capacity/example.com~1dongle",
"value": "4"
}
]
shell命令如下:
kubectl proxy ## 启动一个代理(proxy),才能以curl方式 发送请求 到Kubernetes API server
curl --header "Content-Type: application/json-patch+json" \
--request PATCH \
--data '[{"op": "add", "path": "/status/capacity/example.com~1dongle", "value": "4"}]' \
http://localhost:8001/api/v1/nodes/k8snode/status
查看节点信息可以看到Capacity有dongle资源4个
Capacity:
cpu: 4
ephemeral-storage: 20511312Ki
example.com/dongle: 4
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 8791660Ki
pods: 110
扩展资源必须以整形数量进行发布。例如,一个节点可以发布4个dongle资源,但是不能发布4.5个。
如果你想要允许针对特殊存储任意(数量)的请求,你可以按照1字节大小的块来发布特殊存储。譬如在数量上填800Gi, 那么
example.com/special-storage类型的资源数量就是1000x1000x1000x800个。
Capacity:
...
example.com/special-storage: 800Gi
也可以发送HTTP PATCH请求 清理删除资源。
curl --header "Content-Type: application/json-patch+json" \
--request PATCH \
--data '[{"op": "remove", "path": "/status/capacity/example.com~1dongle"}]' \
http://localhost:8001/api/v1/nodes/k8snode/status
验证使用方法
在deployment配置上加上requests example.com/dongle: 1,appy之后再查看node剩余dongle的数量由4减少为3。
resources:
limits:
#memory: 1Gi
#cpu: 500m
example.com/dongle: 1
requests:
example.com/dongle: 1
memory: 256Mi
cpu: 200m #10万微秒的CPU可以给用100微秒
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 1050m (26%) 500m (12%)
memory 496Mi (5%) 1364Mi (16%)
ephemeral-storage 0 (0%) 0 (0%)
hugepages-1Gi 0 (0%) 0 (0%)
hugepages-2Mi 0 (0%) 0 (0%)
example.com/dongle 3 3
假设需要在这个节点上,精确控制POD A数量为5, POD B数量为5 ,只需要节点上增加2个新的资源, 两种类型的POD消耗各自对应的资源。
利用节点扩展资源的方法,我们可以控制特定类型pod在节点的数量。
以上就是关于今天的全部内容,下期将给大家带来《如何使用Linux Live CD从 Ext3文件系统恢复文件》,敬请期待~