博客
关于我
Kubernetes:理解资源的概念
阅读量:794 次
发布时间:2023-01-29

本文共 2507 字,大约阅读时间需要 8 分钟。

Kubernetes 资源模型解析:为何总是要设置容器资源限制?

当我们谈论 Kubernetes 时,很多人会耳目一新。作为一个支持 Docker 和 rkt 的容器调度系统,它不仅凭借其简便部署和服务发现等优点,还以一种更高效的方式管理计算资源。本文将深入探讨 Kubernetes 资源模型的工作原理,以及为什么你应该始终为容器设置资源限制。

探秘 Kubernetes 资源管理的必要性

在 Kubernetes 之前,开发者通常将应用容器部署到一个实例上,并依赖监控系统实现进程重启。在这种单实例部署模式下,可能会出现资源浪费的情况:例如,应用仅使用了实例 10% 的 CPU,而剩下的 90% 处于闲置状态。这带来了重大资源浪费问题。

Kubernetes相应地将多个独立的实例整合成一个可管理的资源池,允许多个应用运行在同一物理实例上。这就像“收集一堆不规则形状的木块,并将它们压缩到一个木桶中(服务器)”(1)。通过这种方式,Kubernetes可以更好地利用物理资源,减少需要的服务器数量。

然而,当多个容器运行在同一实例上时,也存在一个潜在风险:如果一个容器突然消耗掉所有可用 CPU,其他容器将不会有资源可用。这种资源耗尽风险正是 Kubernetes 资源模型设计的用 cases。

探索 Kubernetes 资源模型:资源是什么,如何工作?

Kubernetes 中的“资源”指的是可以被容器请求、分配或消费的那些资源。例如,CPU、内存、网络带宽等。这些资源可分为可压缩资源和不可压缩资源:CPU 和带宽是可压缩的,而内存通常不可压缩。

资源的使用可分为两种情形:资源需求(规格)和资源使用(状态)。基于这些信息,Kubernetes调度器可以优化资源分配。

为了更好地理解 Kubernetes 资源模型,我们可以使用“请求”和“限额”这两个概念:

  • 请求:容器所需的资源数量。如果容器请求的资源超过其限额,可能会被压制回请求数。
  • 限额:容器可使用的资源上限。如果容器尝试超出限额使用资源,可能会被调度器终止,以释放资源供其他容器使用。

需要注意的是,如果限额未设置,容器默认使用0(即无限额),因此设置合理的资源限额对系统稳定至关重要。

Kubernetes 资源调度:如何确保资源使用效率?

当容器准备启动时,Kubernetes调度器会在整个集群中找到合适的节点进行调度。调度器会确保每个节点的资源请求总和不超过该节点的资源容量。

例如,假设一个节点有2个 vCPU,内存 4Gi,并允许运行多个容器。容器 A 请求 100m CPU、64Mi 内存,限额 300m CPU、128Mi 内存;容器 B 请求 200m CPU、128Mi 内存,限额 400m CPU、256Mi 内存。Kubernetes调度器会根据容器的资源需求合理分配资源,从而避免资源冲突。

当前支持的资源类型

当前,Kubernetes 支持的资源限额主要包括:

  • CPU:以 millicore 为单位(1 vCPU = 1000 millicore)。
  • 内存。
  • 网络带宽。
  • 磁盘 I/O。

其他资源如存储空间、存储性能等正在逐步实现支持。

为什么你应该始终设置资源限额

  • 资源请求:设置请求可以帮助 Kubernetes 在集群中更高效地调度容器。通过明确表达容器所需资源,调度器可以更好地利用集群中的资源潜力。

  • 资源限额:设置限额可以防止某些运行不畅的容器占用过多系统资源。例如,如果一个高负载容器试图耗尽实例上的所有资源,限额可以及时终止该容器,以保障其他应用的正常运行。

  • 这就是为什么你应该总是为容器设置资源请求和资源限额的原因。

    容器资源限额:当前的挑战与未来展望

    目前,Kubernetes 还无法动态管理资源配额,因此我们需要手动为容器设置资源限额。

    在部署新应用时,如果无法准确估算资源需求,可以设置较高的限额以留有弹性。最终如果发现资源过度消耗,可以逐步降低限额。

    以下是一个实例配置:

    metadata:  name: frontendspec:  containers:  - name: db    image: mysql    resources:      requests:        memory: "64Mi"        cpu: "250m"      limits:        memory: "128Mi"        cpu: "500m"  - name: wp    image: wordpress    resources:      requests:        memory: "64Mi"        cpu: "250m"      limits:        memory: "128Mi"        cpu: "500m"

    通过 YAML 文件提交这些资源配置,可以确保每个容器都有明确的资源需求和限额。

    命名空间内的资源限额

    除了为单个容器设置资源限额,你还可以为命名空间定义资源配额。例如,在开发命名空间中设置较低的资源限额,以防止测试结果对生产环境造成影响。

    以下是一个命名空间配额配置示例:

    apiVersion: v1kind: ResourceQuotametadata:  name: quotaspec:  hard:    cpu: "20"    memory: "1Gi"  pods: "10"  replicationcontrollers: "20"  resourcequotas: "1"  services: "5"

    通过参考这个配置,你可以为命名空间制定更合理的资源限额。

    总结

    Kubernetes 资源模型通过请求、限额等机制,为容器资源管理提供了强有力的支持。合理设置容器资源限制不仅有助于集群性能优化,还能保障后续应用的稳定运行。当前 Kubernetes 无法动态管理资源,所以我们需要手动为资源设置限额。虽然这可能有些繁琐,但通过合理的配置,可以按需管理集群资源。

    转载地址:http://xeryk.baihongyu.com/

    你可能感兴趣的文章
    Java类实现一个类的障眼法
    查看>>
    Java基础学习总结(5)——多态
    查看>>
    Java基础学习总结(63)——Java集合总结
    查看>>
    Java基础学习总结(64)——Java内存管理
    查看>>
    Java基础学习总结(66)——配置管理库typesafe.config教程
    查看>>
    Java基础学习总结(67)——Java接口API中使用数组的缺陷
    查看>>
    Java基础学习总结(70)——开发Java项目常用的工具汇总
    查看>>
    Java基础学习总结(73)——Java最新面试题汇总
    查看>>
    Java基础学习总结(75)——Java反射机制及应用场景
    查看>>
    Java基础学习总结(76)——Java异常深入学习研究
    查看>>
    Kubernetes 笔记 08 Deployment 副本管理 重新招一个员工来填坑
    查看>>
    Java基础知识陷阱系列
    查看>>
    Java基础系列
    查看>>
    Kubernetes 自定义服务的启动顺序
    查看>>
    java基础:12.5 缓存流 BufferReader、 PrintWriter、flush
    查看>>
    Java基础:Character 类概念、构造函数、实例方法、类方法
    查看>>
    Kubernetes 资源调度详解
    查看>>
    Java基础:StringBuffer类概念、构造函数、常用方法
    查看>>
    Kubernetes 部署 kubeflow1.7.0
    查看>>
    Java基础:变量(声明、赋值、引用)、基本数据类型、作用域
    查看>>