开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
CPU资源限制实践
需要安装metrics-server,可以更好的看cpu、内存使用的情况 github.com/kubernetes-…
[root@k8s-master ~]# kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
[root@k8s-master ~]# mv components.yaml metrics-server.yaml
[root@k8s-master ~]# kubectl apply -f metrics-server.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
设置容器的CPU请求和限制
1.创建一个具有一个容器的Pod。容器将请求0.5个CPU,最多限制使用1个CPU。
[root@k8s-master /k8s/deploy]# vim cpu-requests.yaml
apiVersion: v1
kind: Pod
metadata:
name: cpu-requests
spec:
containers:
- name: cpu-requests-container
image: vish/stress
args: #容器启动命令,容器尝试使用2核cpu
- -cpus
- "2"
resources:
requests: #限制启动Pod时最多申请0.5核的cpu
cpu: "500m"
limits: #限制Pod最多使用1核CPU
cpu: "1000m"
[root@k8s-master /k8s/deploy]# kubectl apply -f cpu-requests.yaml
pod/cpu-requests created
2.查看pod详细信息,输出显示Pod中的一个容器的CPU请求为500毫核,并且CPU限制为1个CPU。
[root@k8s-master /k8s/deploy]# kubectl get pod cpu-requests -o yaml
.....
resources:
limits:
cpu: "1"
requests:
cpu: 500m
.....
3.检查资源限制情况,容器配置为尝试使用2个CPU,但是容器只被允许最大使用1个CPU。所以容器的CPU用量受到限制
[root@k8s-master ~]# kubectl top pod cpu-requests
设置超过节点的CPU请求
1.创建一个Pod,设置该pod中容器的请求为100核,这个值会大于集群中的任何一个节点
[root@k8s-master /k8s/deploy]# vim cpu-requests2.yaml
apiVersion: v1
kind: Pod
metadata:
name: cpu-requests2
spec:
containers:
- name: cpu-requests2-container
image: vish/stress
args:
- -cpus
- "2"
resources:
requests:
cpu: "100"
limits:
cpu: "100"
[root@k8s-master /k8s/deploy]# kubectl apply -f cpu-requests2.yaml
pod/cpu-requests2 created
2.查看该pod的状态,输出显示Pod状态为Pengding。也就是说,Pod未被调度到任何节点上运行
[root@k8s-master /k8s/deploy]# kubectl get pod cpu-requests2
NAME READY STATUS RESTARTS AGE
cpu-requests2 0/1 Pending 0 64s
3.查看该Pod的详细信息以及事件,输出显示由于节点上的CPU资源不足,无法调度容器
[root@k8s-master /k8s/deploy]# kubectl describe pod cpu-requests2
.....
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 2m default-scheduler 0/4 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 3 Insufficient cpu.
Warning FailedScheduling 52s default-scheduler 0/4 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 3 Insufficient cpu.
4.删除pod
[root@k8s-master /k8s/deploy]# kubectl delete pod cpu-requests2
pod "cpu-requests2" deleted
如果不指定CPU的limits
如果没有为容器指定CPU限制,那么容器在开一使用的CPU资源是没有上限。因而可以使用所在节点上所有的可用CPU资源,这样可能会造成某一个Pod占用了大量的CPU时间,可能会影响其他的Pod正常运行,从而造成业务的不稳定性。
在kubernetes中,我们可以通过LimitRange自动为容器设定所使用的CPU资源和内存资源最大最小值