為 Kubernetes 節(jié)點發(fā)布擴展資源
擴展資源允許集群管理員發(fā)布節(jié)點級別的資源,擴展資源類似于內(nèi)存和 CPU 資源,比如一個節(jié)點擁有一定數(shù)量的內(nèi)存和 CPU 資源,它們被節(jié)點上運行的所有組件共享,該節(jié)點也可以擁有一定數(shù)量的其他資源,這些資源同樣被節(jié)點上運行的所有組件共享。此外,除了可以創(chuàng)建請求一定數(shù)量的內(nèi)存和 CPU 資源的 Pod 之外, 同樣也可以創(chuàng)建請求一定數(shù)量的擴展資源的 Pod。
但是擴展資源對 Kubernetes 是不透明的,Kubernetes 是不知道擴展資源的相關(guān)含義的,它只了解一個節(jié)點擁有一定數(shù)量的擴展資源。擴展資源必須以整形數(shù)量進行發(fā)布。例如,一個節(jié)點可以發(fā)布 4 個某種擴展資源,但是不能發(fā)布 4.5 個。
發(fā)布擴展資源
為在一個節(jié)點上發(fā)布一種新的擴展資源,需要發(fā)送一個 HTTP PATCH 請求到 Kubernetes API server。例如:假設(shè)你的一個節(jié)點上帶有四個 dongle 資源。下面是一個 PATCH 請求的示例,該請求為你的節(jié)點發(fā)布四個 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 你的節(jié)點擁有四個你稱之為 dongle 的東西。
然后在終端中啟動一個代理,然后我們就可以向 Kubernetes API server 發(fā)送請求了:
$?kubectl?proxy
在另一個命令窗口中,發(fā)送 HTTP PATCH 請求。用你的節(jié)點名稱替換 :
$?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
說明: 在前面的請求中,
~1為 patch 路徑中 “/” 符號的編碼。
輸出顯示該節(jié)點的 dongle 資源容量為 4:
"capacity":?{
??"cpu":?"2",
??"memory":?"2049008Ki",
??"example.com/dongle":?"4",
描述你的節(jié)點:
$?kubectl?describe?node?
我們就可以看到關(guān)于我們發(fā)布的 dongle 這種擴展資源的信息了:
Capacity:
?cpu:??2
?memory:??2049008Ki
?example.com/dongle:??4
分配擴展資源
擴展資源發(fā)布后,我們就可以把這種資源當(dāng)成 CPU 或內(nèi)存在 Pod 中請求使用了,要請求擴展資源,需要在 Pod 容器的資源清單中包括 resources:requests 字段。如下所示的資源清單文件,我們請求了3個發(fā)布的 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
然后和平時一樣創(chuàng)建 Pod:
$?kubectl?apply?-f?extended-resource-pod.yaml
當(dāng) Pod 運行成功后,描述 Pod 可以看到關(guān)于 dongle 的相關(guān)信息:
$?kubectl?describe?pod?extended-resource-demo
......
Limits:
??example.com/dongle:?3
Requests:
??example.com/dongle:?3
......
接下來我們再創(chuàng)建一個 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
現(xiàn)在我們來創(chuàng)建這個 Pod,明顯不能滿足 2 個 dongles 的請求,因為第一個 Pod 已經(jīng)使用了 3 個,而我們一共才 4 個這個擴展資源:
$?kubectl?apply?-f?extended-resource-pod-2.yaml
創(chuàng)建后,查看 Pod 信息可以看到 Pod 不能被調(diào)度了,因為沒有一個節(jié)點上存在兩個可用的 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 的狀態(tài):
$?kubectl?get?pod?extended-resource-demo-2
輸出結(jié)果表明 Pod 雖然被創(chuàng)建了,但沒有被調(diào)度到節(jié)點上正常運行。Pod 的狀態(tài)為 Pending:
NAME???????????????????????READY?????STATUS????RESTARTS???AGE
extended-resource-demo-2???0/1???????Pending???0??????????6m
清理
首先刪除上面創(chuàng)建的示例 Pod:
$?kubectl?delete?pod?extended-resource-demo
$?kubectl?delete?pod?extended-resource-demo-2
然后要移除發(fā)布的擴展資源,同樣需要通過 PATCH 請求來執(zhí)行:
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",
??}
]
啟動一個代理:
$?kubectl?proxy
在另一個命令窗口中,發(fā)送 HTTP PATCH 請求。用你的節(jié)點名稱替換 :
$?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 資源的發(fā)布已經(jīng)被移除,正常看不到任何相關(guān)信息:
$?kubectl?describe?node??|?grep?dongle
參考鏈接
https://kubernetes.io/docs/tasks/administer-cluster/extended-resource-node/
K8S進階訓(xùn)練營,點擊下方圖片了解詳情

