Pod资源限制
Pod资源限制:
限制两个维度:
-
pod
- cpu、内存、gpu、网络、磁盘io
-
namespace
- 对pod使用总资源限制
- 对pvc使用总资源限制
限制策略
- requests: 需求,最低运行环境。但不是立即使用,用多少占多少
- limits: 限制,最大使用上限
可限制资源:
CPU资源:
例:1核心的cpu,使用时支持小数、毫核
1c=1000m millicores(毫核)
0.5c=500m
内存资源:
E、P、T、G、M、K
Ei、Pi、Ti、Gi、Mi、Ki
hugepages(大内存页):
不建议手动分配,如果每个系统内存页不同,可能会出现奇怪的问题
hugepages-<size>: 内存
hugepages-2Mi: 80Mi #在默认内存页为4KiB的系统上,如果容器尝试分配超过40个2MiB的大页面(总共 80MiB),则分配失败
gpu:
对于图形计算才用得到,同时也需要物理机有英伟达显卡
需要装相应的插件才能识别gpu资源
nvidia.com/gpu: 1
amd.com/gpu: 1
Qos服务质量类别:
当容器被限制了资源后,自动归类到此
Guranteed(确保)
同时设置了cpu和内存的requests和limits,且满足以下
cpu.limits = cpu.requests
mem.limits = mem.requests
此类优先级最高,如果其他pod也要运行,但有标记了此类的,优先运行他们
Burstable
至少一个容器设置了cpu或内存资源的requests
BestEffort
没有一个容器设置了requests或limits
当资源不足时,此类资源优先被终止,腾出资源给前面的两种
查看pod的Qos:
kubectl get po b1-689bb88886-2dssl -o template --template={{.status.qosClass}} ;echo
POD级别配置语法:
kubectl explain pod.spec.containers.resources
pod.spec.containers.resources:
requests: <map[string]string>
cpu: 0.5
memory: 500M
hugepages-内存大小:
limits: <map[string]string>
cpu:
memory:
hugepages-内存大小:
例1: 限制pod运行资源
apiVersion: v1
kind: Pod
metadata:
name: tomcat
namespace: default
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
resources:
requests:
cpu: "100m"
memory: "100Mi"
limits:
cpu: "0.3"
memory: "100Mi"
apiVersion: v1
kind: LimitRange
metadata:
namespace: default
name: limits-default
spec:
limits:
- type: Container
default:
cpu: 1
memory: 200Mi
defaultRequest:
cpu: 1
memory: 200Mi
min:
cpu: 1
memory: 100Mi
max:
cpu: 2
memory: 2Gi
maxLimitRequestRatio:
cpu: 2
memory: 2
- type: PersistentVolumeClaim
default:
storage: 1Gi
defaultRequest:
storage: 1Gi
max:
storage: 5Gi
- type: Pod
max:
cpu: 4
memory: 5Gi
Namespace级别配置语法
命名空间内资源限制
只是限制命令空间单个pod、容器、pvc的容量限制,并不是对命名空间总共允许使用的资源限制
kubectl explain limits.spec
apiVersion: v1
kind: LimitRange
metadata:
name: default
spec:
limits:
- type: 限制类型
#Pod
#Container
#PersistentVolumeClaim
#PodTemplate
#Namespace
default: #此处定义默认限制值
cpu: 500m
memory: 100Mi
storage: 10Gi #此选项仅用于pvc类型,配置pvc创建大小
defaultRequest: #此处定义默认请求值
min:
max:
maxLimitRequestRatio:
cpu: 2 #限制cpu limit和request比例最大为2,也就是pod创建时,request指定的大小*2后,必须等于limit指定的值,如:
#request: 1,limit: 2。合法创建,如果为1.5就不能被创建
request: 1,limit: 4。不合法创建,两者的比例是1/4了
memory: 2 #限制内存limit和request比例最大为2
例1: 命名空间资源限制
1)创建资源限制
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: LimitRange
metadata:
namespace: default
name: limits-default
spec:
limits:
- type: Container
default:
cpu: 1
memory: 200Mi
defaultRequest:
cpu: 1
memory: 200Mi
min:
cpu: 1
memory: 100Mi
max:
cpu: 2
memory: 2Gi
maxLimitRequestRatio:
cpu: 2
memory: 2
- type: PersistentVolumeClaim
default:
storage: 1Gi
defaultRequest:
storage: 1Gi
max:
storage: 5Gi
- type: Pod
max:
cpu: 4
memory: 5Gi
EOF
2)创建测试pod
cat <<eof |kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: tomcat
namespace: default
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
resources:
requests:
cpu: 2
memory: 200Mi
limits:
cpu: 1
memory: 100Mi
eof

命名空间资源配额
对命名空间的资源使用配置上限,超过后拒绝创建pod
支持配额的资源:https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/
kubectl explain quota.spec
apiVersion: v1
kind: ResourceQuota
metadata:
name: quota
namespace: default
spec:
hard:
requests.cpu: "1" #命名空间中所有 Pod 的内存请求总和不能超过 1 GiB
requests.memory: 1Gi #命名空间中所有 Pod 的 CPU 请求总和不能超过 1 cpu
limits.cpu: "2" #命名空间中所有 Pod 的 CPU 限制总和不能超过 2 cpu
limits.memory: 2Gi #命名空间中所有 Pod 的内存限制总和不能超过 2 GiB
scopeSelector: #指定命名空间中哪些Pod会受到限制
matchExpressions: #使用标签选择器
operator:
#DoesNotExist
#Exists
#In
#NotIn
scopeName:
#BestEffort,Pod没有设置资源请求和限制,即使用集群中的剩余资源
#CrossNamespacesPodAffinity,只有符合跨命名空间Pod亲和性策略的Pod会受到限制,跨命名空间Pod亲和性策略是指Pod与其他命名空间中的Pod有亲和性要求
#NotBestEffort,不符合BestEffort策略的Pod会受到限制
#NotTerminating,不符合终止状态的pod受到限制
#PriorityClass,只有设置了优先级的Pod会受到限制
#Terminating,只有在终止状态pod受到限制
values:
- 命名空间
scopes: #指定命名空间中哪些Pod会受到配额限制
#BestEffort
#NotTerminating
例1: 命名空间资源配额
1)创建资源配额
cat <<-eof |kubectl apply -f -
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
namespace: default
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
requests.nvidia.com/gpu: 4
pods: 4
services: 6
eof
2)创建测试pod
cat <<-eof |kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo
spec:
containers:
- name: quota-mem-cpu-demo-ctr
image: nginx
resources:
limits:
memory: 800Mi
cpu: 2
requests:
memory: 400Mi
cpu: 1
eof
3)查看配额使用情况
#可以看到,已经cpu已经使用完了,内存还剩600Mi
kubectl describe quota


浙公网安备 33010602011771号