当前位置:  首页>> 技术小册>> Kubernetes中文教程(五)

本文展示了如何为节点指定扩展资源(Extended Resource)。
扩展资源允许集群管理员发布节点级别的资源,这些资源在不进行发布的情况下无法被 Kubernetes 感知。

获取你的节点名称

  1. kubectl get nodes

选择一个节点用于此练习。

在你的一个节点上发布一种新的扩展资源

为在一个节点上发布一种新的扩展资源,需要发送一个 HTTP PATCH 请求到 Kubernetes API server。
例如:假设你的一个节点上带有四个 dongle 资源。
下面是一个 PATCH 请求的示例,该请求为你的节点发布四个 dongle 资源。

  1. PATCH /api/v1/nodes/<your-node-name>/status HTTP/1.1
  2. Accept: application/json
  3. Content-Type: application/json-patch+json
  4. Host: k8s-master:8080
  5. [
  6. {
  7. "op": "add",
  8. "path": "/status/capacity/example.com~1dongle",
  9. "value": "4"
  10. }
  11. ]

注意:Kubernetes 不需要了解 dongle 资源的含义和用途。
前面的 PATCH 请求告诉 Kubernetes 你的节点拥有四个你称之为 dongle 的东西。

启动一个代理(proxy),以便你可以很容易地向 Kubernetes API server 发送请求:

  1. kubectl proxy

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

  1. curl --header "Content-Type: application/json-patch+json" \
  2. --request PATCH \
  3. --data '[{"op": "add", "path": "/status/capacity/example.com~1dongle", "value": "4"}]' \
  4. http://localhost:8001/api/v1/nodes/<your-node-name>/status

在前面的请求中,~1 为 patch 路径中 “/” 符号的编码。
JSON-Patch 中的操作路径值被解析为 JSON 指针。
更多细节,请查看 [IETF RFC 6901] 的第 3 节。

输出显示该节点的 dongle 资源容量(capacity)为 4:

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

描述你的节点:

  1. kubectl describe node <your-node-name>

输出再次展示了 dongle 资源:

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

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

讨论

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

扩展资源对 Kubernetes 是不透明的。Kubernetes 不知道扩展资源含义相关的任何信息。
Kubernetes 只了解一个节点拥有一定数量的扩展资源。
扩展资源必须以整形数量进行发布。
例如,一个节点可以发布 4 个 dongle 资源,但是不能发布 4.5 个。

存储示例

假设一个节点拥有一种特殊类型的磁盘存储,其容量为 800 GiB。
你可以为该特殊存储创建一个名称,如 example.com/special-storage
然后你就可以按照一定规格的块(如 100 GiB)对其进行发布。
在这种情况下,你的节点将会通知它拥有八个 example.com/special-storage 类型的资源。

  1. Capacity:
  2. ...
  3. example.com/special-storage: 8

如果你想要允许针对特殊存储任意(数量)的请求,你可以按照 1 字节大小的块来发布特殊存储。
在这种情况下,你将会发布 800Gi 数量的 example.com/special-storage 类型的资源。

  1. Capacity:
  2. ...
  3. example.com/special-storage: 800Gi

然后,容器就能够请求任意数量(多达 800Gi)字节的特殊存储。

  1. Capacity:
  2. ...
  3. example.com/special-storage: 800Gi

清理

这里是一个从节点移除 dongle 资源发布的 PATCH 请求。

  1. PATCH /api/v1/nodes/<your-node-name>/status HTTP/1.1
  2. Accept: application/json
  3. Content-Type: application/json-patch+json
  4. Host: k8s-master:8080
  5. [
  6. {
  7. "op": "remove",
  8. "path": "/status/capacity/example.com~1dongle",
  9. }
  10. ]

启动一个代理,以便你可以很容易地向 Kubernetes API 服务器发送请求:

  1. kubectl proxy

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

  1. curl --header "Content-Type: application/json-patch+json" \
  2. --request PATCH \
  3. --data '[{"op": "remove", "path": "/status/capacity/example.com~1dongle"}]' \
  4. http://localhost:8001/api/v1/nodes/<your-node-name>/status

验证 dongle 资源的发布已经被移除:

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

针对应用开发人员

  • [将扩展资源分配给容器]

针对集群管理员

  • [为名字空间配置最小和最大内存约束]
  • [为名字空间配置最小和最大 CPU 约束]

该分类下的相关小册推荐: