为节点发布扩展资源

    你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

    要获知版本信息,请输入 .

    获取你的节点名称

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

    为在一个节点上发布一种新的扩展资源,需要发送一个 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. "op": "add",
    7. "path": "/status/capacity/example.com~1dongle",
    8. "value": "4"
    9. }
    10. ]

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

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

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

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

    输出显示该节点的 dongle 资源容量(capacity)为 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。

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

    1. Capacity:
    2. ...

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

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

    1. ...
    2. 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 请求。用你的节点名称替换 :

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

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

    接下来