在kubernetes中,如果运行的容器没有定义资源等限制,但是在namespace中定义了LimitRange限制,那么该容器会继承LimitRange中的默认限制。如果namespace没有定义LimitRange限制,那么该容器可以使用宿主机的最大可用资源,直至无资源可用而触发宿主机OOM Killer。
cpu资源
概念:CPU 的使用时间是可压缩的,换句话说它本身无状态,申请资源很快,也能快速正常回收;
CPU 以核心为单位进行限制,单位可以是整核、浮点核心数或毫核(m/milli):
2=2核心=200% 0.5=500m=50% 1.2=1200m=120%
官方文档:https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-cpu-resource/
内存资源
概念:内存(memory)大小是不可压缩的,因为它是有状态的(内存里面保存的数据),申请资源很慢(需要计算和分配内存块的空间),并且回收可能失败(被占用的内存一般不可回收)。
memory 以字节为单位,单位可以是E、P、T、G、M、K、Ei、Pi、Ti、Gi、Mi、Ki
官方文档:https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-memory-resource/
容器的CPU及memory实现资源限制
requests【请求资源】为kubernetes schedule执行pod调度时node节点至少需要拥有的空闲资源。
limit【限制资源】为kubernetes中pod运行成功后最大可以使用的资源上限。
Limit Range对具体某个Pod或容器的资源使用进行限制
apiVersion: v1
kind: LimitRange
metadata:
name: limitrange-myserver
namespace: myserver
spec:
limits:
- type: Container #限制的资源类型
max:
cpu: "2" #限制单个容器的最大CPU
memory: "2Gi" #限制单个容器的最大内存
min:
cpu: "500m" #限制单个容器的最小CPU
memory: "512Mi" #限制单个容器的最小内存
default:
cpu: "500m" #默认单个容器的CPU限制
memory: "512Mi" #默认单个容器的内存限制
defaultRequest:
cpu: "500m" #默认单个容器的CPU创建请求
memory: "512Mi" #默认单个容器的内存创建请求
maxLimitRequestRatio:
cpu: 2 #限制CPU limit/request比值最大为2
memory: 2 #限制内存limit/request比值最大为1.5
- type: Pod
max:
cpu: "4" #限制单个Pod的最大CPU
memory: "4Gi" #限制单个Pod最大内存
- type: PersistentVolumeClaim
max:
storage: 50Gi #限制PVC最大的requests.storage
min:
storage: 30Gi #限制PVC最小的requests.storage
对整个namespace的CPU及memory实现资源限制
官方文档:https://kubernetes.io/zh/docs/concepts/policy/resource-quotas/
限定某个对象类型(如Pod、service)可创建对象的总数;
限定某个对象类型可消耗的计算资源(CPU、内存)与存储资源(存储卷声明)总数;
apiVersion: v1
kind: ResourceQuota
metadata:
name: quota-myserver
namespace: myserver
spec:
hard:
requests.cpu: "8"
limits.cpu: "8"
requests.memory: 8Gi
limits.memory: 8Gi
requests.nvidia.com/gpu: 4
pods: "6"
services: "6"