文章目录
- 1. 资源调度
- 1.1 准备工作
- 1.2 为什么需要 request 和 limit
- 1.3 内存限制
- 1.3.1 Brustable
- 1.3.2 Guaranteed
- 1.3.3 BestEffort
- 1.3.4 当容器申请的资源超出 limit 和 request
- 1.4 CPU限制
1. 资源调度
1.1 准备工作
-
Kubernetes 采用 request 和 limit 两种限制类型来对资源进行分配。
request(资源需求):即运行 Pod 的节点必须满足运行 Pod 的最基本需求才能运行 Pod 。
limit(资源限额):即运行 Pod 期间,可能内存使用量会增加,那最多能使用多少内存,这就是资源限额。 -
资源类型:
- CPU 的单位是核心数,内存的单位是字节。
- 一个容器申请 0.5 个CPU,就相当于申请 1 个CPU的一半,你也可以加个后缀 m 表示千分之一的概念。比如说 100m 的CPU,100豪 的 CPU 和 0.1 个 CPU 都是一样的。
- memory 内存单位:
- K、M、G、T、P、E #通常是以1000为换算标准的。
- Ki、Mi、Gi、Ti、Pi、Ei #通常是以1024为换算标准的。
- ephemeral-storage: 临时存储
- extended-resource:gpu
- CPU 的单位是核心数,内存的单位是字节。
1.2 为什么需要 request 和 limit
-
三类 QoS 及适应场景
- Guaranteed 敏感型、需要保障的业务
- Burstable 次敏感型、需要弹性的业务
- BestEffort 可容忍型业务
-
不同的 QoS 对调度的影响
- 调度器使用 request 进行调度
- CPU 按照 request 划分权重
- memory 划分 OOMScore
- BestEffort 会被优先驱离
1.3 内存限制
官方文档:任务 | 配置 Pods 和容器 | 为容器和 Pod 分配内存资源
1.3.1 Brustable
- 创建 Pod
- 该 Pod 中的容器会申请 200M 的内容,并且内存最基本需求是50 MiB,最大不能超过 100MiB
- 上下文冲突了,所以,在生效时一定会失败
[root@k8s-1 ~]# vim memory-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
spec:
containers:
- name: memory-demo
image: stress
args:
- --vm
- "1"
- --vm-bytes
- 200M
resources:
requests:
memory: 50Mi
limits:
memory: 100Mi
- 生效后,发现 Pod 处于失败的状态
[root@k8s-1 ~]# kubectl apply -f memory-pod.yaml
pod/memory-demo created
[root@k8s-1 ~]# kubectl get pod
- 查看 Pod 的状态,发现该 Pod 的 QoS 为 Brustable(弹性业务)
[root@k8s-1 ~]# kubectl describe pod memory-demo
......
QoS Class: Burstable
......
- 查看 Pod 的运行日志
kubectl logs memory-demo
- 创建 Pod
- 该 Pod 限制最少需要 200豪 CPU 和 50MiB 内存,最多不能超过 1 个 CPU 和 100MiB 内存
[root@k8s-1 ~]# vim memory-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
spec:
containers:
- name: memory-demo
image: nginx
#args:
#- --vm
#- "1"
#- --vm-bytes
#- 200M
resources:
requests:
cpu: 200m
memory: 50Mi
limits:
cpu: 1
memory: 100Mi
- 生效后,Pod 正常运行
[root@k8s-1 ~]# kubectl apply -f memory-pod.yaml
pod/memory-demo created
[root@k8s-1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
memory-demo 1/1 Running 0 15s
- 查看 Pod 的状态,发现它的 QoS 为 Brustable
[root@k8s-1 ~]# kubectl describe pod memory-demo
1.3.2 Guaranteed
- 当运行重要业务时,使用 Guaranteed
- 创建 Pod
- 将该 Pod 的资源限制 limit 和 request 设置成一样的
[root@k8s-1 ~]# vim memory-pod.yaml
- 生效后,查看 Pod 的运行状态和状态信息
- 发现 Pod 的 QoS 是 Guaranteed(敏感型、需要保障的业务)
1.3.3 BestEffort
- 创建 Pod
- limit 和 request 都不设置
[root@k8s-1 ~]# vim memory-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
spec:
containers:
- name: memory-demo
image: nginx
#args:
#- --vm
#- "1"
#- --vm-bytes
#- 200M
#resources:
# requests:
# cpu: 200m
# memory: 50Mi
# limits:
# cpu: 1
# memory: 100Mi
- 生效后,查看 Pod 的运行状态和状态信息
- 发现 Pod 的 QoS 为 BestEffort(可容忍型业务
) - 当资源不够时,为保证集群节点的运行状态,会驱离该 Pod,因为 BestEffort 的优先级很低
[root@k8s-1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
memory-demo 1/1 Running 0 16s
[root@k8s-1 ~]# kubectl describe pod memory-demo
1.3.4 当容器申请的资源超出 limit 和 request
- 创建 Pod
- 该 Pod 申请 1G 的内存资源,但是限制其最多最少只能使用 500M 内存
- 所以,在生效后,这个 Pod 一定是失败的
[root@k8s-1 ~]# vim memory-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
spec:
containers:
- name: memory-demo
image: stress
args:
- --vm
- "1"
- --vm-bytes
- 1Gi //和 Guaranteed 不同的是,该 Pod 申请了资源。
resources:
requests:
memory: 500Mi
limits:
memory: 500Mi
- 生效后,发现 Pod 失败
1.4 CPU限制
官方文档: 任务 | 配置 Pods 和容器 | 为容器和 Pod 分配 CPU 资源
- 先查看主机的 CPU 信息
- 当前主机是 2 个 核
[root@k8s-1 ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 2
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 94
Model name: Intel Core Processor (Skylake, IBRS)
Stepping: 3
CPU MHz: 2304.000
BogoMIPS: 4608.00
Hypervisor vendor: KVM
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 4096K
L3 cache: 16384K
NUMA node0 CPU(s): 0,1
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat umip spec_ctrl intel_stibp arch_capabilities
- 创建 Pod
- 该 Pod 申请 2 个 CPU,资源限制最少 5 个 CPU,最多不能超过 10 个 CPU
[root@k8s-1 ~]# cp memory-pod.yaml cpu.yaml
[root@k8s-1 ~]# vim cpu.yaml
apiVersion: v1
kind: Pod
metadata:
name: cpu-demo
spec:
containers:
- name: cpu-demo
image: stress
resources:
limits:
cpu: "10"
requests:
cpu: "5"
args:
- -c
- "2"
- 生效后,查看 Pod 运行状态和状态信息
- 发现 Pod 处于 Pending 状态
- 调度器主要查看的是 request 的限制,request 设置最少不能低于 5 个 CPU,但是主机只有 2 个CPU,所以,调度失败
[root@k8s-1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
cpu-demo 0/1 Pending 0 5s
- 该 Pod 也一直被 kubelet 重启,但是,发现集群的 3 个节点都无法提高 5 个 CPU ,所以,Pod 自始至终都是 Pending 的状态
[root@k8s-1 ~]# kubectl describe pod cpu-demo