kubernetes(k8s)为容器和 Pod 分配内存资源

这篇具有很好参考价值的文章主要介绍了kubernetes(k8s)为容器和 Pod 分配内存资源。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

kubernetes(k8s)为容器和 Pod 分配内存资源

展示如何将内存请求(request)和内存限制(limit)分配给一个容器。 我们保障容器拥有它请求数量的内存,但不允许使用超过限制数量的内存。

创建新的命名空间

kubectl create namespace mem-example

k8s 容器内存设置,kubernetes,docker,容器

指定内存请求和限制

编辑yaml文件

#创建一个拥有一个容器的Pod
apiVersion: v1
kind: Pod
metadata:
  name: memory-demo
  namespace: mem-example
spec:
  containers:
  - name: memory-demo-ctr
    image: polinux/stress
#容器会请求100MiB的内存,并且内存会被限制在200MiB以内
    resources:
      requests:
        memory: "100Mi"
      limits:
        memory: "200Mi"
#容器启动时使用压力测试工具stress
    command: ["stress"]
# "--vm","1" 产生一个子进程; --vm 2 产生两个进程
# "--vm-bytes","150M" 每个进程分配150M
# "--vm-hang","1" 指每个消耗内存的进程在分配内存后转入睡眠1秒,然后释放内存一直重复执行这个过程
    args: ["--vm","1","--vm-bytes","150M","--vm-hang","1"]

配置文件的 args 部分提供了容器启动时的参数。 “–vm-bytes”, “150M” 参数告知容器尝试分配 150 MiB 内存。
创建pod

kubectl apply -f memory-request-limit.yaml 

查看Pod是否正常运行

kubectl get pod memory-demo -n mem-example

k8s 容器内存设置,kubernetes,docker,容器
查看 Pod 相关的详细信息

kubectl get pod memory-demo -n mem-example -o yaml

输出结果显示:该 Pod 中容器的内存请求为 100 MiB,内存限制为 200 MiB。
k8s 容器内存设置,kubernetes,docker,容器
运行 kubectl top 命令,获取该 Pod 的指标数据:

如果出现以下问题

W0323 15:03:25.034693 2441 top_pod.go:140] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag
error: Metrics API not available

解决办法

下载部署文件

wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml

修改镜像地址

sed -i 's/registry.k8s.io/metrics-server\/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' metrics-server-components.yaml

如果更改不成功,可手动更改或者参照《史上最全操作教程——利用阿里云FREE镜像仓库构建国外DOCKER镜像》这篇文章

在metrics-server-components.yaml文件中添加这一行内容“- --kubelet-insecure-tls”这个配置,就不会去验证Kubelets提供的服务证书的CA。
k8s 容器内存设置,kubernetes,docker,容器

部署metrics-server

kubectl apply -f metrics-server-components.yaml

查看该 Pod 的指标数据

kubectl top pod memory-demo --namespace=mem-example

k8s 容器内存设置,kubernetes,docker,容器
输出结果显示:Pod 正在使用的内存大约为 150 MiB。 这大于 Pod 请求的 100 MiB,但在 Pod 限制的 200 MiB之内。

超过容器限制的内存

当节点拥有足够的可用内存时,容器可以使用其请求的内存。 但是,容器不允许使用超过其限制的内存。 如果容器分配的内存超过其限制,该容器会成为被终止的候选容器。 如果容器继续消耗超出其限制的内存,则终止容器。 如果终止的容器可以被重启,则 kubelet 会重新启动它,就像其他任何类型的运行时失败一样。

创建一个 Pod,尝试分配超出其限制的内存。 这是一个 Pod 的配置文件,其拥有一个容器,该容器的内存请求为 50 MiB,内存限制为 100 MiB

编写memory-request-limit2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: memory-demo-2
  namespace: mem-example
spec:
  containers:
  - name: memory-demo-2-ctr
    image: polinux/stress
    resources:
#请求50MiB
      requests:
        memory: "50Mi"
#限制为100MiB
      limits:
        memory: "100Mi"
#分配250MiB内存
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"]

创建超出限制的Pod并查看容器相关信息

#创建Pod
kubectl apply -f memory-request-limit2.yaml

#查看容器相关信息
kubectl get pod memory-demo-2 --namespace=mem-example
NAME            READY   STATUS      RESTARTS   AGE
memory-demo-2   0/1     OOMKilled   2          26s
此时,容器可能正在运行或被杀死。重复前面的命令,直到容器被杀掉

#查看更详细的状态信息
kubectl get pod memory-demo-2 --output=yaml --namespace=mem-example

k8s 容器内存设置,kubernetes,docker,容器
k8s 容器内存设置,kubernetes,docker,容器
输出结果显示:由于内存溢出(OOM),容器已被杀掉

容器可以被重启,所以 kubelet 会重启它。 多次运行下面的命令,可以看到容器在反复的被杀死和重启,输出结果显示:容器被杀掉、重启、再杀掉、再重启……

kubectl get pod memory-demo-2 --namespace=mem-example

NAME            READY   STATUS             RESTARTS   AGE
memory-demo-2   0/1     CrashLoopBackOff   6          6m19s

查看关于该 Pod 历史的详细信息

kubectl describe pod memory-demo-2 --namespace=mem-example

Normal   Pulled     8m16s                   kubelet            Successfully pulled image "polinux/stress" in 678.098976ms
Warning  BackOff    3m58s (x25 over 8m58s)  kubelet            Back-off restarting failed container

k8s 容器内存设置,kubernetes,docker,容器

超过整个节点容量的内存

内存请求和限制是与容器关联的,但将 Pod 视为具有内存请求和限制,也是很有用的。 Pod 的内存请求是 Pod 中所有容器的内存请求之和。 同理,Pod 的内存限制是 Pod 中所有容器的内存限制之和。

Pod 的调度基于请求。只有当节点拥有足够满足 Pod 内存请求的内存时,才会将 Pod 调度至节点上运行。

将创建一个 Pod,其内存请求超过了你集群中的任意一个节点所拥有的内存。 这是该 Pod 的配置文件,其拥有一个请求 1000 GiB 内存的容器,这应该超过了你集群中任何节点的容量。

编写memory-request-limit3.yaml

apiVersion: v1
kind: Pod
metadata:
  name: memory-demo-3
  namespace: mem-example
spec:
  containers:
  - name: memory-demo-3-ctr
    image: polinux/stress
    resources:
      requests:
        memory: "1000Gi"
      limits:
        memory: "1000Gi"
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

创建Pod容器

kubectl apply -f memory-request-limit3.yaml 

查看容器状态

kubectl get pod memory-demo-3 -n mem-example

输出结果显示:Pod 处于 PENDING 状态。 这意味着,该 Pod 没有被调度至任何节点上运行,并且它会无限期的保持该状态

kubectl get pod memory-demo-3 --namespace=mem-example
NAME            READY     STATUS    RESTARTS   AGE
memory-demo-3   0/1       Pending   0          25s

查看关于 Pod 的详细信息,包括事件

kubectl describe pod memory-demo-3 --namespace=mem-example

  Type     Reason            Age    From               Message
  ----     ------            ----   ----               -------
  Warning  FailedScheduling  3m47s  default-scheduler  0/1 nodes are available: 1 Insufficient memory.
  Warning  FailedScheduling  3m46s  default-scheduler  0/1 nodes are available: 1 Insufficient memory.

k8s 容器内存设置,kubernetes,docker,容器

如果不指定内存限制

如果你没有为一个容器指定内存限制,则自动遵循以下情况之一:

容器可无限制地使用内存。容器可以使用其所在节点所有的可用内存, 进而可能导致该节点调用 OOM Killer。 此外,如果发生 OOM Kill,没有资源限制的容器将被杀掉的可行性更大。

运行的容器所在命名空间有默认的内存限制,那么该容器会被自动分配默认限制。 集群管理员可用使用 LimitRange 来指定默认的内存限制。

内存请求和限制的目的

通过为集群中运行的容器配置内存请求和限制,你可以有效利用集群节点上可用的内存资源。 通过将 Pod 的内存请求保持在较低水平,你可以更好地安排 Pod 调度。 通过让内存限制大于内存请求,你可以完成两件事:

Pod 可以进行一些突发活动,从而更好的利用可用内存。
Pod 在突发活动期间,可使用的内存被限制为合理的数量。文章来源地址https://www.toymoban.com/news/detail-615470.html

到了这里,关于kubernetes(k8s)为容器和 Pod 分配内存资源的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • K8s(四)Pod资源——pod生命周期、重启策略、容器钩子与容器探测

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

    2024年01月20日
    浏览(33)
  • Kubernetes(k8s)容器编排Pod介绍和使用

    Pod是kubernetes中你可以创建和部署的最小也是最简的单位,一个Pod代表着集群中运行的一个进程。 Pod有两个必须知道的特点 通过yaml文件或者json描述Pod和其内容器的运行环境和期望状态,例如一个最简单的运行nginx应用的pod,定义如下 3.1.1 参数描述 下面简要分析一下上面的

    2024年02月08日
    浏览(46)
  • 【Kubernetes】k8s中容器之间、pod之间如何进行网络通信?

    首先来回顾一下Pod: Pod 是用于构建应用程序的最小可部署对象。单个 Pod 代表集群中正在运行的工作负载,并 封装一个或多个 Docker 容器、任何所需的存储以及唯一的 IP 地址 。 集群中每一个 Pod 都会获得自己的、 独一无二的 IP 地址。一个Pod里的一组容器共享相同的IP地址。

    2024年04月28日
    浏览(37)
  • K8S 1.27 新特性 Pod 无需重启调整CPU内存资源

    如果您已经部署了指定 CPU 或 Memory 资源的 Kubernetes pod,可能已经注意到更改资源值涉及重新启动 pod。直到现在,这一直是运行工作负载的破坏性操作。 在 Kubernetes v1.27 中,添加了一个新的 alpha 功能,允许用户在不重启容器的情况下调整分配给 Pod 的 CPU 或 memory 资源的大小。

    2024年02月11日
    浏览(29)
  • Kubernetes 启动Pod的方法-Pod的调度算法-Pod间的通信-k8s的控制器-Pod资源控制-发布Service服务

    目录 Pod 参考文档:Pod | Kubernetes Pod配置文件:simple-pod.yaml 对master进行如下操作 Pod的状态有: 参考文档:(70条消息) Pod生命周期中的状态解释_pod状态_闹玩儿扣眼珠子的博客-CSDN博客 进入Pod内的nginx容器: 当我们创建一个Pod,其中的步骤是什么?(启动Pob的流程) 大概步骤:

    2024年02月13日
    浏览(48)
  • 【云原生 | Kubernetes 系列】K8s 实战 如何给应用注入数据 II 将pod数据传递给容器

    在上一篇文章中,我们学习了针对容器设置启动时要执行的命令和参数、定义相互依赖的环境变量、为容器设置环境变量,三种设置方式,本篇文章,我们将继续学习数据的传递。 有两种方式可以将 Pod 和 Container 字段传递给运行中的容器: 环境变量 卷文件 这两种呈现 Pod

    2024年01月25日
    浏览(66)
  • k8s(Kubernetes)设置 pod,Deployment 域名自定义映射ip,hosts 解析 HostAliases

    直接 编辑修改 Deployment 最后内容如下,如需保存 按 esc 键,最后输入 :wq 保存退出,容器会自动重新生成新的

    2024年02月12日
    浏览(35)
  • K8S 1.27 动态调整容器CPU和内存资源限制,无需重启应用程序

    如果您在部署Pod时指定了 CPU 和内存资源,更改资源大小需要重新启动 Pod。到目前为止,重启对于正在运行工的作负载是一种破坏性操作。 Kubernetes 1.27 中的 alpha 功能发布。其中一项能够自动调整 Pod 的 CPU 和内存限制的大小,只需修补正在运行的 Pod 定义即可更改它们,而无

    2024年02月07日
    浏览(36)
  • K8S pod 均匀调度分配 —— 筑梦之路

      在 k8s 中 通过  kube-scheduler  组件来实现 pod 的调度,所谓调度,即把需要创建的 pod 放到 合适的 node 上,大概流程为,通过对应的  调度算法  和  调度策略 ,为待调度的 pod 列表中的 pod 选择一个最合适的 Node,然后目标节点上的  kubelet  通过 watch 接口监听到  kube-sch

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

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

    2024年02月13日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包