k8s 资源管理与调度 | 青训营笔记

116 阅读2分钟

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

k8s 简介

为什么要 k8s

容器是一种非常方便的虚拟化方案,但是如果容器很多,就需要系统去管理

k8s 就是用来管理容器的

Kubernetes 定义

便携可扩展开源的容器管理平台

Kubernetes 设计准则

  • 声明式而不是命令式:告诉 k8s 最终想要什么状态,而不是具体要做什么做什么
  • 控制循环:怎么生成中间步骤呢?通过控制循环
  • 简单
  • 模块化
  • 向下兼容
  • 开放

Kubernetes 架构

  • Pod
  • PVC/PV/StorageClass
  • Deployment
  • Statefulset
  • Node

image-20220824164351195

image-20220824164359099

k8s 核心功能

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

资源管理

资源种类

资源可以成计算和存储两大类

  • 计算类

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

    • 原生:

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

资源上报

image-20220824170000507

  • cAdvisor -> Kubelet -> Node
  • Agent -> Device plugin -> Kubelet -> Node

资源分配

计算资源

image-20220824170117885

存储资源

image-20220824170129208

资源调度

资源申请

在 k8s 里,资源只能在容器启动前申请,启动后就不能改变

image-20220824170507819

调度流程

image-20220824170526049

与 YARN 不同,k8s 是拿着应用找节点,如果调度失败的话就重新加入队列中,等待调度

  • 过滤

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

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

    • Reserve: 在调度器 cache 里面缓存调度结果,为了解决异步 API 操作带来的时延问题;

    • Permit: 扩展接口,可以在这里支持一些扩展语音,比如: Gang 等;

      • 结果有三类: 失败,成功,等待

        • 失败: 直接返回调度失败结果;
        • 成功: 直接通过;
        • 等待: 则异步等待,不阻塞其他流程;
    • Pre-Bind: 任务运行前的一些准备操作,比如: 动态创建 Volume 等;

    • Bind: 把 Pod 绑定到 Node,即: 给应用分配运行节点;