为节点发布扩展资源
本文展示了如何为节点指定扩展资源(ExtendedResource)。扩展资源允许集群管理员发布节点级别的资源,这些资源在不进行发布的情况下无法被Kubernetes感知。
在开始之前
你必须拥有一个Kubernetes的集群,同时你的Kubernetes集群必须带有kubectl命令行工具。建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。如果你还没有集群,你可以通过Minikube构建一个你自己的集群,或者你可以使用下面任意一个Kubernetes工具构建:
要检查版本,请输入kubectlversion。
获取你的节点名称
kubectl get nodes
选择一个节点用于此练习。
在你的一个节点上发布一种新的扩展资源
为在一个节点上发布一种新的扩展资源,需要发送一个HTTPPATCH请求到KubernetesAPIserver。例如:假设你的一个节点上带有四个dongle资源。下面是一个PATCH请求的示例,该请求为你的节点发布四个dongle资源。
PATCH /api/v1/nodes//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"
}
]
注意:Kubernetes不需要了解dongle资源的含义和用途。前面的PATCH请求告诉Kubernetes你的节点拥有四个你称之为dongle的东西。
启动一个代理(proxy),以便你可以很容易地向KubernetesAPIserver发送请求:
kubectl proxy
在另一个命令窗口中,发送HTTPPATCH请求。用你的节点名称替换:
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//status
Note:在前面的请求中,~1为patch路径中“/”符号的编码。JSON-Patch中的操作路径值被解析为JSON指针。更多细节,请查看IETFRFC6901的第3节。
输出显示该节点的dongle资源容量(capacity)为4:
"capacity": {
"cpu": "2",
"memory": "2049008Ki",
"example.com/dongle": "4",
描述你的节点:
kubectl describe node
输出再次展示了dongle资源:
Capacity:
cpu: 2
memory: 2049008Ki
example.com/dongle: 4
现在,应用开发者可以创建请求一定数量dongle资源的Pod了。
讨论
扩展资源类似于内存和CPU资源。例如,正如一个节点拥有一定数量的内存和CPU资源,它们被节点上运行的所有组件共享,该节点也可以拥有一定数量的dongle资源,这些资源同样被节点上运行的所有组件共享。此外,正如应用开发者可以创建请求一定数量的内存和CPU资源的Pod,他们也可以创建请求一定数量dongle资源的Pod。
扩展资源对Kubernetes是不透明的。Kubernetes不知道扩展资源含义相关的任何信息。Kubernetes只了解一个节点拥有一定数量的扩展资源。扩展资源必须以整形数量进行发布。例如,一个节点可以发布4个dongle资源,但是不能发布4.5个。
存储示例
假设一个节点拥有一种特殊类型的磁盘存储,其容量为800GiB。你可以为该特殊存储创建一个名称,如example.com/special-storage。然后你就可以按照一定规格的块(如100GiB)对其进行发布。在这种情况下,你的节点将会通知它拥有八个example.com/special-storage类型的资源。
Capacity:
...
example.com/special-storage: 8
如果你想要允许针对特殊存储任意(数量)的请求,你可以按照1字节大小的块来发布特殊存储。在这种情况下,你将会发布800Gi数量的example.com/special-storage类型的资源。
Capacity:
...
example.com/special-storage: 800Gi
然后,容器就能够请求任意数量(多达800Gi)字节的特殊存储。
Capacity:
...
example.com/special-storage: 800Gi
清理
这里是一个从节点移除dongle资源发布的PATCH请求。
PATCH /api/v1/nodes//status HTTP/1.1
Accept: application/json
Content-Type: application/json-patch+json
Host: k8s-master:8080
[
{
"op": "remove",
"path": "/status/capacity/example.com~1dongle",
}
]
启动一个代理,以便你可以很容易地向KubernetesAPI服务器发送请求:
kubectl proxy
在另一个命令窗口中,发送HTTPPATCH请求。用你的节点名称替换:
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//status
验证dongle资源的发布已经被移除:
kubectl describe node | grep dongle
(你应该看不到任何输出)