当前位置:   article > 正文

Kubernetes 对Pod的资源限制详解;_limits 限制资源

limits 限制资源

一、K8s对Pod资源配置详解

limits限制容器最高使用多少资源:

  • resources.limits.cpu
  • resources.limits.memory

request是容器使用的最小资源申请,也就是说这个容器里的服务至少给它多少资源才能运行,作为容器调度时资源分配的依据:(对于k8s来说是预留,主要用作于k8s对node资源的一个规划和分配)
requests一般小于limits限制的20%-30%

  • resources.requests.cpu
  • resources.requests.memory

CPU单位:可以写m也可以写浮点数,例如0.5核=500m,1核=1000m,2核=2000m;

m毫核,cpu单位;Kubernetes 集群中的每一个节点可以通过操作系统的命令来确认本节点的 CPU 内核数量,然后将这个数量乘以1000,得到的就是节点总 CPU 总毫数。比如一个节点有四核,那么该节点的 CPU 总毫量为 4000m,如果你要使用0.5 core,则你要求的是 4000*0.5 = 2000m。

内存单位:1 MiB = 1024 KiB,内存这块在 Kubernetes 里一般用的是Mi单位,当然你也可以使用Ki、Gi甚至Pi,看具体的业务需求和资源容量;

这里注意的是MiB ≠ MB,MB 是十进制单位,MiB 是二进制,平时我们以为 MB 等于 1024KB,其实1MB=1000KB,1MiB才等于1024KiB。中间带字母 i 的是国际电工协会(IEC)定的,走1024乘积;KB、MB、GB是国际单位制,走1000乘积。

二、K8s对Pod资源配置的限制

资源配置的限制:

  • limits建议不能超出宿主机的配置,否则没意义了,至少要低于宿主机配置的20%;
  • requests的值必须小于或等于limits的限制;
  • k8s会根据requests的值去查找能满足该值的node进行调度,如果不满足,pod将处于未分配状态;
  • requests值不能设置太大,因为requests决定了一个节点能分配的pod数量;所以不要设置太大,否则会造成node资源浪费,即跑的pod少,实际负载很低;
  • kubectl describe node/k8s-node1查看节点资源分配情况;

三、K8s对Pod资源配置的实战

1.例如:限制一个容器只能使用2核cpu和2G内存,方法如下

apiVersion: v1
kind: Pod
metadata:
  name: "pod-limits"
  namespace: default
  labels:
    app: "pod4"
spec:
  containers:
  - name: pod4
    image: "nginx:latest"
    ##资源配置##
    resources:
      #限制容器最高使用多少资源
      limits:
        cpu: 2
        memory: 2Gi
      #容器使用的最小资源(也是调度时的依据)
      requests:
        cpu: 0.6
        memory: 614Mi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

2.然后运行pod,查看下pod的详细信息看资源配置是否生效

[root@k8s-master ~]# kubectl describe pod/pod-limits
...
    Limits:
      cpu:     2
      memory:  2Gi
    Requests:
      cpu:        600m
      memory:     614Mi
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3.创建完成功这个pod后,我们可以看到这个pod被分配到了node1上

[root@k8s-master ~]# kubectl get pod -o wide 
NAME          READY   STATUS    RESTARTS   AGE   IP              NODE        NOMINATED NODE   READINESS GATES
pod-limits    1/1     Running   0          11d   10.244.36.108   k8s-node1   <none>           <none>
  • 1
  • 2
  • 3

4.然后到node1上去查看这个pod里面启动的容器的资源限制

[root@k8s-node1 ~]# docker ps | grep limits
#主容器
6933185dbe4b   nginx                                                                   "/docker-entrypoint.…"   2 minutes ago        Up 2 minutes                  k8s_pod4_pod-limits_default_b8919bf5-a355-4f13-acbc-a5b291e31a6f_0
#Infra容器
f2723187db48   registry.aliyuncs.com/google_containers/pause:3.2                       "/pause"                 2 minutes ago        Up 2 minutes                  k8s_POD_pod-limits_default_b8919bf5-a355-4f13-acbc-a5b291e31a6f_0
  • 1
  • 2
  • 3
  • 4
  • 5

5.我们去看下主容器的信息

[root@k8s-node1 ~]# docker inspect aa659bf24d9c
...
            "CpuShares": 614,
            "Memory": 2147483648,
            "NanoCpus": 0,
            "CgroupParent": "kubepods-burstable-podb8919bf5_a355_4f13_acbc_a5b291e31a6f.slice",
            "BlkioWeight": 0,
            "BlkioWeightDevice": null,
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 100000,
            "CpuQuota": 200000,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 2147483648,
            "MemorySwappiness": null,
            "OomKillDisable": false,
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

6.实际上我们就可以看到这个容器的一些资源情况,Pod 上的资源配置最终也还是通过底层的容器运行时去控制 CGroup 来实现的,我们可以进入如下目录查看 CGroup 的配置,该目录就是 CGroup 父级目录,而 CGroup 是通过文件系统来进行资源限制的,所以我们上面限制容器的资源就可以在该目录下面反映出来:

##查看CPU的限制##
[root@k8s-node1 ~]# docker exec -it 6933185dbe4b /bin/bash
root@pod-limits:/# cd /sys/fs/cgroup/cpu/
root@pod-limits:/sys/fs/cgroup/cpu# cat cpu.cfs_period_us 
100000
root@pod-limits:/sys/fs/cgroup/cpu# cat cpu.cfs_quota_us  
200000
#反向计算出--cpus参数
#cpu.cfs_quota_us / cpu.cfs_period_us = cpu的限制
root@pod-limits:/sys/fs/cgroup/cpu# expr `cat cpu.cfs_quota_us` / `cat cpu.cfs_period_us`
2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

cpu.cfs_period_us和cpu.cfs_quota_us来限制该组中的所有进程在单位时间里可以使用的cpu时间。
cpu.cfs_period_us:时间周期(微秒);
cpu.cfs_quota_us:指的是在cpu.cfs_period_us周期内可使用的cpu的时间(微秒);
多核场景下,如配置cpu.cfs_period_us=10000,而cfs_quota_us=20000,表示该cgroup可以完全使用2个cpu。
所以cpu的计算方法为:cfs_quota_us / cpu.cfs_period_us

##查看内存的限制##
[root@k8s-node1 ~]# docker exec -it 6933185dbe4b /bin/bash
root@pod-limits:~# cd /sys/fs/cgroup/memory/
root@pod-limits:/sys/fs/cgroup/memory# cat memory.limit_in_bytes 
2147483648 (Byte字节)
  • 1
  • 2
  • 3
  • 4
  • 5

内存的计算方法为:2147483648÷1024÷1024÷1024 = 2(G)

四、查看Pod资源限制已使用资源

主要查看node允许分配资源汇总配置里面的Requests值,它代表的是已分配出的资源;

[root@k8s-master goodgood-study]# kubectl describe nodes/k8s-node1
...
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
                     #已分配出的资源(例如下cpu已使用81%)     
  Resource           Requests          Limits
  --------           --------          ------
  cpu                3250m (81%)       6 (150%)
  memory             4460300800 (26%)  9Gi (58%)
  ephemeral-storage  0 (0%)            0 (0%)
  hugepages-1Gi      0 (0%)            0 (0%)
  hugepages-2Mi      0 (0%)            0 (0%)
Events:              <none>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

总结

注:

  • CPU 资源是可压缩资源,也就是容器达到了这个设定的上限后,容器性能会下降,但是不会终止或退出。
  • 内存是不可压缩性资源,如果容器使用内存资源到达了上限,那么会OOM,造成内存溢出,容器就会终止和退出。
  • 一个node节点默认最多运行110个Pod,可通过修改kubelet的maxPods参数进行修改。
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号