lizhibing
作者lizhibing2022-10-30 20:54
系统运维工程师, 建亿通(北京)数据处理信息有限公司

k8s分配cpu、内存资源

字数 3825阅读 608评论 0赞 2

k8s分配cpu、内存资源

kubernetes在容器启动之前还会为当前的容器设置分配的 CPU、内存等资源,我们知道我们可以通过 CGroup 来对容器的资源进行限制,同样的,在 Pod 中我们也可以直接配置某个容器的使用的 CPU 或者内存的上限。那么 Pod 是如何来使用和控制这些资源的分配的呢?
CPU

首先对于 CPU,我们知道计算机里 CPU 的资源是按“时间片”的方式来进行分配的,系统里的每一个操作都需要 CPU 的处理,所以,哪个任务要是申请的 CPU 时间片越多,那么它得到的 CPU 资源就越多,这个很容器理解。

然后还需要了解下 CGroup 里面对于 CPU 资源的单位换算:

1 CPU = 1000 millicpu(1 Core = 1000m) 0 .5 CPU = 500 millicpu (0.5 Core = 500m)这里的 m 就是毫、毫核的意思,Kubernetes 集群中的每一个节点可以通过操作系统的命令来确认本节点的 CPU 内核数量,然后将这个数量乘以1000,得到的就是节点总 CPU 总毫数。比如一个节点有四核,那么该节点的 CPU 总毫量为 4000m,如果你要使用0.5 core,则你要求的是 4000*0.5 = 2000m。在 Pod 里面我们可以通过下面的两个参数来限制和请求 CPU 资源:

  • spec.containers[].resources.limits.cpu:CPU 上限值,可以短暂超过,容器也不会被停止
  • spec.containers[].resources.requests.cpu:CPU请求值,Kubernetes 调度算法里的依据值,可以超过

这里需要明白的是,如果 resources.requests.cpu 设置的值大于集群里每个节点的最大 CPU 核心数,那么这个 Pod 将无法调度,因为没有节点能满足它 。

到这里应该明白了,requests 是用于集群调度使用的资源,而 limits 才是真正的用于资源限制的配置,如果你需要保证的你应用优先级很高,也就是资源吃紧的情况下最后再杀掉你的 Pod,那么你就把你的 requests 和 limits 的值设置成一致,在后面应用的 Qos 中会具体讲解。

比如,现在我们定义一个 Pod,给容器的配置如下的资源:(pod-resource-demo1.yaml)

apiVersion: v1

kind: Pod

metadata:

name: resource-demo1

spec:

containers:

  • name: resource-demo1

image: nginx

ports:

  • containerPort: 80

resources:

requests:

memory: 50Mi

cpu: 50m

limits:

memory: 100Mi

cpu: 100m

这里,CPU 我们给的是 50m,也就是 0.05core,这 0.05 core 也就是占了 1 CPU 里的 5% 的资源时间。而限制资源是给的是 100m,但是需要注意的是 CPU 资源是可压缩资源,也就是容器达到了这个设定的上限后,容器性能会下降,但是不会终止或退出。比如我们直接创建上面这个 Pod:
$ kubectl apply -f pod-resource-demo1.yaml

创建完成后,我们可以看到 Pod 被调度到 node2 这个节点上:
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
resource-demo1 1/1 Running 0 12m 10.244.3.58 node2
然后我们到 node2 节点上去查看 Pod 里面启动的 resource-demo1 这个容器:
$ docker ps | grep resource-demo1

c9e654d573fd nginx "nginx -g 'daemon of…" 14 minutes ago Up 14 minutes k8s_resource-demo1_resource-demo1_default_020bc461-170a-4936-9c22-7c8516972d39_0

37ab54a2490a gcr.azk8s.cn/google_containers/pause:3.1 "/pause" 14 minutes ago Up 14 minutes k8s_POD_resource-demo1_default_020bc461-170a-4936-9c22-7c8516972d39_0

其中第一个容器就是我们的主容器,第二容器是 Infra 容器,我们可以去查看下主容器的信息:

$ docker inspect c9e654d573fd

......

"CpuShares": 51,

"Memory": 104857600,

"NanoCpus": 0,

"CgroupParent": "kubepods-burstable-pod020bc461_170a_4936_9c22_7c8516972d39.slice",

"BlkioWeight": 0,

"BlkioWeightDevice": null,

"BlkioDeviceReadBps": null,

"BlkioDeviceWriteBps": null,

"BlkioDeviceReadIOps": null,

"BlkioDeviceWriteIOps": null,

"CpuPeriod": 100000,

"CpuQuota": 10000,

"CpuRealtimePeriod": 0,

"CpuRealtimeRuntime": 0,

"CpusetCpus": "",

"CpusetMems": "",

"Devices": [],

"DeviceCgroupRules": null,

"DiskQuota": 0,

"KernelMemory": 0,

"MemoryReservation": 0,

"MemorySwap": 104857600,

"MemorySwappiness": null,

"OomKillDisable": false,

......

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

$ cd /sys/fs/cgroup/cpu/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod020bc461_170a_4936_9c22_7c8516972d39.slice

$ ls

cgroup.clone_children cpu.cfs_period_us docker-37ab54a2490a48c88918f53572e053784238bf3720cb1ae5bf01052040aba9a4.scope

cgroup.event_control cpu.cfs_quota_us docker-c9e654d573fd3e3e9a8bb78f3f904e60a59aa3384b344117fd401529e982ae37.scope

cgroup.procs cpu.rt_period_us notify_on_release

cpuacct.stat cpu.rt_runtime_us tasks

cpuacct.usage cpu.shares

cpuacct.usage_percpu cpu.stat

$ cat cpu.cfs_quota_us

10000

其中 cpu.cfs_quota_us 就是 CPU 的限制值,如果要查看具体的容器的资源,我们也可以进入到容器目录下面去查看即可。

内存:

最后我们了解下内存这块的资源控制,内存的单位换算比较简单:

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乘积。

这里要注意的是, 内存是不可压缩性资源,如果容器使用内存资源到达了上限,那么会 OOM ,造成内存溢出,容器就会终止和退出 。我们也可以通过上面的方式去通过查看 CGroup 文件的值来验证资源限制。

链接:https://www.qikqiak.com/k8strain2/basic/pod-life/

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论0 条评论

Ctrl+Enter 发表

本文隶属于专栏

最佳实践
不同的领域,都有先行者,实践者,用他们的最佳实践来加速更多企业的建设项目落地。

容器云管理平台选型优先顺序调查

发表您的选型观点,参与即得50金币。

作者其他文章

相关文章

相关问题

相关资料