kubernetes(k8s)為容器和 Pod 分配內(nèi)存資源
展示如何將內(nèi)存請(qǐng)求(request)和內(nèi)存限制(limit)分配給一個(gè)容器。 我們保障容器擁有它請(qǐng)求數(shù)量的內(nèi)存,但不允許使用超過(guò)限制數(shù)量的內(nèi)存。
創(chuàng)建新的命名空間
kubectl create namespace mem-example
指定內(nèi)存請(qǐng)求和限制
編輯yaml文件
#創(chuàng)建一個(gè)擁有一個(gè)容器的Pod
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
namespace: mem-example
spec:
containers:
- name: memory-demo-ctr
image: polinux/stress
#容器會(huì)請(qǐng)求100MiB的內(nèi)存,并且內(nèi)存會(huì)被限制在200MiB以內(nèi)
resources:
requests:
memory: "100Mi"
limits:
memory: "200Mi"
#容器啟動(dòng)時(shí)使用壓力測(cè)試工具stress
command: ["stress"]
# "--vm","1" 產(chǎn)生一個(gè)子進(jìn)程; --vm 2 產(chǎn)生兩個(gè)進(jìn)程
# "--vm-bytes","150M" 每個(gè)進(jìn)程分配150M
# "--vm-hang","1" 指每個(gè)消耗內(nèi)存的進(jìn)程在分配內(nèi)存后轉(zhuǎn)入睡眠1秒,然后釋放內(nèi)存一直重復(fù)執(zhí)行這個(gè)過(guò)程
args: ["--vm","1","--vm-bytes","150M","--vm-hang","1"]
配置文件的 args 部分提供了容器啟動(dòng)時(shí)的參數(shù)。 “–vm-bytes”, “150M” 參數(shù)告知容器嘗試分配 150 MiB 內(nèi)存。
創(chuàng)建pod
kubectl apply -f memory-request-limit.yaml
查看Pod是否正常運(yùn)行
kubectl get pod memory-demo -n mem-example
查看 Pod 相關(guān)的詳細(xì)信息
kubectl get pod memory-demo -n mem-example -o yaml
輸出結(jié)果顯示:該 Pod 中容器的內(nèi)存請(qǐng)求為 100 MiB,內(nèi)存限制為 200 MiB。
運(yùn)行 kubectl top 命令,獲取該 Pod 的指標(biāo)數(shù)據(jù):
如果出現(xiàn)以下問(wèn)題
W0323 15:03:25.034693 2441 top_pod.go:140] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag
error: Metrics API not available
解決辦法
下載部署文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml
修改鏡像地址
sed -i 's/registry.k8s.io/metrics-server\/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' metrics-server-components.yaml
如果更改不成功,可手動(dòng)更改或者參照《史上最全操作教程——利用阿里云FREE鏡像倉(cāng)庫(kù)構(gòu)建國(guó)外DOCKER鏡像》這篇文章
在metrics-server-components.yaml文件中添加這一行內(nèi)容“- --kubelet-insecure-tls”這個(gè)配置,就不會(huì)去驗(yàn)證Kubelets提供的服務(wù)證書(shū)的CA。
部署metrics-server
kubectl apply -f metrics-server-components.yaml
查看該 Pod 的指標(biāo)數(shù)據(jù)
kubectl top pod memory-demo --namespace=mem-example
輸出結(jié)果顯示:Pod 正在使用的內(nèi)存大約為 150 MiB。 這大于 Pod 請(qǐng)求的 100 MiB,但在 Pod 限制的 200 MiB之內(nèi)。
超過(guò)容器限制的內(nèi)存
當(dāng)節(jié)點(diǎn)擁有足夠的可用內(nèi)存時(shí),容器可以使用其請(qǐng)求的內(nèi)存。 但是,容器不允許使用超過(guò)其限制的內(nèi)存。 如果容器分配的內(nèi)存超過(guò)其限制,該容器會(huì)成為被終止的候選容器。 如果容器繼續(xù)消耗超出其限制的內(nèi)存,則終止容器。 如果終止的容器可以被重啟,則 kubelet 會(huì)重新啟動(dòng)它,就像其他任何類型的運(yùn)行時(shí)失敗一樣。
創(chuàng)建一個(gè) Pod,嘗試分配超出其限制的內(nèi)存。 這是一個(gè) Pod 的配置文件,其擁有一個(gè)容器,該容器的內(nèi)存請(qǐng)求為 50 MiB,內(nèi)存限制為 100 MiB
編寫(xiě)memory-request-limit2.yaml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo-2
namespace: mem-example
spec:
containers:
- name: memory-demo-2-ctr
image: polinux/stress
resources:
#請(qǐng)求50MiB
requests:
memory: "50Mi"
#限制為100MiB
limits:
memory: "100Mi"
#分配250MiB內(nèi)存
command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"]
創(chuàng)建超出限制的Pod并查看容器相關(guān)信息
#創(chuàng)建Pod
kubectl apply -f memory-request-limit2.yaml
#查看容器相關(guān)信息
kubectl get pod memory-demo-2 --namespace=mem-example
NAME READY STATUS RESTARTS AGE
memory-demo-2 0/1 OOMKilled 2 26s
此時(shí),容器可能正在運(yùn)行或被殺死。重復(fù)前面的命令,直到容器被殺掉
#查看更詳細(xì)的狀態(tài)信息
kubectl get pod memory-demo-2 --output=yaml --namespace=mem-example
輸出結(jié)果顯示:由于內(nèi)存溢出(OOM),容器已被殺掉
容器可以被重啟,所以 kubelet 會(huì)重啟它。 多次運(yùn)行下面的命令,可以看到容器在反復(fù)的被殺死和重啟,輸出結(jié)果顯示:容器被殺掉、重啟、再殺掉、再重啟……
kubectl get pod memory-demo-2 --namespace=mem-example
NAME READY STATUS RESTARTS AGE
memory-demo-2 0/1 CrashLoopBackOff 6 6m19s
查看關(guān)于該 Pod 歷史的詳細(xì)信息
kubectl describe pod memory-demo-2 --namespace=mem-example
Normal Pulled 8m16s kubelet Successfully pulled image "polinux/stress" in 678.098976ms
Warning BackOff 3m58s (x25 over 8m58s) kubelet Back-off restarting failed container
超過(guò)整個(gè)節(jié)點(diǎn)容量的內(nèi)存
內(nèi)存請(qǐng)求和限制是與容器關(guān)聯(lián)的,但將 Pod 視為具有內(nèi)存請(qǐng)求和限制,也是很有用的。 Pod 的內(nèi)存請(qǐng)求是 Pod 中所有容器的內(nèi)存請(qǐng)求之和。 同理,Pod 的內(nèi)存限制是 Pod 中所有容器的內(nèi)存限制之和。
Pod 的調(diào)度基于請(qǐng)求。只有當(dāng)節(jié)點(diǎn)擁有足夠滿足 Pod 內(nèi)存請(qǐng)求的內(nèi)存時(shí),才會(huì)將 Pod 調(diào)度至節(jié)點(diǎn)上運(yùn)行。
將創(chuàng)建一個(gè) Pod,其內(nèi)存請(qǐng)求超過(guò)了你集群中的任意一個(gè)節(jié)點(diǎn)所擁有的內(nèi)存。 這是該 Pod 的配置文件,其擁有一個(gè)請(qǐng)求 1000 GiB 內(nèi)存的容器,這應(yīng)該超過(guò)了你集群中任何節(jié)點(diǎn)的容量。
編寫(xiě)memory-request-limit3.yaml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo-3
namespace: mem-example
spec:
containers:
- name: memory-demo-3-ctr
image: polinux/stress
resources:
requests:
memory: "1000Gi"
limits:
memory: "1000Gi"
command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
創(chuàng)建Pod容器
kubectl apply -f memory-request-limit3.yaml
查看容器狀態(tài)
kubectl get pod memory-demo-3 -n mem-example
輸出結(jié)果顯示:Pod 處于 PENDING 狀態(tài)。 這意味著,該 Pod 沒(méi)有被調(diào)度至任何節(jié)點(diǎn)上運(yùn)行,并且它會(huì)無(wú)限期的保持該狀態(tài)
kubectl get pod memory-demo-3 --namespace=mem-example
NAME READY STATUS RESTARTS AGE
memory-demo-3 0/1 Pending 0 25s
查看關(guān)于 Pod 的詳細(xì)信息,包括事件
kubectl describe pod memory-demo-3 --namespace=mem-example
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 3m47s default-scheduler 0/1 nodes are available: 1 Insufficient memory.
Warning FailedScheduling 3m46s default-scheduler 0/1 nodes are available: 1 Insufficient memory.
如果不指定內(nèi)存限制
如果你沒(méi)有為一個(gè)容器指定內(nèi)存限制,則自動(dòng)遵循以下情況之一:
容器可無(wú)限制地使用內(nèi)存。容器可以使用其所在節(jié)點(diǎn)所有的可用內(nèi)存, 進(jìn)而可能導(dǎo)致該節(jié)點(diǎn)調(diào)用 OOM Killer。 此外,如果發(fā)生 OOM Kill,沒(méi)有資源限制的容器將被殺掉的可行性更大。
運(yùn)行的容器所在命名空間有默認(rèn)的內(nèi)存限制,那么該容器會(huì)被自動(dòng)分配默認(rèn)限制。 集群管理員可用使用 LimitRange 來(lái)指定默認(rèn)的內(nèi)存限制。
內(nèi)存請(qǐng)求和限制的目的
通過(guò)為集群中運(yùn)行的容器配置內(nèi)存請(qǐng)求和限制,你可以有效利用集群節(jié)點(diǎn)上可用的內(nèi)存資源。 通過(guò)將 Pod 的內(nèi)存請(qǐng)求保持在較低水平,你可以更好地安排 Pod 調(diào)度。 通過(guò)讓內(nèi)存限制大于內(nèi)存請(qǐng)求,你可以完成兩件事:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-615470.html
Pod 可以進(jìn)行一些突發(fā)活動(dòng),從而更好的利用可用內(nèi)存。
Pod 在突發(fā)活動(dòng)期間,可使用的內(nèi)存被限制為合理的數(shù)量。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-615470.html
到了這里,關(guān)于kubernetes(k8s)為容器和 Pod 分配內(nèi)存資源的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!