在节点上发布一种新的拓展资源 为在一个节点上发布一种新的扩展资源,需要发送一个 HTTP PATCH 请求到 Kubernetes API server。 例如:假设你的一个节点上带有四个 dongle 资源。 下面是一个 PATCH 请求的示例,该请求为你的节点发布四个 dongle 资源。
1 2 3 4 5 6 7 8 9 10 11 12 PATCH /api/v1/nodes/<your-node-name>/status HTTP/1.1 Accept : application/jsonContent-Type : application/json-patch+jsonHost : k8s-master:8080[ { "op" : "add" , "path" : "/status/capacity/example.com~1dongle" , "value" : "4" } ]
注意:Kubernetes 不需要了解 dongle 资源的含义和用途。 前面的 PATCH 请求告诉 Kubernetes 你的节点拥有四个你称之为 dongle 的东西。
首先启动一个proxy,以便向k8s API server发送请求
在另一个命令窗口中,发送 HTTP PATCH 请求。 用你的节点名称替换 <your-node-name>
:
1 2 3 4 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/<your-node-name>/status
说明:
在前面的请求中,~1
为 patch 路径中 “/” 符号的编码。 JSON-Patch 中的操作路径值被解析为 JSON 指针。 更多细节,请查看 IETF RFC 6901 的第 3 节。
在输出结果中可以看到dongle的capacity为4
1 2 3 4 5 6 7 8 9 "capacity" : { "cpu" : "2" , "ephemeral-storage" : "17394Mi" , "example.com/dongle" : "4" , "hugepages-1Gi" : "0" , "hugepages-2Mi" : "0" , "memory" : "1863032Ki" , "pods" : "110" },
使用describe 查看节点
1 2 3 4 5 6 7 8 Capacity : cpu : 2 ephemeral -storage: 17394 Mi example .com/dongle: 4 hugepages -1 Gi: 0 hugepages -2 Mi: 0 memory : 1863032 Ki pods : 110
删除可以使用下面的命令
1 2 3 4 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/<your-node-name>/status
为容器分派拓展资源 使用下面的配置文件创建一个pod
1 2 3 4 5 6 7 8 9 10 11 12 13 apiVersion: v1 kind: Pod metadata: name: extended-resource-demo spec: containers: - name: extended-resource-demo-ctr image: nginx resources: requests: example.com/dongle: 3 limits: example.com/dongle: 3
在配置文件中我们请求的dongle的数量为3
创建pod并查看pod是否正常运行
1 2 3 [root@k8s-master ~] NAME READY STATUS RESTARTS AGE extended-resource-demo 1/1 Running 0 64s
通过describe命令查看到,dongle的请求如下
1 2 3 4 Limits: example.com/dongle: 3 Requests: example.com/dongle: 3
尝试创建第二个pod
1 2 3 4 5 6 7 8 9 10 11 12 13 apiVersion: v1 kind: Pod metadata: name: extended-resource-demo-2 spec: containers: - name: extended-resource-demo-2-ctr image: nginx resources: requests: example.com/dongle: 2 limits: example.com/dongle: 2
Kubernetes 将不能满足 2 个 dongles 的请求,因为第一个 Pod 已经使用了 4 个可用 dongles 中的 3 个。
创建pod后使用describe查看pod
1 2 3 4 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 22s default-scheduler 0 /3 nodes are available: 1 node (s ) had taint {node -role .kubernetes.io/master : }, that the pod didn't tolerate, 2 Insufficient example.com/dongle.
使用get查看
1 2 3 [root@k8s-master ~]# kubectl get pod extended-resource-demo-2 NAME READY STATUS RESTARTS AGE extended-resource-demo-2 0 /1 Pending 0 113s