默認(rèn)的情況下, k8s不會限制pod的cpu和內(nèi)存的, 也就是只要pod內(nèi)應(yīng)用需要, 完全可以占滿宿主機的cpu和內(nèi)存, 如果是這種情況, 當(dāng)有大量的服務(wù)一起部署時, 相互之間是會相互影響的, 所以k8s也有相應(yīng)的辦法限制pod及里面容器的cpu和內(nèi)存
準(zhǔn)備工作
# 創(chuàng)建namespace xxx
kubectl create namespace xxx
# 下載官方提供的示例文件
wget https://k8s.io/docs/tasks/configure-pod-container/limits.yaml
# 內(nèi)容如下
##############################
apiVersion: v1
kind: LimitRange
metadata:
name: mylimits
spec:
limits:
- max:
cpu: "2"
memory: 1Gi
min:
cpu: 200m
memory: 6Mi
type: Pod
- default:
cpu: 300m
memory: 200Mi
defaultRequest:
cpu: 200m
memory: 100Mi
max:
cpu: "2"
memory: 1Gi
min:
cpu: 100m
memory: 3Mi
type: Container
##############################
Pod相關(guān)限制
cpu最大限制2核, 最小200MHZ
內(nèi)存最大限制1G, 最小6M
Container相關(guān)限制
cpu最大限制2核, 最小200MHZ
內(nèi)存最大限制1G, 最小6M
默認(rèn)啟動cpu最大限制300MHZ, 內(nèi)存最大限制200M
創(chuàng)建指定namespace資源限制
kubectl create -f limits.yaml -n xxx
# 查看創(chuàng)建好的資源限制
kubectl get limits -n xxx
之后在這個namespace下創(chuàng)建的Pod及容器都遵循這個規(guī)則
在創(chuàng)建容器的配置文件中指定
spec:
containers:
- image: gcr.io/google_containers/serve_hostname
imagePullPolicy: Always
name: kubernetes-serve-hostname
resources:
limits:
cpu: "1"
memory: 512Mi
requests:
cpu: "1"
memory: 512Mi
如果按照這個規(guī)范, 相關(guān)的容器會限制在這個范圍內(nèi)
如果兩者都配置?
有些時候, 我們大部分容器遵循一個規(guī)則就好, 但有一小部分有特殊需求, 這個時候, 小部分的就需要單獨在容器的配置文件中指定. 這里有一點要注意的是, 單獨在容器中配置的參數(shù)是不能大于指定的k8s資源限制, 否則會報錯, 容器無法啟動
PS: 對于一些java項目, 必須設(shè)置java虛擬機的參數(shù), 而且這個參數(shù)不能大于容器設(shè)置的限定值, 否則容器會因為內(nèi)存過大不停的重啟
相關(guān)參考: https://kubernetes.io/docs/tasks/administer-cluster/cpu-memory-limit/