K8s实战教程之容器和 Pods资源分配问题

 更新时间:2022年7月26日 13:42  点击:518 作者:半身风雪

目标

本篇文章我们将学习,如何为容器设置 CPU request(请求) 和 CPU limit(限制)。 容器使用的 CPU 不能超过所配置的限制。 如果系统有空闲的 CPU 时间,则可以保证给容器分配其所请求数量的 CPU 资源。

一、启动服务

在前面的章节中,有讲解过 metrics-server 服务,在这里,我们再次运行以下命令,启动metrics-server :

minikube addons enable metrics-server

查看 metrics-server 资源API 是否可用,运行下面命令,则会输出将包含一个对 metrics.k8s.io 的引用。

$ kubectl get apiservices
NAME
v1beta1.metrics.k8s.io

二、创建命名空间

在进行资源分配之前,我们需要先创建一个命名空间,才能给这个空间分配资源。接下来我们先学习一下创建资源与集群的其余部分资源隔离。

在 Kubernetes 中,“名字空间(Namespace)”提供一种机制,将同一集群中的资源划分为相互隔离的组。 同一名字空间内的资源名称要唯一,但跨名字空间时没有这个要求。 名字空间作用域仅针对带有名字空间的对象,例如 Deployment、Service 等, 这种作用域对集群访问的对象不适用,例如 StorageClass、Node、PersistentVolume 等。

2.1、查看名字空间

初始状态下,Kubernetes 具有三个名字空间:

  • default 无名字空间对象的默认名字空间
  • kube-system 由 Kubernetes 系统创建的对象的名字空间
  • kube-public 自动创建且被所有用户可读的名字空间(包括未经身份认证的)。此名字空间通常在某些资源在整个集群中可见且可公开读取时被集群使用。此名字空间的公共方面只是一个约定,而不是一个必要条件。

我们可以通过使用 kubectl 的命令,来查看现有的命名空间:

$ kubectl get namespaces

NAME          STATUS    AGE
default       Active    11d
kube-system   Active    11d
kube-public   Active    11d

如果想要查看某一个命名空间的详情,也可以使用 kubectl describe namespaces 命令来查看:

$ kubectl describe namespaces <name>
Name:           default
Labels:         <none>
Annotations:    <none>
Status:         Active
No resource quota.
Resource Limits
 Type       Resource    Min Max Default
 ----               --------    --- --- ---
 Container          cpu         -   -   100m

请注意,这些详情同时显示了资源配额(如果存在)以及资源限制区间。

资源配额跟踪并聚合 Namespace 中资源的使用情况,并允许集群运营者定义 Namespace 可能消耗的 Hard 资源使用限制。

限制区间定义了单个实体在一个 Namespace 中可使用的最小/最大资源量约束。

名字空间可以处于下列两个阶段中的一个:

  • Active 名字空间正在被使用中
  • Terminating 名字空间正在被删除,且不能被用于新对象。

2.2、创建名字空间

上面将的命名空间,都是当前集群自带的三个命名空间,那么我们能不能自己创建命名空间呢?答案是,肯定的,下面我们来学习两种创建方式。

新建一个名为 my-namespace.yaml 的 YAML 文件,并写入下列内容:

apiVersion: v1
kind: Namespace
metadata:
  name: <insert-namespace-name-here>

然后运行命令:

 kubectl create -f ./my-namespace.yaml

或者,你可以使用下面的命令创建名字空间:

kubectl create namespace <insert-namespace-name-here>

2.3、删除名字空间

可选字段 finalizers 允许观察者们在名字空间被删除时清除资源。 记住如果指定了一个不存在的终结器,名字空间仍会被创建, 但如果用户试图删除它,它将陷入 Terminating 状态。下面是删除命名空间的命令:

$ kubectl delete namespaces <insert-some-namespace-name>

此命令会删除当前命名空间下面的所有内容,删除是异步的,所以有一段时间你会看到名字空间处于 Terminating 状态。

三、指定 CPU 请求和 CPU 限制

要为容器指定 CPU 请求,请在容器资源清单中包含 resources: requests 字段。 要指定 CPU 限制,请包含 resources:limits

在本练习中,你将创建一个具有一个容器的 Pod。容器将会请求 0.5 个 CPU,而且最多限制使用 1 个 CPU。 pods/resource/cpu-request-limit.yaml 是 Pod 的配置文件:

apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo
  namespace: cpu-example
spec:
  containers:
  - name: cpu-demo-ctr
    image: vish/stress
    resources:
      limits:
        cpu: "1"
      requests:
        cpu: "0.5"
    args:
    - -cpus
    - "2"

配置文件的 args 部分提供了容器启动时的参数。 -cpus “2” 参数告诉容器尝试使用 2 个 CPU。

1.创建 Pod:

$ kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit.yaml --namespace=cpu-example

2.验证所创建的 Pod 处于 Running 状态

$ kubectl get pod cpu-demo --namespace=cpu-example

3.查看显示关于 Pod 的详细信息:

$ kubectl get pod cpu-demo --output=yaml --namespace=cpu-example

输出显示 Pod 中的一个容器的 CPU 请求为 500 milli CPU,并且 CPU 限制为 1 个 CPU。

resources:
  limits:
    cpu: "1"
  requests:
    cpu: 500m

5.使用 kubectl top 命令来获取该 Pod 的度量值数据,我这里的输出显示 Pod 使用的是 974 milliCPU,即略低于 Pod 配置中指定的 1 个 CPU 的限制。

$ kubectl top pod cpu-demo --namespace=cpu-example

NAME                        CPU(cores)   MEMORY(bytes)
cpu-demo                    974m         <something>

3.1、CPU 单位

CPU 资源以 CPU 单位度量。Kubernetes 中的一个 CPU 等同于:

  • 1 个 AWS vCPU
  • 1 个 GCP核心
  • 1 个 Azure vCore
  • 裸机上具有超线程能力的英特尔处理器上的 1 个超线程

小数值是可以使用的。一个请求 0.5 CPU 的容器保证会获得请求 1 个 CPU 的容器的 CPU 的一半。 你可以使用后缀 m 表示毫。例如 100m CPU、100 milliCPU 和 0.1 CPU 都相同。 精度不能超过 1m。

CPU 请求只能使用绝对数量,而不是相对数量。0.1 在单核、双核或 48 核计算机上的 CPU 数量值是一样的。

删除 Pod

$ kubectl delete pod cpu-demo --namespace=cpu-example

3.2、设置超过节点能力的 CPU 请求

CPU 请求和限制与都与容器相关,但是我们可以考虑一下 Pod 具有对应的 CPU 请求和限制这样的场景。 Pod 对 CPU 用量的请求等于 Pod 中所有容器的请求数量之和。 同样,Pod 的 CPU 资源限制等于 Pod 中所有容器 CPU 资源限制数之和。

Pod 调度是基于资源请求值来进行的。 仅在某节点具有足够的 CPU 资源来满足 Pod CPU 请求时,Pod 将会在对应节点上运行:

接下来我们在目录 pods/resource/cpu-request-limit-2.yaml 中创建一个 Pod,该 Pod 的 CPU 请求对于集群中任何节点的容量而言都会过大。 下面是 Pod 的配置文件,其中有一个容器。容器请求 100 个 CPU,这可能会超出集群中任何节点的容量。

apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo-2
  namespace: cpu-example
spec:
  containers:
  - name: cpu-demo-ctr-2
    image: vish/stress
    resources:
      limits:
        cpu: "100"
      requests:
        cpu: "100"
    args:
    - -cpus
    - "2"

3.2.1、创建 Pod

执行创建命令

$ kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit-2.yaml --namespace=cpu-example

3.2.2、Pod 的状态

运行下列命令,查看该 Pod 的状态

$ kubectl get pod cpu-demo-2 --namespace=cpu-example

输出显示 Pod 状态为 Pending。也就是说,Pod 未被调度到任何节点上运行, 并且 Pod 将无限期地处于 Pending 状态:

NAME         READY     STATUS    RESTARTS   AGE
cpu-demo-2   0/1       Pending   0          7m

3.2.3、Pod 详情

可以输入以下命令,查看有关 Pod 的详细信息,包含事件

$ kubectl describe pod cpu-demo-2 --namespace=cpu-example

输出显示由于节点上的 CPU 资源不足,无法调度容器

Events:
  Reason                        Message
  ------                        -------
  FailedScheduling      No nodes are available that match all of the following predicates:: Insufficient cpu (3).

3.2.4、删除 Pod

当然,我也可以使用命名删除你的 Pod

$ kubectl delete pod cpu-demo-2 --namespace=cpu-example

四、不限制CPU

如果没有为容器指定 CPU 限制,则会发生以下情况之一:

  • 容器在可以使用的 CPU 资源上没有上限。因而可以使用所在节点上所有的可用 CPU 资源。
  • 容器在具有默认 CPU 限制的名字空间中运行,系统会自动为容器设置默认限制。 集群管理员可以使用 LimitRange 指定 CPU 限制的默认值。

如果为容器指定了 CPU 限制值但未为其设置 CPU 请求,Kubernetes 会自动为其 设置与 CPU 限制相同的 CPU 请求值。类似的,如果容器设置了内存限制值但未设置 内存请求值,Kubernetes 也会为其设置与内存限制值相同的内存请求。

总结

本篇文章通过配置集群中运行的容器的 CPU 请求和限制,你可以有效利用集群上可用的 CPU 资源。 通过将 Pod CPU 请求保持在较低水平,可以使 Pod 更有机会被调度。 通过使 CPU 限制大于 CPU 请求,你可以完成两件事:

  • Pod 可能会有突发性的活动,它可以利用碰巧可用的 CPU 资源。
  • Pod 在突发负载期间可以使用的 CPU 资源数量仍被限制为合理的数量。

到此这篇关于K8s实战教程之容器和 Pods资源分配的文章就介绍到这了,更多相关K8s 容器和 Pods资源分配内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

原文出处:https://blog.csdn.net/u010755471/article/details/125968054

[!--infotagslink--]

相关文章

  • 教你使用Portainer管理多台Docker容器环境的方法

    这篇文章主要介绍了Portainer管理多台Docker容器环境,本文给大家介绍的非常详细,包括环境准备及管理docker的详细过程,需要的朋友可以参考下...2021-11-11
  • Go 容器遍历的实现示例

    Go 语言提供的基础容器,免不了要查询容器中的数据,那么是如何实现遍历的呢?本文将会介绍几种常用容易的遍历及其使用。感兴趣的可以了解一下...2021-06-13
  • 一条命令重启所有已停止的docker容器操作

    这篇文章主要介绍了一条命令重启所有已停止的docker容器操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-20
  • C++ STL关联式容器自定义排序规则的2种方法

    这篇文章主要介绍了C++ STL关联式容器自定义排序规则的2种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-04
  • docker容器与宿主机的数据交互方式总结

    这篇文章主要给大家介绍了关于docker容器与宿主机的数据交互,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-09
  • 浅谈C++ 类的实例中 内存分配详解

    下面小编就为大家带来一篇浅谈C++ 类的实例中 内存分配详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
  • C#访问C++动态分配的数组指针(实例讲解)

    下面小编就为大家分享一篇C#访问C++动态分配的数组指针(实例讲解),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
  • docker cp 拷贝文件 和 进入容器的操作

    这篇文章主要介绍了docker cp 拷贝文件 和 进入容器的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-25
  • C++中的哈希容器unordered_map使用示例

    这篇文章主要介绍了C++中的哈希容器unordered_map使用示例,本文直接给出实例代码,并讲解了一些hash table的知识,需要的朋友可以参考下...2020-04-25
  • Web容器启动过程中如何执行Java类

    这篇文章主要介绍了Web容器启动过程中如何执行Java类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-15
  • AirPods电池更换价格:保修内免费 过保后49美元

    苹果产品可以使用很长时间,但电池却不能。对于 Mac 来说,苹果在系统信息页面提供了详细的电池循环计数。不过对于 AirPods 等产品,则无法统计电池循环。这意味着当 AirPods 电池的续航变短时,我们需要为 AirPods 更换电池。苹果更新了 iPhone 维修定价页面,详细介绍了 AirPods 更换电池的价格。苹果将 AirPods 电池服务列在了 iPhone 维修服务定价页面,而 AirPods 自己的技术支持页面并没有上线。...2016-12-21
  • Go标准容器之Ring的使用说明

    这篇文章主要介绍了Go标准容器之Ring的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-04
  • C++ 中继承与动态内存分配的详解

    这篇文章主要介绍了C++ 中继承与动态内存分配的详解的相关资料,这里提供实例帮助大家学习理解这部分内容,需要的朋友可以参考下...2020-04-25
  • C语言数据结构之动态分配实现串

    这篇文章主要介绍了C语言数据结构之动态分配实现串的相关资料,希望通过本文能帮助到大家,让大家实现数据结构中动态分配实现串的实例,需要的朋友可以参考下...2020-04-25
  • 解决docker容器与宿主机相差8小时的问题

    使用docker-compose部署时,在输出的日志以及相关事件校验及输出时,导致事件与现实相差8小时。纠结怎么回事呢?下面小编给大家分享下解决docker容器与宿主机相差8小时的问题,一起看看吧...2021-09-29
  • 详解JavaScript状态容器Redux

    Redux官网上是这样描述Redux,Redux is a predictable state container for JavaScript apps.(Redux是JavaScript状态容器,提供可预测性的状态管理)。目前Redux GitHub有5w多star,足以说明 Redux 受欢迎的程度...2021-06-18
  • 使用Java反射模拟实现Spring的IoC容器的操作

    这篇文章主要介绍了使用Java反射模拟实现Spring的IoC容器的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-16
  • 详解SpringIOC容器相关知识

    这篇文章主要记录自己在狂神说java中的学习情况,文章里有自己学习的理解和扩展,新手难免有理解偏差或者错误,恳请大佬指正下,需要的朋友可以参考下...2021-05-13
  • Golang: 内建容器的用法

    这篇文章主要介绍了Golang: 内建容器的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-04
  • docker run 运行容器自动结束的解决

    这篇文章主要介绍了docker run 运行容器自动结束的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-19