`
lykops
  • 浏览: 86242 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Kubernetes:理解资源的概念

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

资源管理的必要性

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

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

资源模型

Kubernetes 中资源到底是什么?

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

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

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

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

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

资源调度

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

例如,请看下图,
002-resource-relocation.png

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

支持的资源

当前有两种资源支持限额。
support-resources.PNG

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

此处要注意的一个事是,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。
kubectlapply-fpod.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 并把资源配额应用到命名空间下。
kubectlcreate-fresource-quota.yaml--namespace=development

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


原文http://dockone.io/article/1977

分享到:
评论

相关推荐

    Kubernetes : Up and Running: Dive into the Future of Infrastructure

    本书是学习Kubernetes不可或缺的资源,它将帮助读者理解并掌握这个复杂而强大的工具。 Kubernetes的核心概念包括: 1. **Pod**:Pod是Kubernetes的基本执行单元,它可以包含一个或多个紧密相关的应用容器。Pod代表...

    53 _ 结束语 _ Kubernetes:赢开发者赢天下1

    理解 Kubernetes API 的设计理念,体会其为赢得开发者信任所做的努力,对于深入学习 Kubernetes 的其他组件如调度、网络、存储和资源管理至关重要。只有深入理解这些机制的灵魂,才能真正利用 Kubernetes 的力量,为...

    kubernetes:Kubernetes游乐场

    【标题】:Kubernetes:Kubernetes游乐场 【描述】:Kubernetes,通常简称为K8s,是一种流行的开源容器...通过实践,你可以更好地理解和掌握Kubernetes的核心概念,以及它如何改变现代云原生应用的部署和管理方式。

    home-kubernetes:Kubernetes家庭

    在描述中提到的“家用k8s的一切”,意味着这个压缩包可能包含了搭建和管理家庭Kubernetes集群所需的各种资源和指南。 在家庭环境中使用Kubernetes,虽然可能不如生产环境那么复杂,但仍涉及多个关键知识点: 1. **...

    挑战-kubernetes:挑战您的Kubernetes技能和知识

    在深入探讨"挑战-kubernetes:挑战您的Kubernetes技能和知识"这一主题之前,我们首先要理解Kubernetes(简称K8s)的基本概念。Kubernetes是一种开放源码的容器编排系统,用于自动化容器化应用程序的部署、扩展和管理...

    Kubernetes:kuberneter的所有命令和概念

    首先,我们来看一下Kubernetes的基本组件和概念: 1. **Pod**:Kubernetes的基本运行单位,可以包含一个或多个紧密耦合的容器。Pods提供了一个网络和存储资源,让容器共享。 2. **Service**:定义了一种访问Pods的...

    kubernetes:Projetos relacionados a kubernetes

    它可能包含了自动化工具、监控解决方案、安全增强或者其他实用功能,帮助开发者和运维人员更好地理解和操作Kubernetes集群。Falamanta K8S可能包括以下内容: - 自动化集群设置:简化Kubernetes集群的初始化和配置...

    kubernetes:库比涅斯学院

    在这个学习平台上,用户可以深入理解Kubernetes的核心概念、工作原理以及如何有效地在生产环境中部署和管理应用程序。 【核心知识点】 1. **容器化技术**:Kubernetes是基于Docker等容器化技术构建的,它允许...

    learn-kubernetes:学习Kubernetes

    通过深入研究这个"learn-kubernetes"资源,你可以学习到如何使用Kubernetes进行应用部署、扩展和运维,包括创建和管理核心对象、使用Kubernetes API进行自动化操作、理解Kubernetes的工作原理以及最佳实践。...

    alura-kubernetes:物质光环

    1. **Kubernetes基本概念**:如Pod(应用实例)、Service(服务发现)、Deployment(应用部署)、ConfigMap(配置管理)和Secret(敏感信息存储)等。 2. **Kubernetes架构**:包括etcd(分布式键值存储)、api...

    templating-kubernetes:使用* real *代码对Kubernetes资源进行模板化

    首先,让我们理解Kubernetes资源模板化的概念。模板化允许我们将变量、条件语句和循环嵌入到资源定义中,使得资源配置可以根据环境或需求变化而灵活调整。这通常通过模板引擎(如Helm、Kustomize或Kubeflow)来实现...

    aws-workshop-for-kubernetes:适用于Kubernetes的AWS Workshop

    【aws-workshop-for-kubernetes:适用于Kubernetes的AWS Workshop】是一个综合的学习资源,旨在帮助用户了解如何在Amazon Web Services(AWS)上有效地部署和管理Kubernetes集群。这个工作坊涵盖了从基础到高级的多...

    kubernetes:保存学习文件和代码

    在深入探讨Kubernetes之前,让我们首先理解这个容器编排系统的基本概念。Kubernetes(简称K8s)是一个开源的平台,用于自动化容器化应用的部署、扩展和管理。它由Google设计并贡献给Cloud Native Computing ...

    kubernetes:从Kubernetes网络研讨会系列学习Kubernetes

    在本课程中,我们将深入探讨Kubernetes,这是一个强大的开源容器编排系统,它允许开发者和运维人员高效地管理和部署容器化应用。...无论你是开发者还是运维人员,这都是深入理解和应用Kubernetes的关键。

    kubernetes:Kubernetes Raspberry Pi部署

    将Kubernetes引入Raspberry Pi环境,可以为我们提供一个经济实惠的微型云平台,这对于学习和测试Kubernetes概念非常有用。 首先,让我们了解Kubernetes的基本组成。Kubernetes集群由以下几个核心组件构成: 1. **...

    kubernetes:Kubernetes进行CKA和其他认证准备工作的实践

    首先,理解Kubernetes的基础概念至关重要。Kubernetes是一个开源的容器编排系统,它能够自动化容器化应用的部署、扩展和管理。核心组件包括API服务器、etcd、控制器管理器、调度器、工作节点等,这些组件协同工作以...

    kubernetes:学习Kubernetes时的注释和帮助脚本片段(Raspberry Pi上的Microk8s)

    1. **Kubernetes基本概念**: - 节点(Node):Kubernetes集群的基本执行单元,通常由物理或虚拟服务器构成。 - 集群(Cluster):由多个节点组成,共同提供服务。 - 工作负载(Workloads):如Deployments、...

    kubernetes:Kubernetes,从初学者到专家

    总结,从初学者到专家的Kubernetes学习之旅需要理解其核心概念、架构、工作流程以及相关工具。实践是关键,通过搭建个人集群、部署应用和解决实际问题,逐步积累经验,才能真正掌握Kubernetes的精髓。同时,关注社区...

    best-practise-kubernetes:阿姆斯特丹DevOpsDays研讨会2018

    在Kubernetes环境中,Shell脚本常用于执行常见的管理操作,如部署应用、创建服务、监控资源等。参与者可能学习到了如何编写高效的Shell脚本,以便更有效地与Kubernetes API进行交互。 【压缩包子文件的文件名称列表...

Global site tag (gtag.js) - Google Analytics