kubernetes-CPU资源限制实践

138 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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
.....

图片.png

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资源和内存资源最大最小值