为节点声明扩展资源

本页展示如何为节点指定扩展资源。扩展资源允许集群管理员通告节点级别的资源,这些资源如果没有通告,将不为 Kubernetes 所知。

开始之前

你需要有一个 Kubernetes 集群,并且 kubectl 命令行工具已被配置为与你的集群通信。建议在本教程中使用至少两个非控制平面主机的节点组成的集群。如果你还没有集群,可以使用 minikube 创建一个,或者使用以下 Kubernetes 演练场之一:

要检查版本,输入 kubectl version

获取节点名称

kubectl get nodes

选择一个节点用于本次练习。

要在节点上通告新的扩展资源,请向 Kubernetes API 服务器发送一个 HTTP PATCH 请求。例如,假设你的一个节点连接了四个 dongle。以下是一个 PATCH 请求示例,用于通告你的节点拥有四个 dongle 资源。

PATCH /api/v1/nodes/<your-node-name>/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 的东西。

启动一个代理,以便你可以轻松地向 Kubernetes API 服务器发送请求

kubectl proxy

在另一个命令窗口中,发送 HTTP PATCH 请求。将 <your-node-name> 替换为你的节点名称

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

输出显示节点容量为 4 个 dongle

"capacity": {
  "cpu": "2",
  "memory": "2049008Ki",
  "example.com/dongle": "4",

描述你的节点

kubectl describe node <your-node-name>

输出再次显示了 dongle 资源

Capacity:
  cpu: 2
  memory: 2049008Ki
  example.com/dongle: 4

现在,应用开发者可以创建请求一定数量 dongle 的 Pod。参见 为容器分配扩展资源

讨论

扩展资源类似于内存和 CPU 资源。例如,就像节点拥有一定量的内存和 CPU 供节点上运行的所有组件共享一样,它也可以拥有一定数量的 dongle 供节点上运行的所有组件共享。就像应用开发者可以创建请求一定量内存和 CPU 的 Pod 一样,他们也可以创建请求一定数量 dongle 的 Pod。

扩展资源对 Kubernetes 是不透明的;Kubernetes 不知道它们是什么。Kubernetes 只知道一个节点拥有一定数量的此类资源。扩展资源必须以整数形式通告。例如,节点可以通告四个 dongle,但不能通告 4.5 个 dongle。

存储示例

假设一个节点有 800 GiB 的特殊类型的磁盘存储。你可以为这种特殊存储创建一个名称,例如 example.com/special-storage。然后你可以以特定大小的块(例如 100 GiB)来通告它。在这种情况下,你的节点将通告它拥有八个 example.com/special-storage 类型的资源。

Capacity:
 ...
 example.com/special-storage: 8

如果你想允许任意大小的特殊存储请求,你可以以 1 字节大小的块来通告特殊存储。在这种情况下,你将通告 800Gi 个 example.com/special-storage 类型的资源。

Capacity:
 ...
 example.com/special-storage:  800Gi

然后容器可以请求任意字节数的特殊存储,上限为 800Gi。

清理

以下是一个 PATCH 请求示例,用于从节点移除 dongle 通告。

PATCH /api/v1/nodes/<your-node-name>/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",
  }
]

启动一个代理,以便你可以轻松地向 Kubernetes API 服务器发送请求

kubectl proxy

在另一个命令窗口中,发送 HTTP PATCH 请求。将 <your-node-name> 替换为你的节点名称

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

验证 dongle 通告已被移除

kubectl describe node <your-node-name> | grep dongle

(你应该看不到任何输出)

接下来

面向应用开发者

面向集群管理员

最后修改于 2023 年 1 月 30 日 9:58 AM PST: 改进 extended-resource-node.md 中的布局 (f59e9668a4)