CKA 09_Kubernetes工作负载与调度 资源调度 三类QoS request 资源需求 limit 资源限额

1. 资源调度

1.1 准备工作

  • Kubernetes 采用 requestlimit 两种限制类型来对资源进行分配。
    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

1.2 为什么需要 request 和 limit

  • 三类 QoS 及适应场景

    • Guaranteed 敏感型、需要保障的业务
    • Burstable 次敏感型、需要弹性的业务
    • BestEffort 可容忍型业务
  • 不同的 QoS 对调度的影响

    • 调度器使用 request 进行调度
    • CPU 按照 request 划分权重
    • memory 划分 OOMScore
    • BestEffort 会被优先驱离

1.3 内存限制

官方文档:任务 | 配置 Pods 和容器 | 为容器和 Pod 分配内存资源

1.3.1 Brustable

  1. 创建 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
  1. 生效后,发现 Pod 处于失败的状态
[root@k8s-1 ~]# kubectl apply -f memory-pod.yaml 
pod/memory-demo created
[root@k8s-1 ~]# kubectl get pod

在这里插入图片描述

  1. 查看 Pod 的状态,发现该 Pod 的 QoS 为 Brustable(弹性业务)
[root@k8s-1 ~]# kubectl describe pod memory-demo 
......
QoS Class:                   Burstable
......

在这里插入图片描述

  1. 查看 Pod 的运行日志
kubectl logs memory-demo

在这里插入图片描述

  1. 创建 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
  1. 生效后,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
  1. 查看 Pod 的状态,发现它的 QoS 为 Brustable
[root@k8s-1 ~]# kubectl describe pod memory-demo 

在这里插入图片描述

1.3.2 Guaranteed

  • 当运行重要业务时,使用 Guaranteed
  1. 创建 Pod
  • 将该 Pod 的资源限制 limit 和 request 设置成一样的
[root@k8s-1 ~]# vim memory-pod.yaml 

在这里插入图片描述

  1. 生效后,查看 Pod 的运行状态和状态信息
  • 发现 Pod 的 QoS 是 Guaranteed(敏感型、需要保障的业务)
    在这里插入图片描述

1.3.3 BestEffort

  1. 创建 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
  1. 生效后,查看 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

  1. 创建 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
  1. 生效后,发现 Pod 失败

在这里插入图片描述

1.4 CPU限制

官方文档: 任务 | 配置 Pods 和容器 | 为容器和 Pod 分配 CPU 资源

  1. 先查看主机的 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
  1. 创建 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"
  1. 生效后,查看 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 

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值