K8s實(shí)戰(zhàn)教程之容器和?Pods資源分配問(wèn)題
目標(biāo)
本篇文章我們將學(xué)習(xí),如何為容器設(shè)置 CPU request(請(qǐng)求) 和 CPU limit(限制)。 容器使用的 CPU 不能超過(guò)所配置的限制。 如果系統(tǒng)有空閑的 CPU 時(shí)間,則可以保證給容器分配其所請(qǐng)求數(shù)量的 CPU 資源。
一、啟動(dòng)服務(wù)
在前面的章節(jié)中,有講解過(guò) metrics-server 服務(wù),在這里,我們?cè)俅芜\(yùn)行以下命令,啟動(dòng)metrics-server :
minikube addons enable metrics-server
查看 metrics-server 資源API 是否可用,運(yùn)行下面命令,則會(huì)輸出將包含一個(gè)對(duì) metrics.k8s.io
的引用。
$ kubectl get apiservices NAME v1beta1.metrics.k8s.io
二、創(chuàng)建命名空間
在進(jìn)行資源分配之前,我們需要先創(chuàng)建一個(gè)命名空間,才能給這個(gè)空間分配資源。接下來(lái)我們先學(xué)習(xí)一下創(chuàng)建資源與集群的其余部分資源隔離。
在 Kubernetes 中,“名字空間(Namespace)”提供一種機(jī)制,將同一集群中的資源劃分為相互隔離的組。 同一名字空間內(nèi)的資源名稱要唯一,但跨名字空間時(shí)沒(méi)有這個(gè)要求。 名字空間作用域僅針對(duì)帶有名字空間的對(duì)象,例如 Deployment、Service 等, 這種作用域?qū)涸L問(wèn)的對(duì)象不適用,例如 StorageClass、Node、PersistentVolume 等。
2.1、查看名字空間
初始狀態(tài)下,Kubernetes 具有三個(gè)名字空間:
- default 無(wú)名字空間對(duì)象的默認(rèn)名字空間
- kube-system 由 Kubernetes 系統(tǒng)創(chuàng)建的對(duì)象的名字空間
- kube-public 自動(dòng)創(chuàng)建且被所有用戶可讀的名字空間(包括未經(jīng)身份認(rèn)證的)。此名字空間通常在某些資源在整個(gè)集群中可見(jiàn)且可公開(kāi)讀取時(shí)被集群使用。此名字空間的公共方面只是一個(gè)約定,而不是一個(gè)必要條件。
我們可以通過(guò)使用 kubectl 的命令,來(lái)查看現(xiàn)有的命名空間:
$ kubectl get namespaces NAME STATUS AGE default Active 11d kube-system Active 11d kube-public Active 11d
如果想要查看某一個(gè)命名空間的詳情,也可以使用 kubectl describe namespaces
命令來(lái)查看:
$ kubectl describe namespaces <name> Name: default Labels: <none> Annotations: <none> Status: Active No resource quota. Resource Limits Type Resource Min Max Default ---- -------- --- --- --- Container cpu - - 100m
請(qǐng)注意,這些詳情同時(shí)顯示了資源配額(如果存在)以及資源限制區(qū)間。
資源配額跟蹤并聚合 Namespace 中資源的使用情況,并允許集群運(yùn)營(yíng)者定義 Namespace 可能消耗的 Hard 資源使用限制。
限制區(qū)間定義了單個(gè)實(shí)體在一個(gè) Namespace 中可使用的最小/最大資源量約束。
名字空間可以處于下列兩個(gè)階段中的一個(gè):
- Active 名字空間正在被使用中
- Terminating 名字空間正在被刪除,且不能被用于新對(duì)象。
2.2、創(chuàng)建名字空間
上面將的命名空間,都是當(dāng)前集群自帶的三個(gè)命名空間,那么我們能不能自己創(chuàng)建命名空間呢?答案是,肯定的,下面我們來(lái)學(xué)習(xí)兩種創(chuàng)建方式。
新建一個(gè)名為 my-namespace.yaml
的 YAML 文件,并寫入下列內(nèi)容:
apiVersion: v1 kind: Namespace metadata: name: <insert-namespace-name-here>
然后運(yùn)行命令:
kubectl create -f ./my-namespace.yaml
或者,你可以使用下面的命令創(chuàng)建名字空間:
kubectl create namespace <insert-namespace-name-here>
2.3、刪除名字空間
可選字段 finalizers 允許觀察者們?cè)诿挚臻g被刪除時(shí)清除資源。 記住如果指定了一個(gè)不存在的終結(jié)器,名字空間仍會(huì)被創(chuàng)建, 但如果用戶試圖刪除它,它將陷入 Terminating 狀態(tài)。下面是刪除命名空間的命令:
$ kubectl delete namespaces <insert-some-namespace-name>
此命令會(huì)刪除當(dāng)前命名空間下面的所有內(nèi)容,刪除是異步的,所以有一段時(shí)間你會(huì)看到名字空間處于 Terminating 狀態(tài)。
三、指定 CPU 請(qǐng)求和 CPU 限制
要為容器指定 CPU 請(qǐng)求,請(qǐng)?jiān)谌萜髻Y源清單中包含 resources: requests
字段。 要指定 CPU 限制,請(qǐng)包含 resources:limits
。
在本練習(xí)中,你將創(chuàng)建一個(gè)具有一個(gè)容器的 Pod。容器將會(huì)請(qǐng)求 0.5 個(gè) CPU,而且最多限制使用 1 個(gè) CPU。 pods/resource/cpu-request-limit.yaml
是 Pod 的配置文件:
apiVersion: v1 kind: Pod metadata: name: cpu-demo namespace: cpu-example spec: containers: - name: cpu-demo-ctr image: vish/stress resources: limits: cpu: "1" requests: cpu: "0.5" args: - -cpus - "2"
配置文件的 args 部分提供了容器啟動(dòng)時(shí)的參數(shù)。 -cpus “2” 參數(shù)告訴容器嘗試使用 2 個(gè) CPU。
1.創(chuàng)建 Pod:
$ kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit.yaml --namespace=cpu-example
2.驗(yàn)證所創(chuàng)建的 Pod 處于 Running 狀態(tài)
$ kubectl get pod cpu-demo --namespace=cpu-example
3.查看顯示關(guān)于 Pod 的詳細(xì)信息:
$ kubectl get pod cpu-demo --output=yaml --namespace=cpu-example
輸出顯示 Pod 中的一個(gè)容器的 CPU 請(qǐng)求為 500 milli CPU,并且 CPU 限制為 1 個(gè) CPU。
resources: limits: cpu: "1" requests: cpu: 500m
5.使用 kubectl top
命令來(lái)獲取該 Pod 的度量值數(shù)據(jù),我這里的輸出顯示 Pod 使用的是 974 milliCPU,即略低于 Pod 配置中指定的 1 個(gè) CPU 的限制。
$ kubectl top pod cpu-demo --namespace=cpu-example NAME CPU(cores) MEMORY(bytes) cpu-demo 974m <something>
3.1、CPU 單位
CPU 資源以 CPU 單位度量。Kubernetes 中的一個(gè) CPU 等同于:
- 1 個(gè) AWS vCPU
- 1 個(gè) GCP核心
- 1 個(gè) Azure vCore
- 裸機(jī)上具有超線程能力的英特爾處理器上的 1 個(gè)超線程
小數(shù)值是可以使用的。一個(gè)請(qǐng)求 0.5 CPU 的容器保證會(huì)獲得請(qǐng)求 1 個(gè) CPU 的容器的 CPU 的一半。 你可以使用后綴 m 表示毫。例如 100m CPU、100 milliCPU 和 0.1 CPU 都相同。 精度不能超過(guò) 1m。
CPU 請(qǐng)求只能使用絕對(duì)數(shù)量,而不是相對(duì)數(shù)量。0.1 在單核、雙核或 48 核計(jì)算機(jī)上的 CPU 數(shù)量值是一樣的。
刪除 Pod:
$ kubectl delete pod cpu-demo --namespace=cpu-example
3.2、設(shè)置超過(guò)節(jié)點(diǎn)能力的 CPU 請(qǐng)求
CPU 請(qǐng)求和限制與都與容器相關(guān),但是我們可以考慮一下 Pod 具有對(duì)應(yīng)的 CPU 請(qǐng)求和限制這樣的場(chǎng)景。 Pod 對(duì) CPU 用量的請(qǐng)求等于 Pod 中所有容器的請(qǐng)求數(shù)量之和。 同樣,Pod 的 CPU 資源限制等于 Pod 中所有容器 CPU 資源限制數(shù)之和。
Pod 調(diào)度是基于資源請(qǐng)求值來(lái)進(jìn)行的。 僅在某節(jié)點(diǎn)具有足夠的 CPU 資源來(lái)滿足 Pod CPU 請(qǐng)求時(shí),Pod 將會(huì)在對(duì)應(yīng)節(jié)點(diǎn)上運(yùn)行:
接下來(lái)我們?cè)谀夸?pods/resource/cpu-request-limit-2.yaml
中創(chuàng)建一個(gè) Pod,該 Pod 的 CPU 請(qǐng)求對(duì)于集群中任何節(jié)點(diǎn)的容量而言都會(huì)過(guò)大。 下面是 Pod 的配置文件,其中有一個(gè)容器。容器請(qǐng)求 100 個(gè) CPU,這可能會(huì)超出集群中任何節(jié)點(diǎn)的容量。
apiVersion: v1 kind: Pod metadata: name: cpu-demo-2 namespace: cpu-example spec: containers: - name: cpu-demo-ctr-2 image: vish/stress resources: limits: cpu: "100" requests: cpu: "100" args: - -cpus - "2"
3.2.1、創(chuàng)建 Pod
執(zhí)行創(chuàng)建命令
$ kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit-2.yaml --namespace=cpu-example
3.2.2、Pod 的狀態(tài)
運(yùn)行下列命令,查看該 Pod 的狀態(tài)
$ kubectl get pod cpu-demo-2 --namespace=cpu-example
輸出顯示 Pod 狀態(tài)為 Pending。也就是說(shuō),Pod 未被調(diào)度到任何節(jié)點(diǎn)上運(yùn)行, 并且 Pod 將無(wú)限期地處于 Pending 狀態(tài):
NAME READY STATUS RESTARTS AGE cpu-demo-2 0/1 Pending 0 7m
3.2.3、Pod 詳情
可以輸入以下命令,查看有關(guān) Pod 的詳細(xì)信息,包含事件
$ kubectl describe pod cpu-demo-2 --namespace=cpu-example
輸出顯示由于節(jié)點(diǎn)上的 CPU 資源不足,無(wú)法調(diào)度容器:
Events: Reason Message ------ ------- FailedScheduling No nodes are available that match all of the following predicates:: Insufficient cpu (3).
3.2.4、刪除 Pod
當(dāng)然,我也可以使用命名刪除你的 Pod
$ kubectl delete pod cpu-demo-2 --namespace=cpu-example
四、不限制CPU
如果沒(méi)有為容器指定 CPU 限制,則會(huì)發(fā)生以下情況之一:
- 容器在可以使用的 CPU 資源上沒(méi)有上限。因而可以使用所在節(jié)點(diǎn)上所有的可用 CPU 資源。
- 容器在具有默認(rèn) CPU 限制的名字空間中運(yùn)行,系統(tǒng)會(huì)自動(dòng)為容器設(shè)置默認(rèn)限制。 集群管理員可以使用 LimitRange 指定 CPU 限制的默認(rèn)值。
如果為容器指定了 CPU 限制值但未為其設(shè)置 CPU 請(qǐng)求,Kubernetes 會(huì)自動(dòng)為其 設(shè)置與 CPU 限制相同的 CPU 請(qǐng)求值。類似的,如果容器設(shè)置了內(nèi)存限制值但未設(shè)置 內(nèi)存請(qǐng)求值,Kubernetes 也會(huì)為其設(shè)置與內(nèi)存限制值相同的內(nèi)存請(qǐng)求。
總結(jié)
本篇文章通過(guò)配置集群中運(yùn)行的容器的 CPU 請(qǐng)求和限制,你可以有效利用集群上可用的 CPU 資源。 通過(guò)將 Pod CPU 請(qǐng)求保持在較低水平,可以使 Pod 更有機(jī)會(huì)被調(diào)度。 通過(guò)使 CPU 限制大于 CPU 請(qǐng)求,你可以完成兩件事:
- Pod 可能會(huì)有突發(fā)性的活動(dòng),它可以利用碰巧可用的 CPU 資源。
- Pod 在突發(fā)負(fù)載期間可以使用的 CPU 資源數(shù)量仍被限制為合理的數(shù)量。
到此這篇關(guān)于K8s實(shí)戰(zhàn)教程之容器和 Pods資源分配的文章就介紹到這了,更多相關(guān)K8s 容器和 Pods資源分配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ES業(yè)務(wù)數(shù)據(jù)遷移遇到的精度問(wèn)題BUG
這篇文章主要為大家介紹了ES業(yè)務(wù)數(shù)據(jù)遷移遇到的BUG精度問(wèn)題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06k8s數(shù)據(jù)存儲(chǔ)之Volume使用示例詳解
Kubernetes 卷(Volume)這一抽象概念能夠解決這兩個(gè)問(wèn)題,卷的核心是包含一些數(shù)據(jù)的目錄,Pod 中的容器可以訪問(wèn)該目錄,這篇文章主要介紹了k8s數(shù)據(jù)存儲(chǔ)之Volume使用詳解,需要的朋友可以參考下2023-03-03RFO SIG之openEuler AWS AMI 制作詳解
這篇文章主要為大家介紹了RFO SIG之openEuler AWS AMI 制作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10K8S?實(shí)用工具之合并多個(gè)kubeconfig實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了K8S?實(shí)用工具之合并多個(gè)kubeconfig實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03kubernetes日志備份解決ELK中日志丟失問(wèn)題
這篇文章主要為大家介紹了kubernetes日志備份方案的細(xì)節(jié)探究分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Rainbond的ServiceMesh架構(gòu)組件端口沖突處理解決
這篇文章主要大家介紹了Rainbond?ServiceMesh架構(gòu)組件端口沖突處理方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04