在 Kubernetes 中,正确地为您的 pod 定义 CPU 和内存资源对于维持应用程序的性能和确保集群资源被高效利用至关重要。配置错误可能导致资源争用、较差的性能,甚至应用程序崩溃。本文提供了一个关于如何在 Kubernetes 中正确设定资源请求和限制的详细指导。这基于我在生产环境中管理 Kubernetes 集群超过 5 年的经验。
在 Kubernetes 中,每个 pod 的容器都可以设定特定的资源请求和限制值。
0.5
表示半个 CPU 核心。Mi
(MiB)和 Gi
(GiB),例如 512Mi
或 2Gi
。这里是一个在 pod 规范中定义资源请求和限制的例子,比如:yaml
apiVersion: v1 # API版本,指定使用的Kubernetes API版本 kind: Pod # 类型,表示这是一个Pod对象 metadata: # 元数据,包含对象的名称等信息 name: gisalind # Pod的名称 spec: # Pod的规范,定义了Pod的行为 containers: # 容器列表,定义了Pod中运行的容器 - name: gisalind # 容器的名称 image: gisalind:v1 # 使用的镜像名称和版本 resources: # 容器的资源请求和限制 requests: memory: "256Mi" # 请求的内存,256兆字节 cpu: "500m" # 请求的CPU,500毫核,即0.5核 limits: memory: "512Mi" # 最大内存限制,512兆字节 cpu: "1核" # 最大CPU限制,1核,表示一个完整的CPU核心
在上述例子中:
所以在启动 pod 之前,Kubernetes 确保请求的资源是可用的。若不可用,应用的 pod 将会一直等待,直到内存和 CPU 资源变得可用。
下面是一些我根据经验总结出来关于如何合理设置CPU和内存(RAM)请求和限制的建议。
在设定资源请求和限制之前,分析应用程序在正常和高峰负载下的资源使用情况。使用监控工具来,例如 Prometheus,Grafana,Cloudwatch 或 Kubernetes Metrics Server,来收集 CPU 和内存的使用情况。
如果你对具体的资源需求不太确定,可以根据观察到的数据,提出较为保守的请求。将请求设置为略低于平均使用量,同时将限制设置为略高于峰值使用量,但保持在合理的范围之内。
如果你的应用程序负载波动较大,可以考虑使用横向Pod自动扩展(HPA)。HPA会根据CPU利用率或其它特定指标自动调整Pod的数量,帮助你动态扩展资源。
过度分配资源可能导致您的Kubernetes集群效率降低。如果每个Pod请求的资源都超过了实际需要,您的集群可能会利用率不足,导致计算资源浪费和成本上升。建议从小处开始,然后根据需要逐步增加资源。
部署完成后,继续监控应用程序的性能和资源使用。逐步调整请求和限制,以达到最佳性能和资源利用。
对于资源使用偶尔会有峰值的工作负载,你可以设置较低的资源请求和较高的资源限制。这使得应用程序可以在超出其正常需求时快速扩展资源,而不会永久占用这些资源。
在设置内存限制时要小心。如果一个容器超出其内存限制,Kubernetes 将会终止它(OOMKilled,即因内存不足而被杀死)。这会严重影响应用程序的可用性。更稳妥的做法是将内存请求设置为接近预期使用量,而限制则设置为稍高于这个量,而不应该设置得过高。
正确地为你的 Kubernetes Pod 定义 CPU 和内存是一个在资源效率和应用程序性能之间达到平衡的过程。从数据驱动的估算开始,并通过逐步调整和监控来优化它们。通过遵循最佳实践,这样你可以确保你的应用程序平稳运行同时避免浪费集群资源。
好了,现在你可以有效地调整Kubernetes pod的资源请求和限制了!
———
大家好,我是Hervé-Gaël KOUAMO,HK-TECH的创始人及CTO,这是一家专注于设计、构建和优化应用程序的法国科技公司。我们帮助企业在云迁移过程中顺利过渡,确保无缝过渡并最大化其数字价值。您可以通过这里或我的LinkedIn(法语)关注我,每周日我都会在我的博客更新最新的文章:https://www.linkedin.com/in/herv%C3%A9-ga%C3%AEl-kouamo-157633197/