如何为 Kubernetes Pod 设置默认 CPU 和内存限制

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

Kubernetes 是一个强大的容器编排平台,可让你管理和扩展容器化应用程序。Kubernetes 的关键特性之一是能够为在 Pod 中运行的容器设置资源限制和请求。在本教程中,你将学习如何理解 Kubernetes 资源限制、设置默认资源限制,并将其应用于你的 Kubernetes 工作负载,以确保应用程序高效可靠地运行。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/edit("Edit") kubernetes/BasicCommandsGroup -.-> kubernetes/set("Set") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") subgraph Lab Skills kubernetes/get -.-> lab-415056{{"如何为 Kubernetes Pod 设置默认 CPU 和内存限制"}} kubernetes/create -.-> lab-415056{{"如何为 Kubernetes Pod 设置默认 CPU 和内存限制"}} kubernetes/edit -.-> lab-415056{{"如何为 Kubernetes Pod 设置默认 CPU 和内存限制"}} kubernetes/set -.-> lab-415056{{"如何为 Kubernetes Pod 设置默认 CPU 和内存限制"}} kubernetes/apply -.-> lab-415056{{"如何为 Kubernetes Pod 设置默认 CPU 和内存限制"}} kubernetes/describe -.-> lab-415056{{"如何为 Kubernetes Pod 设置默认 CPU 和内存限制"}} end

理解 Kubernetes 资源限制

Kubernetes 是一个强大的容器编排平台,提供了一种管理和扩展容器化应用程序的方式。Kubernetes 的关键特性之一是能够为在 Pod 中运行的容器设置资源限制和请求。在本节中,我们将探讨 Kubernetes 资源限制的概念,以及如何使用它们来确保应用程序高效可靠地运行。

什么是 Kubernetes 资源限制?

Kubernetes 资源限制是一组约束条件,你可以为容器使用的资源(CPU 和内存)定义这些条件。这些限制确保容器不会消耗超过其允许的资源,防止它影响其他容器或整个系统的性能。

当你为容器定义资源限制时,你指定了容器允许使用的特定资源(CPU 或内存)的最大量。如果容器试图超过其资源限制,Kubernetes 将根据资源类型对容器进行节流或终止。

为什么要使用 Kubernetes 资源限制?

Kubernetes 资源限制至关重要,原因如下:

  1. 公平性和隔离性:通过设置资源限制,你可以确保 Pod 或命名空间中的每个容器都能公平地共享可用资源,防止单个容器独占资源并影响其他容器的性能。
  2. 可预测的性能:资源限制通过确保应用程序不超过其分配的资源,帮助你为应用程序维持可预测的性能,否则可能导致意外行为或崩溃。
  3. 高效的资源利用:当你定义资源限制时,Kubernetes 可以更好地在节点上调度和打包你的容器,从而更有效地利用可用资源。
  4. 成本优化:通过设置适当的资源限制,你可以避免过度配置资源,从而为你的 Kubernetes 集群节省成本。

定义 Kubernetes 资源限制

要在 Kubernetes 中为容器定义资源限制,你需要在容器规范中使用 resources 字段。以下是一个示例:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: nginx
      resources:
        limits:
          cpu: 500m
          memory: 512Mi
        requests:
          cpu: 250m
          memory: 256Mi

在这个示例中,我们为 my-container 容器定义了以下资源限制和请求:

  • CPU 限制:500 毫核(0.5 CPU)
  • 内存限制:512 mebibytes(512 MiB)
  • CPU 请求:250 毫核(0.25 CPU)
  • 内存请求:256 mebibytes(256 MiB)

资源请求表示容器运行所需的最小资源量,而资源限制表示容器允许使用的最大资源量。

Kubernetes 将确保容器不会超过其资源限制,并会将容器调度到能够满足其资源请求的节点上。

在 Kubernetes 中设置默认资源限制

虽然为单个容器设置资源限制很重要,但这可能既耗时又容易出错,尤其是在大型 Kubernetes 部署中。为了解决这个问题,Kubernetes 提供了一个名为 LimitRange 的功能,它允许你在命名空间级别设置默认资源限制和请求。

理解 LimitRange

LimitRange 是一种 Kubernetes 资源,它允许你对特定命名空间中容器或 Pod 可消耗的资源量(CPU 和内存)设置约束。当在具有 LimitRange 的命名空间中创建容器或 Pod 时,Kubernetes 将自动应用 LimitRange 中定义的默认资源限制和请求,除非容器或 Pod 指定了其自己的资源限制和请求。

以下是一个 LimitRange 配置示例:

apiVersion: v1
kind: LimitRange
metadata:
  name: limit-range
spec:
  limits:
    - default:
        cpu: 500m
        memory: 512Mi
      defaultRequest:
        cpu: 250m
        memory: 256Mi
      type: Container

在此示例中,我们定义了一个具有以下设置的 LimitRange 资源:

  • 默认 CPU 限制:500 毫核(0.5 CPU)
  • 默认内存限制:512 mebibytes(512 MiB)
  • 默认 CPU 请求:250 毫核(0.25 CPU)
  • 默认内存请求:256 mebibytes(256 MiB)

这些默认限制和请求将应用于在定义此 LimitRange 的命名空间中创建的任何容器,除非容器指定其自己的资源限制和请求。

将默认资源限制应用于 Kubernetes 工作负载

要应用 LimitRange 中定义的默认资源限制和请求,你可以创建一个新的命名空间并将 LimitRange 应用于它。以下是一个示例:

## 创建一个新的命名空间
kubectl create namespace my-namespace

## 将 LimitRange 应用于该命名空间
kubectl apply -f limit-range.yaml -n my-namespace

现在,在 my-namespace 命名空间中创建的任何 Pod 或容器将自动应用默认资源限制和请求,除非它们指定自己的资源设置。

你可以通过检查 my-namespace 命名空间中的 Pod 来验证应用的资源限制和请求:

kubectl get pods -n my-namespace -o yaml

在 Pod 规范中查找 resources 部分,它应反映 LimitRange 设置的默认限制和请求。

通过使用 LimitRange,你可以确保命名空间中的所有容器都有一组一致的资源限制和请求,从而更轻松地管理和优化整个 Kubernetes 集群中的资源使用。

将默认资源限制应用于 Kubernetes 工作负载

既然你已经了解了如何使用 LimitRange 设置默认资源限制,那么让我们来探讨如何将这些限制应用于你的 Kubernetes 工作负载,例如 Deployment、ReplicaSet 和 Pod。

将默认限制应用于 Kubernetes Deployment

当你创建一个 Kubernetes Deployment 时,你可以在 Pod 模板中为容器指定资源限制和请求。但是,如果你已经在命名空间中设置了 LimitRange,Kubernetes 将自动应用 LimitRange 中定义的默认限制和请求,除非你明确设置自己的资源设置。

以下是一个 Deployment 清单示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: nginx

在这个示例中,我们没有为容器指定任何资源限制或请求。当在具有 LimitRange 的命名空间中创建此 Deployment 时,Kubernetes 将自动应用 LimitRange 中定义的默认资源限制和请求。

你可以通过检查 Deployment 来验证应用的资源限制和请求:

kubectl describe deployment my-deployment

在输出中查找 Resources 部分,它应反映 LimitRange 设置的默认限制和请求。

将默认限制应用于 Pod 和 ReplicaSet

同样的原则也适用于 Pod 和 ReplicaSet。如果你在具有 LimitRange 的命名空间中创建一个 Pod 或 ReplicaSet,Kubernetes 将自动应用 LimitRange 中定义的默认资源限制和请求,除非你明确设置自己的资源设置。

通过使用 LimitRange 设置默认资源限制和请求,你可以确保所有 Kubernetes 工作负载都有一组一致的资源约束,从而更轻松地管理和优化整个集群中的资源使用。

总结

在本教程中,你已经了解了 Kubernetes 资源限制的重要性以及如何为你的 Pod 设置默认资源限制。通过配置适当的资源限制,你可以确保为基于 Kubernetes 的应用程序实现公平的资源分配、可预测的性能、高效的资源利用以及成本优化。将默认资源限制应用于你的 Kubernetes 工作负载是有效管理和扩展容器化应用程序的关键一步。