K8S 1.27 动态调整容器CPU和内存资源限制,无需重启应用程序

这篇具有很好参考价值的文章主要介绍了K8S 1.27 动态调整容器CPU和内存资源限制,无需重启应用程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如果您在部署Pod时指定了 CPU 和内存资源,更改资源大小需要重新启动 Pod。到目前为止,重启对于正在运行工的作负载是一种破坏性操作。

Kubernetes 1.27 中的 alpha 功能发布。其中一项能够自动调整 Pod 的 CPU 和内存限制的大小,只需修补正在运行的 Pod 定义即可更改它们,而无需重新启动它。

这也意味着 resources 规范中的字段不能再作为 Pod 实际资源的指示符。监控工具和其他此类应用程序现在必须查看 Pod 状态中的新字段,这对我们的现有监控告警也是一项比较大的挑战。Kubernetes 通过对运行时(例如负责运行容器的 containerd)的 CRI(容器运行时接口)API 调用来查询实际的 CPU 和内存请求以及对正在运行的容器强制执行的限制。容器运行时的资源占用反映在 Pod 的状态中,这块后面会举例说明。

Kubernetes v1.27 有哪些新功能?

除了在 pod 规范中添加用于调整大小的重启策略之外,pod 的状态中还添加了三个新字段。

  • allocatedResources容器状态中的字段反映了分配给 pod 容器的节点资源。

  • resources容器状态中的字段反映了容器运行时报告的正在运行的容器上配置的实际资源(请求和限制)。

  • resizePod 的值Proposed是对请求的调整大小的确认,并指示请求已验证并记录。

  • resizePod 的值InProgress表示节点已接受调整大小请求,并且正在将调整大小请求应用到 Pod 的容器。

  • resizePod 的值Deferred表示此时无法授予请求的调整大小,节点将继续重试。当其他 Pod 离开并释放节点资源时,可以授予调整大小的权限。

  • resizePod 的值表示Infeasible节点无法适应所请求的调整大小。如果请求的调整大小超过节点可以为 Pod 分配的最大资源,就会发生这种情况。

何时使用此功能

  • Pod 正在节点上运行,但资源过多或过少。

  • 由于集群中缺乏足够的 CPU 或内存,而过度配置的正在运行的 Pod 未充分利用,因此无法调度此 Pod。

  • 当该节点上存在其他优先级较低的 Pod(可以调整大小或移动以为有状态 Pod 腾出空间)时,驱逐需要更多资源将其调度到更大节点上的某些有状态 Pod 是一项昂贵或具有破坏性的操作。

如何使用此功能

为了在 v1.27 中使用此功能,InPlacePodVerticalScaling 必须启用功能门。

FEATURE_GATES=InPlacePodVerticalScaling=true ./hack/local-up-cluster.sh

一旦本地集群启动并运行,Kubernetes 用户就可以通过 kubectl 调度 pod 的资源并调整 pod 的大小。后文会演示使用此功能的示例。

已知问题

该功能进入 Kubernetes v1.27 的 alpha 阶段。以下是用户可能遇到的一些已知问题:

  • v1.6.9 以下的 containerd 版本不具备此功能的完整端到端操作所需的 CRI 支持。尝试调整 pod 大小似乎会陷入状态InProgress,并且resourcespod 状态中的字段永远不会更新,即使可能已在正在运行的容器上启用新资源。

  • Pod 调整大小可能会遇到与其他 Pod 更新的竞争条件,导致 Pod 调整大小延迟实施。

  • 调整大小后的容器资源反映在 pod 的状态中可能需要很长时间。

  • 此功能不支持 static CPU 管理策略。

示例

我使用 Kubernetes 的公共云版本,但由于这些托管版本中尚未提供 1.27 版(截至 2023 年 4 月),我们将使用 minikube 在本地启动一个版本。有很多方法可以做到这一点;这只是一个简单的例子。

这是在功能标志下发布的InPlacePodVerticalScaling。使用该标志启动一个 minikube 集群,并添加一个节点:

minikube start --kubernetes-version=v1.27.0 --feature-gates=InPlacePodVerticalScaling=true --cni calico
minikube node add

准备就绪后,启动测试容器。举例来说,对于我们的应用程序,无需重新启动即可安全地更改 CPU 数量,但更改内存数量则需要重新启动。例如,运行数据库的 pod 在运行时 CPU 计数变化不会出现问题,但减少内存量会导致意外行为。restartPolicy我们通过设置为“内存”为RestartContainer,即重启容器才会生效,否则,默认行为将尝试就地更新所有资源。

apiVersion: v1
kind: Pod
metadata:
  name: inplacedemo
spec:
  containers:
  - name: inplacedemo
    image: alpine
    command: ["tail", "-f", "/dev/null"]
    resizePolicy:
    - resourceName: "memory"
      restartPolicy: "RestartContainer"
    resources:
      limits:
        cpu: 2
        memory: "1Gi"
      requests:
        cpu: 1
        memory: "500Mi"

应用 yaml并确保它正在运行,然后在准备就绪时通过获取 pod 信息来查看新字段:

$ kubectl apply -f yaml_above.yaml
pod/inplacedemo created
$ kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
inplacedemo   1/1     Running   0          53s
$ kubectl get pod inplacedemo -o yaml

在 pod 定义中要注意的是resizePolicy:

spec:
  containers:
    ...
    resizePolicy:
    - resourceName: memory
      restartPolicy: RestartContainer
    - resourceName: cpu
      restartPolicy: NotRequired

allocatedResources是分配给 pod 容器的资源,并且还有一个附加resources字段。这反映了实际的当前资源,而不是所需/待更新的资源。

containerStatuses:
  - allocatedResources:
      cpu: "1"
      memory: 500Mi
    ...
    resources:
      limits:
        cpu: "2"
        memory: 1Gi
      requests:
        cpu: "1"
        memory: 500Mi

让我们首先修改 pod CPU 限制,将其从 2 增加到 3。

kubectl patch pod inplacedemo --patch '{"spec":{"containers":[{"name":"inplacedemo", "resources":{"limits":{"cpu":"3"}}}]}}'

再次查看 pod 规格

spec:
  ...
    resources:
      limits:
        cpu: "3"
        memory: 1Gi
      requests:
        cpu: "1"
        memory: 500Mi

status:
  ...
  containerStatuses:
    ...
    resources:
      limits:
        cpu: "2"
        memory: 1Gi
      requests:
        cpu: "1"
        memory: 500Mi
    restartCount: 0
  ...
  resize: InProgress

Pod 从 resize: InProgress完成到完成(标志消失)所需的时间而有所不同。如果您看到其他标志,例如resize: Infeasible,请检查您的节点资源以确保它们足够。

继续将限制从 1G 增加到 2G:

kubectl patch pod inplacedemo --patch '{ "spec" :{ "containers" :[{ "name" : "inplacedemo" , "resources" :{ "limits" :{ "memory" : "2Gi" }}}]} }'

通过检查,调整大小标签和 Pod 状态的过程与之前相同。

Kubernetes 就地更新底层 c-group 分配,从而使 pod 资源定义可变。这在垂直扩展 pod 的情况下特别有用,例如使用 Kubernetes 内置的Vertical Pod Autoscaler (VPA),它允许应用程序在同一 pod 内向上/向下扩展资源(而不是通过更多pod 进/出进行扩展)与传统的水平 Pod 缩放一样)。

在许多用例中,垂直扩展很有帮助,例如某些 Java 应用程序在初始化期间可能需要比正常进程操作期间所需的 CPU 多得多的 CPU。如果此类应用程序指定适合正常操作的 CPU 请求和限制,则它们可能会遭受很长的启动时间。此类 Pod 可以在创建 Pod 时请求更高的 CPU 值,并且可以在应用程序完成初始化后调整大小以满足正常运行需求。

推荐

A Big Picture of Kubernetes

Kubernetes入门培训(内含PPT)


原创不易,随手关注或者”在看“,诚挚感谢!文章来源地址https://www.toymoban.com/news/detail-724012.html

到了这里,关于K8S 1.27 动态调整容器CPU和内存资源限制,无需重启应用程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K8S学习指南(10)-k8s中为pod分配CPU和内存资源

    Kubernetes(简称K8s)是一种开源的容器编排平台,广泛用于构建、部署和管理容器化应用。在Kubernetes中,Pod是最小的可部署单元,而资源分配是确保Pod正常运行的关键因素之一。本文将深入探讨如何在Kubernetes中为Pod分配CPU和内存资源,并提供详细的示例。 在容器化环境中,多

    2024年02月04日
    浏览(57)
  • K8s集群1.27最新版二进制高可用部署

    二进制方式安装Kubernetes高可用集群,虽然安装过程较为复杂,但这也是每个技术人员必须要掌握的内容。同时,在安装过程中,也可以更加深刻地理解每个组件的工作原理。 一、系统环境配置 (1)主机名配置 (2)所有节点修改yum源 (3)所有节点安装常用软件   (4)将master01节点配

    2024年02月07日
    浏览(52)
  • RockyLinux9.2安装k8s 1.27+calico+BGP+OpenELB

    本文在rockylinux 9.2 中使用kubeadm部署 Kubernetes 1.27 、 containerd 、 calico 、 BGP 等; 使用 OpenELB 作为 LoadBalancer ; 使用 BIRD 模拟物理路由器; 使用 kube-vip 实现 control-plane 高可用; 本文所有k8s相关组件都固定版本安装,避免因版本更新导致各种问题;如 kubelet-1.27.2 、 kubeadm-1.27.2 、 kub

    2024年02月15日
    浏览(42)
  • kubernetes(k8s)为容器和 Pod 分配内存资源

    展示如何将内存请求(request)和内存限制(limit)分配给一个容器。 我们保障容器拥有它请求数量的内存,但不允许使用超过限制数量的内存。 创建新的命名空间 编辑yaml文件 配置文件的 args 部分提供了容器启动时的参数。 “–vm-bytes”, “150M” 参数告知容器尝试分配 15

    2024年02月15日
    浏览(58)
  • 【Kubernetes部署篇】Ansible自动化工具离线部署K8s 1.27版本

    一、前提须知 采用kubeadm方式,目前只支持 单Master,多Node部署架构 需要主机网络互通,没有网络限制 需要使用root用户权限进行部署 二、使用Ansible部署K8S集群步骤 第一步:获取离线安装包 百度网盘获取 MD5:97d1f48bff3a345429b551b877c7c53d 第二步:安装ansible命令,压缩包中提供

    2024年02月14日
    浏览(55)
  • k8s 1.27新特性in-place使用方法:避坑指南(官方文档有坑,已提issue)

    按照官方文档试用新版的in-place特性时,一字不差地执行了,但是却出现了执行失败的情况: 执行 kubectl -n qos-example patch pod qos-demo-5 --patch \\\'{\\\"spec\\\":{\\\"containers\\\":[{\\\"name\\\":\\\"qos-demo-ctr-5\\\", \\\"resources\\\":{\\\"requests\\\":{\\\"cpu\\\":\\\"800m\\\"}, \\\"limits\\\":{\\\"cpu\\\":\\\"800m\\\"}}}]}}\\\' 后该pod一直处于 RunContainerError 状态; 使用 kub

    2024年02月08日
    浏览(46)
  • Kubernetes配置 Pods 和容器—调整分配给容器的 CPU 和内存资源

    本页说明如何在不重启 Pod 或其容器的情况下调整分配给运行中 Pod 容器的 CPU 和内存资源。 Kubernetes 节点会基于 Pod 的  requests  为 Pod 分配资源, 并基于 Pod 的容器中指定的  limits  限制 Pod 的资源使用。 对于原地调整 Pod 资源而言: 针对 CPU 和内存资源的容器的  requests  和

    2024年02月13日
    浏览(46)
  • K8S-容器运行时(v1.27)

    说明:  自 1.24 版起,Dockershim 已从 Kubernetes 项目中移除。阅读 Dockershim 移除的常见问题了解更多详情。 你需要在集群内每个节点上安装一个 容器运行时 以使 Pod 可以运行在上面。本文概述了所涉及的内容并描述了与节点设置相关的任务。 Kubernetes 1.27 要求你使用符合容器

    2024年01月21日
    浏览(43)
  • 在Kubernetes(K8s)中,CPU和内存的单位

    在Kubernetes(K8s)中,CPU和内存的单位有一些特定的表示法,它们是: CPU单位 - millicores (m): m 表示 millicores,即千分之一的 CPU 核心。 例如, 100m 表示 0.1 个 CPU 核心,而 500m 表示 0.5 个 CPU 核心。 这种表示法用于将 CPU 资源分配为相对小的单位,使得可以更精确地定义容器对

    2024年01月24日
    浏览(42)
  • K8s(四)Pod资源——pod生命周期、重启策略、容器钩子与容器探测

    目录 Pod生命周期 Pod重启策略 初始化容器 容器钩子 容器探测 启动探测 存活探测 就绪探测 参考资料 Pod 的生命周期 | Kubernetes Init 容器 | Kubernetes Pod的生命周期可以分为以下几个阶段: Pending(等待):在这个阶段,Pod被创建,并且正在等待被调度到一个节点上运行。此时,

    2024年01月20日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包