指定CPU请求和CPU限制node
要为容器指定CPU请求,在容器资源清单中使用resources:requests字段。要指定CPU限制,使用resources:limits。api
cpu-request-limit.yamlapp
1 apiVersion: v1 2 kind: Pod 3 metadata: 4 name: cpu-demo 5 namespace: cpu-example 6 spec: 7 containers: 8 - name: cpu-demo-ctr 9 image: vish/stress 10 resources: 11 limits: 12 cpu: "1" 13 requests: 14 cpu: "0.5" 15 args: 16 - -cpus 17 - "2"
配置文件的args部分在容器启动时为其提供参数。-cpus“2”参数告诉容器尝试使用2个cpu。spa
建立Pod:线程
kubectl apply -f cpu-request-limit.yaml --namespace=cpu-example
确认POD正在运行:code
kubectl get pod cpu-demo --namespace=cpu-example
查看有关POD的详细信息:blog
kubectl get pod cpu-demo --output=yaml --namespace=cpu-example
输出显示Pod中的一个容器具备500 milliCPU的CPU请求和1 CPU的CPU限制。事件
resources: limits: cpu: "1" requests: cpu: 500m
使用kubectl top获取Pod的度量:ci
kubectl top pod cpu-demo --namespace=cpu-example
这个示例输出显示pod正在使用974milliCPU,这只是比Pod配置中指定的1CPU的限制少了一点。资源
NAME CPU(cores) MEMORY(bytes)
cpu-demo 974m <something>
回想一下,经过设置-cpu“2”,将容器配置为尝试使用2个CPU,但容器只容许使用大约1个CPU。容器的CPU使用正在被限制,由于容器正在尝试使用超过其限制的CPU资源。
注意:CPU使用低于1.0的另外一个可能的解释是节点可能没有足够的可用CPU资源。回想一下,这个练习的先决条件要求每一个节点至少有一个cpu。若是容器在只有1个CPU的节点上运行,则不管为容器指定的CPU限制如何,容器都不能使用超过1个CPU。
CPU单元
CPU资源是以CPU单位度量的。在kubernetes中,一个CPU至关于:
- 1 AWS VCPU
- 1 GCP核心
- 1个azure vcore
- 1个带超线程的裸机Intel处理器上的超线程
容许使用小数。一个请求0.5CPU的容器的cpu保证是请求1CPU的容器的一半。你能够用后缀m来表示milli。例如100M CPU、100毫CPU和0.1 CPU都是相同的。不容许精度小于1m。
CPU老是做为绝对数量请求,而不是做为相对数量;0.1是单核、双核或48核计算机上相同数量的CPU。
删除Pod
kubectl delete pod cpu-demo --namespace=cpu-example
指定对节点来讲太大的CPU请求
CPU请求和限制与容器相关,但将Pod视为具备CPU请求和限制是有用的。Pod的CPU请求是Pod中全部容器的CPU请求的总和。一样,Pod的CPU限制是Pod中全部容器的CPU限制之和。
Pod调度基于请求。只有当节点有足够的CPU资源来知足Pod CPU请求时,Pod才会被安排在节点上运行。
以下将建立一个Pod,它的CPU请求太大,超过集群中任何节点的容量。这是一个有一个容器的Pod的配置文件。容器请求100个CPU,这可能会超过集群中任何节点的容量。
cpu-request-limit-2.yaml
apiVersion: v1 kind: Pod metadata: name: cpu-demo-2 namespace: cpu-example spec: containers: - name: cpu-demo-ctr-2 image: vish/stress resources: limits: cpu: "100" requests: cpu: "100" args: - -cpus - "2"
建立Pod:
kubectl apply -f cpu-request-limit-2.yaml --namespace=cpu-example
查看POD状态:
kubectl get pod cpu-demo-2 --namespace=cpu-example
输出显示POD状态为挂起。也就是说,pod没有被安排在任何节点上运行,它将无限期地保持在挂起状态:
kubectl get pod cpu-demo-2 --namespace=cpu-example
NAME READY STATUS RESTARTS AGE cpu-demo-2 0/1 Pending 0 7m
查看有关POD的详细信息,包括事件:
kubectl describe pod cpu-demo-2 --namespace=cpu-example
输出显示,因为节点上的CPU资源不足,没法计划容器:
Events: Reason Message ------ ------- FailedScheduling No nodes are available that match all of the following predicates:: Insufficient cpu (3).
删除Pod:
kubectl delete pod cpu-demo-2 --namespace=cpu-example
若是未指定CPU限制
若是未指定容器的CPU限制,则如下状况之一适用:
- 容器对它可使用的CPU资源没有上限。容器可使用其运行所在节点上可用的全部CPU资源。
- 容器正在具备默认CPU限制的命名空间中运行,容器将自动分配默认限制。群集管理员可使用LimitRange指定CPU限制的默认值。
CPU请求和限制的动机
经过配置集群中运行的容器的CPU请求和限制,能够有效地利用集群节点上可用的CPU资源。经过保持Pod CPU请求低,能够给Pod很好的被调度的机会。经过CPU限制大于CPU请求,您能够完成两件事:
- pod能够有突发的活动,在那里它能够利用cpu资源碰巧是可用的。
- pod在突发期间可使用的cpu资源量被限制在某个合理的数量。