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-
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:
cpu: 0.5
memory: 500M
hugepages-内存大小:
limits:
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 < 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 < 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