一、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
2.然后运行pod,查看下pod的详细信息看资源配置是否生效
[root@k8s-master ~]# kubectl describe pod/pod-limits
...
Limits:
cpu: 2
memory: 2Gi
Requests:
cpu: 600m
memory: 614Mi
...
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>
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
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,
...
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
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字节)
内存的计算方法为:2147483648÷1024÷1024÷1024 = 2(G)
四、查看Pod资源限制已使用资源
主要查看node允许分配资源汇总配置里面的Requests
值,它代表的是已分配出的资源;文章来源:https://www.toymoban.com/news/detail-726142.html
[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>
总结
注:文章来源地址https://www.toymoban.com/news/detail-726142.html
- CPU 资源是
可压缩资源
,也就是容器达到了这个设定的上限后,容器性能会下降,但是不会终止或退出。 - 内存是
不可压缩性资源
,如果容器使用内存资源到达了上限,那么会OOM,造成内存溢出,容器就会终止和退出。 - 一个
node
节点默认最多运行110个
Pod,可通过修改kubelet的maxPods
参数进行修改。
到了这里,关于Kubernetes 对Pod的资源限制详解;的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!