深入理解 K8S 资源管理和调度| 青训营笔记

45 阅读5分钟

深入理解 K8S 资源管理和调度| 青训营笔记

这是我参与「第四届青训营 」笔记创作活动的的第17天

Kubernetes 简介

为什么需要 Kubernetes ?

  • 容器相比于传统的虚拟化技术,更轻量,更敏捷,更易于管理,运维成本更低;

    • 一次打包,任意地方运行
  • 如果容器规模巨大,如何编排管理容器也是个巨大的挑战,需要一个强大的管理系统,Kubernetes 在这方面表现很好

    • 基于 google 超过 15 年的大规模容器管理经验;
    • 功能丰富,易于扩展,架构优雅;
    • 社区活跃,仅次于 Linux 的全球第二大社区;

Kubernetes 是什么?

Kubemetes is a portable, extensible, open source platform for managing containerized workloads and services, that facilitates both declarative configuration and automation.

  • 特点:便携可扩展开源的容器管理平台
  • 目的:管理容器应用和服务
  • 作用: 声明式配置和自动化

Kubernetes 特性

  • 服务发现和负载均衡

  • 存储编排

  • 自动发布,回滚

  • 自愈

  • 秘钥,配置管理

  • 资源管理,应用编排调度

Kubernetes 核心概念

  • Pod

  • PVC/PV/StorageClass

  • Deployment

  • Statefulset

  • Node

image-20220819112905563

Pod

image-20220819112946763

Volume/PV/PVC/StorageClass

PV

image-20220819151819115

PVC

image-20220819151854856

SC

image-20220819151915436

Deployment

image-20220819151951966

StatefulSet

image-20220819152043082

Node

image-20220819152112375

Kubernetes 设计准则

  • Declarative > imperative: State your desired results, let the system actuate
  • Control loops: Observe, rectify, repeat
  • Simple > Complex: Try to do as little as possible
  • Modularity: Components, interfaces, & plugins
  • Legacy compatible: Meet users where they are, requiring apps to change is a non-starter
  • Open>Closed:Open Source, standards, REST, JSON, etc.

Kubernetes 架构

image-20220819152637452

  • ETCD
    • 持久化数据中心
    • 维护集群中所有数据的有序性和一致性
    • 事件机制同步数据变更
  • APIServer
    • 对所有组件提供 API 接口
    • 负责 admission,鉴权等功能
    • 提供后端 etcd 数据 cache,降低 ETCD 压力
    • 结合 ETCD,提供 List-Watch 机制
  • Controller-manager
    • 提供一系列控制器,负责维护各种对象的生命周期 比如: Node controller, PV controller, Deployment controller, StatefulSet controller 等
  • Scheduler
    • 负责应用实例的调度,把Pod绑定到合适的 Node
  • Kubelet
    • 基于 Pod 声明,真正开始启动容器,负责容器生命周期维护
  • Kube-proxy
    • 网络代理,负责维护节点网络规则,接管 Pod 出入流量

Kubernetes 核心通信机制 - List-Watch

image-20220819153216534

Kubernetes 核心功能

  • 服务发现和负载均衡
  • 存储编排
  • 自动发布,回滚
  • 自愈
  • 秘钥,配置管理
  • 资源管理,应用编排调度

Kubernetes 资源管理

资源种类

  • 计算类

    • 原生: CPU,memory,等;
    • 可通过 Device plugin 方式支持的非原生: numa,socket。。。
  • 存储类

    • 原生:
      • 临时存储: Ephemeral storage,EmptyDir 等
      • 持久化 (PV): Cinder, RBD, Cephfs, NFS, GlusterFS...
    • 可以通过 CSI 方式扩展支持其他存储;

资源上报

image-20220819153939840

  • 计算资源分配:

    • Kubelet -> cgroup manager -> cpu, memory...
    • Kubelet -> device manager -> extended resources
  • 存储资源分配:

    • Controller manager -> provisioner -> attacher -> mounter

资源分配

image-20220819160613482

  • 计算资源分配:

    • Kubelet -> cgroup manager -> cpu, memory...
    • Kubelet -> device manager -> extended resources
  • 存储资源分配:

    • Controller manager -> provisioner -> attacher -> mounter

资源状态维护

image-20220819161033203

  • 计算资源状态维护:

    • kubelet/cgroup manager/device manager/evictioner manager -> cpu, memory, extended resources
  • 存储资源维护

    • PV controller -> PV/PVC

资源回收

image-20220819161120762

  • 计算资源回收:
    • Kubelet -> cgroup manager -> cpu, memory...
    • Kubelet -> device manager -> extended resources

image-20220819161143244

  • 存储资源回收:
    • Controller manager -> unmounter -> detacher -> deleter

Kubernetes 调度

资源申请

申请 cpu 内存 硬盘这些资源

  • 资源申请:
    • request 保证最少有多少资源
    • limit 最大程度可以使用多少资源,超过会被资源回收

Cpu 内存

image-20220819161333398

存储

image-20220819161506898

PVC

image-20220819161536625

调度流程

image-20220819161620968

调度框架

image-20220819161654255

主要分为几个步骤:

  • 过滤

    • Pre-Filter: 进行一些全局的准备工作,防止流程中多次重复计算;
    • Filter: 基于 Pod 的约束,进行 Pod -> Node 的匹配工作;
    • Post-Filter: 如果没有一个合适的节点,则进行一些抢占行为(驱逐低优任务),看是否能找到合适节点;
  • 打分

    • 基于前面的过滤节点,对合适的节点进行打分,按照分值高低进行排序;
    • 如果前面没有合适的节点,则直接调度失败;
  • 任务分配

    • Reserve: 在调度器 cache 里面缓存调度结果,为了解决异步 API 操作带来的时延问题;
    • Permit: 扩展接口,可以在这里支持一些扩展语音,比如: Gang 等;
      • 结果有三类: 失败,成功,等待
        • 失败: 直接返回调度失败结果;
        • 成功: 直接通过;
        • 等待: 则异步等待,不阻塞其他流程;
    • Pre-Bind: 任务运行前的一些准备操作,比如: 动态创建 Volume 等;
    • Bind: 把 Pod 绑定到 Node,即: 给应用分配运行节点;

案例 MySql + WordPress

官方教程

优化实践

Kubernetes 还可以更好

  • 非原生资源的精细化管理能力
  • 动态资源接入,管理能力
  • 调度功能和性能
  • 调度质量

Kubernetes 与 Yarn 的一些不同点

  • 基本单位:

    • Yarn: Container;
    • Kubernetes: Pod;
  • 资源管理的扩展能力:

    • Yarn: 没提供 Plugin 机制,侵入性较大;
    • Kubernetes: plugin 机制扩展,侵入性小;
  • 调度模式:

    • Yarn: Node -> Task
    • Kubernetes: Task -> Node
  • 系统设计

    • Yarn: 节点缓存,无核心中心化存储;
    • Kubernetes: 中心化存储;

字节的一些工作

  • 非原生资源:

    • Socket, numa, local disk, NIC, mbw...
  • 动态资源:

    • CPU 实时负载,利用率...
  • 调度功能&性能优化:

    • Gang
    • 应用级别亲和性约束能力支持;
    • 微拓扑调度能力支持;
    • 资源预留;
    • 系统重构: 分布式系统
  • 调度质量改善:

    • 重调度;
    • 业务上下游亲和性策略;
    • 实时负载均衡策略;
    • 碎片整理,优化等