为 Kubernetes 节点发布扩展资源
扩展资源允许集群管理员发布节点级别的资源,扩展资源类似于内存和 CPU 资源,比如一个节点拥有一定数量的内存和 CPU 资源,它们被节点上运行的所有组件共享,该节点也可以拥有一定数量的其他资源,这些资源同样被节点上运行的所有组件共享。此外,除了可以创建请求一定数量的内存和 CPU 资源的 Pod 之外, 同样也可以创建请求一定数量的扩展资源的 Pod。
但是扩展资源对 Kubernetes 是不透明的,Kubernetes 是不知道扩展资源的相关含义的,它只了解一个节点拥有一定数量的扩展资源。扩展资源必须以整形数量进行发布。例如,一个节点可以发布 4 个某种扩展资源,但是不能发布 4.5 个。
发布扩展资源
为在一个节点上发布一种新的扩展资源,需要发送一个 HTTP PATCH 请求到 Kubernetes API server。例如:假设你的一个节点上带有四个 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 server 发送请求了:
$ 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
说明: 在前面的请求中,
~1
为 patch 路径中 “/” 符号的编码。
输出显示该节点的 dongle 资源容量为 4:
"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
分配扩展资源
扩展资源发布后,我们就可以把这种资源当成 CPU 或内存在 Pod 中请求使用了,要请求扩展资源,需要在 Pod 容器的资源清单中包括 resources:requests
字段。如下所示的资源清单文件,我们请求了3个发布的 dongle 扩展资源:
# extended-resource-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: extended-resource-demo
spec:
containers:
- name: extended-resource-demo
image: nginx:1.7.9
resources:
requests:
example.com/dongle: 3
limits:
example.com/dongle: 3
然后和平时一样创建 Pod:
$ kubectl apply -f extended-resource-pod.yaml
当 Pod 运行成功后,描述 Pod 可以看到关于 dongle 的相关信息:
$ kubectl describe pod extended-resource-demo
......
Limits:
example.com/dongle: 3
Requests:
example.com/dongle: 3
......
接下来我们再创建一个 Pod 请求 2 个 dongle 扩展资源,资源清单文件如下所示:
# extended-resource-pod-2.yaml
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
现在我们来创建这个 Pod,明显不能满足 2 个 dongles 的请求,因为第一个 Pod 已经使用了 3 个,而我们一共才 4 个这个扩展资源:
$ kubectl apply -f extended-resource-pod-2.yaml
创建后,查看 Pod 信息可以看到 Pod 不能被调度了,因为没有一个节点上存在两个可用的 dongle 资源:
$ kubectl describe pod extended-resource-demo-2
......
Conditions:
Type Status
PodScheduled False
...
Events:
...
... Warning FailedScheduling pod (extended-resource-demo-2) failed to fit in any node
fit failure summary on nodes : Insufficient example.com/dongle (1)
查看 Pod 的状态:
$ kubectl get pod extended-resource-demo-2
输出结果表明 Pod 虽然被创建了,但没有被调度到节点上正常运行。Pod 的状态为 Pending:
NAME READY STATUS RESTARTS AGE
extended-resource-demo-2 0/1 Pending 0 6m
清理
首先删除上面创建的示例 Pod:
$ kubectl delete pod extended-resource-demo
$ kubectl delete pod extended-resource-demo-2
然后要移除发布的扩展资源,同样需要通过 PATCH 请求来执行:
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",
}
]
启动一个代理:
$ 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
参考链接
- https://kubernetes.io/docs/tasks/administer-cluster/extended-resource-node/
- 【自然框架】js版的QuickPager分页控件 V2.0
- 你的SQL语句放在了哪里?
- oclhashcat:离线hash密码破解工具官方文档(中文版)
- 如何动态加载js?
- 【自然框架】数据访问之精雕细琢(一)存储过程的参数
- 100w条记录分页,可以有多快?—— DataReader分页与SQL语句分页的对比测试(在线演示)
- Mimikatz小实验:黄金票据+dcsync
- 【自然框架】n级下拉列表框的原理
- 【自然框架】分享 n级联动下拉列表框
- GSM Hacking Part ②:使用SDR捕获GSM网络数据并解密
- 【自然框架】之数据访问 —— 再小的类库也需要设计。
- 【自然框架】之表单控件(一)实体类(Class)VS 字典(Dictionary)
- 跨平台后门Mokes现已加入OS X豪华午餐
- 【问底】严澜:数据挖掘入门——分词
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- leetcode链表之反转链表
- Prometheus监控神器-Kubernetes篇(一)
- Elastic:Elasticsearch 的分片管理策略
- 【Vulnhub】SkyDogCTF
- 「搜索引擎」TF-IDF 文档相关度评分
- 36.Python的字符串方法format
- Cypress系列(43)- wait() 命令详解
- Docker常用方法总结
- graph attention network(ICLR2018)官方代码详解(tensorflow)-稀疏矩阵版
- graph attention network(ICLR2018)官方代码详解(tensorflow)
- 在SAP Spartacus产品明细页面用outlet显示自定义数据
- 如何在SAP Spartacus自定义Component里消费数据
- 使用ConfigModule.withConfig替换SAP Spartacus标准Component
- pod 资源对象
- 在Java8的foreach()中使用return/break/continue