Kubernetes:理解资源的概念

本文讲的是Kubernetes:理解资源的概念【编者的话】本文描述了 Kubernetes 资源模型的工作原理,为什么你应该总是限制容器资源,以及如何才能真正做到。

不知你是否已清楚,Kubernetes 是支持 Docker 和 rkt(当前是这两种)的容器调度系统。除了下面这些优美的特性,比如简易部署,配置管理,服务发现,等等,它还允许我们以一种更高效的方式来管理计算资源。本文将阐述如下问题,Kubernetes 资源模型如何工作,为什么你应该总是限制容器资源,以及如何才能正确做到。

资源管理的必要性

Kubernetes 出现之前,运行容器的普遍方式是,把应用容器丢到一个实例上,并且满怀希望地建立一个监控系统,当容器退出时自动重启。这个模型的问题是,你在该实例上的应用,可能只使用了 10% 的可用 CPU。你完全浪费了 90% 的可用 CPU。而 Kubernetes 会把那些互不相连的实例整合成一个计算资源池,多个应用可以被调度到一个物理实例上。它就像“取一大堆木块(容器或任务)——各种形状和大小的木块——并找到一种方法把所有这些木块压缩到木桶里(服务器)”(1)。如果你可以非常仔细得安排这些块(任务),那么你将使用更少的桶(服务器)。

然而,当许多容器运行在同一个实例上时,就会出现资源耗尽的新风险。如果你的容器突然尝试使用 100% 的 CPU,没有什么能阻止它耗尽其它所有容器的 CPU。这里就是 Kubernetes 资源模型起作用的地方了。既然我已用财务激励和资源耗尽风险来引你上钩,那就允许我解释一下资源模型是如何工作的。

资源模型

Kubernetes 中资源到底是什么?

资源指的是可以被 pod 或容器“请求”,“分配”,“或消费”的那些东西。例如,CPU,内存,网络带宽。

它们可以是可压缩的(容易节流)或不可压缩的(不容易节流)。内存是不可压缩的,而 CPU 和网络是可压缩的,因为它们很容易被节流。

这些资源可以被分成两种不同的情形:期望情形(规格)和当前情形(状态)。资源需求和资源容量可被认为是规格(期望情形),资源使用可被认为是状态(当前情形)。Kubernetes 调度器可以利用这两种情形来推断节点容量,资源需求等。

我们可以用术语“限额”和“请求”来描述资源的规格。

  • 请求:一个容器请求的资源数量。如果一个容器超过了它的资源请求,它可能会被压制回到它的请求数。
  • 限额:容器能使用的资源上限。当容器尝试超过它的限额时,如果 Kubernetes 决策发现另一个容器需要资源,那么当前容器会被终结掉。一般来说保持所有容器的资源限额之和等于你的集群的整个资源容量才是有意义的(但是实际上对内存等不可压缩资源,这是有点难做到的)。

当容器的请求数忽略的情况下,它默认等于限额。如果限额没设置,那么它默认是0(无限额)。正如你看到的,请求是对资源的软性限制,而限额是对容器能使用多少资源的硬性限制。因此实际中把容器的请求设成限额的一部分才是有意义的。

资源调度

当一个容器准备启动的时候,Kubernetes 调度器会选择一个实例来为它运行。调度器确保对每种资源类型,资源请求的和不会超出该节点上整个资源容量。换句话说,资源的超额提供是不允许的,但是有证据显示它可能会在将来提供。如果一个实例的容量校验失败,那么调度器不会把容器放到这个实例上去了。

例如,请看下图,

如上所示最简单的例子,容器 A 和容器 B 有相同的 CPU 请求,CPU 限额分别是 100m 和 150m。每个容器的请求和限额之间的空间,即 Kubernetes 资源分发算法生存和工作的空间,以确保每个容器能获得它所需的资源。这个例子中,容器 B 请求更多的资源,Kubernetes 压制了容器 A 10m 的资源,因此容器 B 可以使用这些资源。这是非常简单的情况,并且假定没有其它的 CPU 可用。这个资源空间中生存的算法要比这里解释的更复杂一点。

支持的资源

当前有两种资源支持限额。

其它等待实现的资源有存储时间,存储空间,存储操作,网络带宽,网络操作。

此处要注意的一个事是,CPU 总是一个绝对数量,而不是相对数量(比如 40% 的 CPU),比如 0.5 个 CPU。CPU 资源的单位是 millicores,即一个核的 1/1000。在支持的云提供商上,一个核即一个 vCPU。

设置资源限额

有两个极好的理由说明你应该为每个容器设置资源请求和资源限额。

你应该设置资源请求,使 Kubernetes 能更好得在不同实例间调度容器,以使用尽可能多的潜在容量。你应该设置资源限额,以免当有一个流氓容器的时候,它不会吃光实例上的所有资源,影响该实例上运行的其它应用。

这就是为什么你应该总是设置资源请求和资源限额。

容器资源限额

不幸的是,Kubernetes 还没实现动态资源管理,这也是为什么我们不得不为我们的容器设置资源限额。我能想象未来某一时刻 Kubernetes 将开始实现以更少手工的方式来管理资源,但是这就是我们当前所拥有的全部。

通常情况下,当你尝试部署一个新应用的时候,你无法确切知道它将使用多少资源。此时,尝试一个更高的估算,因为如果有必要,你总是可以回拨到一个更低的限额。

下面是为 pod 内的容器设置资源限额的一个例子。它设置了 pod 限额为 1000m,及 256MiB 的内存。它的 pod 请求为 500m 的 CPU 及 128MiB 的内存。pod 的请求及限额总是等于它所包含的所有容器的请求及限额之和。

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  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 格式保存文件并设置这个 pod。

kubectl apply -f pod.yaml --namespace=development

命名空间的资源限额

如果你愿意你也可以在命名空间里设置资源限额。例如当你有一个开发和产品命名空间,开发人员正在不带任何资源限额的开发命名空间上测试他们的容器,此时就会有用处。在开发命名空间上设置资源限额将有助你确保,当一个开发人员意外得使用了太多开发命名空间下的资源,不会影响你在生产命名空间下的应用。

apiVersion: v1
kind: ResourceQuota
metadata:
  name: quota
spec:
  hard:
    cpu: "20"
    memory: 1Gi
    pods: "10"
    replicationcontrollers: "20"
    resourcequotas: "1"
    services: "5"

你可以保存这个 YAML 并把资源配额应用到命名空间下。

kubectl create -f resource-quota.yaml --namespace=development

可能你已注意到,你也可以在 Kubernetes 对象上设置限额,如服务和副本控制器。此处列举了命名空间下你可以限制的所有资源和对象。这里可以找到更高级的关于命名空间配额的介绍。

(1)John Wilkes - https://www.wired.com/2013/03/ ... esos/

原文链接:Kubernetes - Understanding Resources(翻译:池剑锋)

原文发布时间为:2017-01-03

本文作者:池剑锋

本文来自合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:Kubernetes:理解资源的概念

时间: 2024-10-28 17:30:22

Kubernetes:理解资源的概念的相关文章

webservice-WebService应该怎么理解,看概念无法抓到要点

问题描述 WebService应该怎么理解,看概念无法抓到要点 各位大神,WebService应该怎么理解,我看了半天都没有理解到他的意思,哪位能通过举一个应用系统中的例子帮助理解? 解决方案 说白了,web service就是利用现有的协议(http),现有的编程技术(既然是http,就可以用web编程语言,比如jsp asp php写程序了),实现的跨计算机远程调用.用http有什么好处呢?最主要的是简单,web service是基于http的,而且使用xml/json等基于字符串的数据编码

用工厂流水线的方式来理解 RxJava 的概念

本文讲的是用工厂流水线的方式来理解 RxJava 的概念, 本文已授权微信公众号 AndroidDeveloper 独家发布. 原文链接 : RxJava – the production line 原文作者 : Mateusz Budzar 译文出自 : 掘金翻译计划 译者 : Sausure 校对者 : lizhuo, Rocky 为什么另写一篇 RxJava 的文章? 已经有很多 RxJava 的文章通过例子阐述了什么是 RxJava 以及怎么去用,但它们大多数只有代码.虽然也会通过类比来

T-SQL查询进阶:理解SQL Server中索引的概念,原理以及其他

简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能.但索引可以在大多数情况下大大提升查询性能,在OLAP中尤其明显.要完全理解索引的概念,需要了解大量原理性的知识,包括B树,堆,数据库页,区,填充因子,碎片,文件组等等一系列相关知识,这些知识写一本小书也不为过.所以本文并不会深入讨论这些主题. 索引是什么 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 精简来说,索引是一种结构.

JavaScript的作用域和块级作用域概念理解

  作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期.讲到这里,首先理解两个概念:块级作用域与函数作用域. 什么是块级作用域呢? 任何一对花括号({和})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域. 函数作用域就好理解了(*^__^*) ,定义在函数中的参数和变量在函数外部是不可见的. 大多数类C语言都拥有块级作用域,JS却没有.请看下文demo: //C语言 #include void main() { int

wsdl-本人webservice的概念的理解和疑惑

问题描述 本人webservice的概念的理解和疑惑 一直以来在基于springMVC做restful风格的开发. 最近要跟外面做接口,没有restful风格的接口,只有webservice方式. 于是上网恶补webservice的知识,看完之后还是有很多不确定的地方. 整理如下,望各位高人指正. 1.不管什么语言最终实现功能的单位差不多都是方法(或者叫函数),所以将这块开放到网上,供大家调用.这块各个语言有相应的工具来实现,最终得到一个url 2.要想调用,首先得让别人知道方法名.需要传入哪些

地方网站如何选择运营模式 深入理解模式、资源、架构

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 运营模式不只是盈利模式,运营模式需要考虑盈利模式.运营模式的根本是玩转"模式--资源--架构"三者关系.也就是说,经营模式就是合理利用自己的资源,确定合理的组织架构,实现盈利模式.更确切的说,架构由模式和资源所决定. 一.深入理解"模式--资源--架构" 1.理解模式 这样理解模式: √ 模式是解决平台

认识ERP概念中的资源观

信息成为真正资源的必要条件是http://www.aliyun.com/zixun/aggregation/13617.html">信息管理.信息管理就是管理者以最快的速度获取信息,以最有效的方式使用信息,在最适当的时候更新信息. ERP是20世纪90年代由Gartner Group公司提出的,其最初的定义是一套将财务.分销.制造和其他业务功能合理集成的应用软件系统. 我国在ERP评测规范中对其做了如下定义:ERP是一种先进的企业管理理念,它将企业各个方面的资源充分调配和平衡,为企业提供多

全面解析ERP中资源概念的拓展

信息成为真正资源的必要条件是http://www.aliyun.com/zixun/aggregation/13617.html">信息管理.信息管理就是管理者以最快的速度获取信息,以最有效的方式使用信息,在最适当的时候更新信息. ERP是20世纪90年代由Gartner Group公司提出的,其最初的定义是一套将财务.分销.制造和其他业务功能合理集成的应用软件系统. 我国在ERP评测规范中对其做了如下定义:ERP是一种先进的企业管理理念,它将企业各个方面的资源充分调配和平衡,为企业提供多

js作用域及作用域链概念理解及使用_基础知识

(1)作用域 一个变量的作用域(scope)是程序源代码中定义的这个变量的区域. 1. 在JS中使用的是词法作用域(lexical scope) 不在任何函数内声明的变量(函数内省略var的也算全局)称作全局变量(global scope) 在函数内声明的变量具有函数作用域(function scope),属于局部变量 局部变量优先级高于全局变量 var name="one"; function test(){ var name="two"; console.log