综述
K8s中对资源的限制分以下情况:
- 对
namespace
中容器、pod
等使用总和限制
ResourceQuota
- 对
namespace
中容器、pod
等使用单独限制:
LimitRange
创建一个namespace
用于测试
kubectl create namespace quota-mem-cpu-example
创建一个ResourceQuota
创建一个ResourceQuota
对namespace
中资源使用总和做限制,创建quota-mem-cpu.yaml
资源配额的类型
- 计算资源,包括
cpu
和memory
cpu
,limits.cpu
,requests.cpu
memory
,limits.memory
,requests.memory
- 存储资源,包括存储资源的总量以及指定
storage class
的总量
requests.storage
:存储资源总量,如500Gi
persistentvolumeclaims
:pvc
的个数storageclass.storage.k8s.io/requests.storage
storageclass.storage.k8s.io/persistentvolumeclaims
- 对象数,即可创建的对象的个数
pods
,replicationcontrollers
,configmaps
,secrets
resourcequotas
,persistentvolumeclaims
services
,services.loadbalancers
,services.nodeports
示例1:
apiVersion: v1
kind: ResourceQuota
metadata:
name: object-counts
spec:
hard:
pods: "4"
configmaps: "10"
persistentvolumeclaims: "4"
replicationcontrollers: "20"
secrets: "10"
services: "10"
services.loadbalancers: "2"
示例2:
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
kubectl create -f quota-mem-cpu.yaml --namespace=quota-mem-cpu-example
查看 ResourceQuota
详情:
kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
ResourceQuota
在quota-mem-cpu-example
命名空间中设置了如下要求:
- 每个容器必须有内存请求和限制,以及
CPU
请求和限制。- 所有容器的内存请求总和不能超过
1 GiB
。- 所有容器的内存限制总和不能超过
2 GiB
。- 所有容器的
CPU
请求总和不能超过1 cpu
。- 所有容器的
CPU
限制总和不能超过2 cpu
。
创建一个LimitRange
创建一个LimitRange
,对namespace
中pod
、容器设置单独的默认限制
创建limits.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
spec:
limits:
- default: # default limit
memory: 512Mi
cpu: 2
defaultRequest: # default request
memory: 256Mi
cpu: 0.5
max: # max limit
memory: 800Mi
cpu: 3
min: # min request
memory: 100Mi
cpu: 0.3
maxLimitRequestRatio: # max value for limit / request
memory: 2
cpu: 2
type: Container # limit type, support: Container / Pod / PersistentVolumeClaim
kubectl create -f limits.yaml --namespace=limit-example
查看一下在该 Namespace
中被强加的限制
kubectl describe limits mylimits --namespace=limit-example
CPU
和内存的单位
CPU
的测量单位是cpus
,允许分数值。你可以使用前缀m
来表示mili
(千分之一)。例如100mcpu
就是100 milicpu
,等价于0.1CPU
。- 内存的测量单位是字节。你可以使用纯整数来表示内存,也可以使用一些前缀:
E
,P
,T
,G
,M
,K
,Ei
,Pi
,Ti
,Gi
,Mi
,Ki
.
创建pod
时,指定资源限制
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: "800m"
requests:
memory: "600Mi"
cpu: "400m"