深入理解K8S(五)

节点资源管理

节点资源管理包括

  • 状态上报:kubelet负责将节点的基础信息、节点资源信息(cpu、内存、Hugepage、临时存储、GPU等注册设备);调度器在位pod选择节点时会将将机器的状态作为依据
    • 上报信息会造成不必要的开销,自K8S1.12版本起,K8S引入node lease对象,将上报信息划分为节点状态和Lease对象(每个节点都会有的对象,包含基本的节点信息)
    • kubelet在节点状态变更时或者默认一分钟周期到时,更新节点状态信息。并且默认10s周期更新Lease对象,如果40s内Lease没有被更新,则认为节点不健康
  • 资源预留
    • kubelet通过启动参数可以为CPU、内存、PID等系统预留资源
      • 可分配资源(Allocatable):用户pod可用资源(Capacity-分配给系统的资源的剩余部分)
      • 容量资源(Capacity):kubelet获取计算节点当前的资源信息
      • CPU:从/proc/cpuinfo中获取
      • Memory:从/proc/memoryinfo
      • ephemeral-storage:指节点根分区的大小
  • 资源可用额监控
    • kubelet内置组件cAdvisor检查节点资源信息(内存和磁盘是不可压缩资源、cpu是可压缩资源)
  • 驱逐管理:系统会在节点资源不够时终止一些容器进程,以空出资源保证节点的稳定性
    • 驱逐策略
      • 默认配置:
        • memory.available<10%(或者<5Gi) 系统内存少于总量的10%或者5Gi时,就会对pod进行驱逐
        • 驱逐方式
          • 软驱逐(EvientionSoft):检测到当前资源达到驱逐阈值时,并不会立刻驱逐,会有个宽限期,宽限期到后如果资源状况没有改善,就会驱逐pod(按照Qos)
          • 硬驱逐(EvientionHard):检测到当前资源达到驱逐阈值时会立刻驱逐pod(按照Qos)
        • 基于内存压力的驱逐:memory.avaiable,当前系统的可用内存(默认设置<100Mi,硬驱逐策略) 深入理解K8S(五)_第1张图片
        • 基于磁盘压力的驱逐
          • 划分分区:pod的emptyDir卷、容器日志目录、容器运行时目录

          • kubelet只对系统分区和容器运行时分区进行管理
            深入理解K8S(五)_第2张图片
            nodefs.available:根分区磁盘可使用率
            nodefs.inodesFree:根分区磁盘inode可使用率
            imagefs.available:容器分区磁盘使用率,如果没有容器分区就没有有该资源配置
            imagefs.inodesFree:容器分区inode可使用率

          • 建议:将kubelet工作目录和容器日志放在系统分区中,容器运行时分区可选

          • 当磁盘使用率高时,根据分区不同,kubelet采取的方式也不同:

            • 有容器运行时分区:
              • 如果系统分区到达驱逐阈值:kubelet删除已经退出容器
              • 如果容器运行时分区达驱逐阈值:kubelet删除所有未使用镜像
            • 无容器运行时分区:kubelet同时删除未运行的容器和未使用的镜像
          • 回收后,如果还是满足驱逐条件,kubelet就会开始驱逐pod

          • 驱逐pod选择目标的顺序:

            • pod使用量是否超过请求的大小,如果超过,该pod会成为备选目标
            • 查询pod的优先级,低优先级pod有限驱逐
            • 根据磁盘使用超过请求数量进行排行,差值越小、越容易被驱逐
        • 数据在不同的分区,kubelet针对不同的驱逐信号采取的驱逐策略不同:
          • 有容器运行时分区:
            • 系统分区触发驱逐:kubelet计算pod的磁盘使用量中所有容器的日志和本地卷数据
            • 容器运行时分区触发驱逐:kubelet计算pod的磁盘使用两种所有容器的可写层
          • 无容器运行时分区:
            • 系统分区触发驱逐:kubelet计算pod的磁盘使用量中所有容器的日志和本地卷数据和可写层

你可能感兴趣的:(kubernetes,java,运维)