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文件系统恢复文件》,敬请期待~