跳到主要内容

Kubernetes 资源限制

介绍

在 Kubernetes 中,资源限制(Resource Limits)是管理容器资源使用的重要机制。通过为容器设置资源请求(Requests)和资源限制(Limits),您可以确保应用程序在集群中获得足够的资源,同时避免资源过度使用导致其他工作负载受到影响。

资源限制主要包括 CPU 和内存(Memory)两种资源类型。资源请求是 Kubernetes 调度器为容器分配资源的依据,而资源限制则是容器运行时允许使用的资源上限。

备注

资源请求和限制的单位:

  • CPU:以毫核(millicores)为单位,例如 500m 表示 0.5 个 CPU 核心。
  • 内存:以字节为单位,例如 256Mi 表示 256 MiB(Mebibytes)。

资源请求与限制的作用

  1. 资源请求(Requests):Kubernetes 调度器根据资源请求决定将 Pod 调度到哪个节点。如果节点没有足够的资源满足 Pod 的请求,Pod 将无法调度。
  2. 资源限制(Limits):容器运行时(如 Docker)会根据资源限制限制容器的资源使用。如果容器尝试使用超过限制的资源,Kubernetes 会采取措施(如终止容器或限制其资源使用)。

如何设置资源限制

在 Kubernetes 中,资源请求和限制通过 Pod 的 spec.containers.resources 字段设置。以下是一个示例:

yaml
apiVersion: v1
kind: Pod
metadata:
name: resource-demo
spec:
containers:
- name: app-container
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"

示例解析

  • 资源请求
    • memory: "64Mi":容器请求 64 MiB 内存。
    • cpu: "250m":容器请求 0.25 个 CPU 核心。
  • 资源限制
    • memory: "128Mi":容器最多可以使用 128 MiB 内存。
    • cpu: "500m":容器最多可以使用 0.5 个 CPU 核心。
警告

如果没有设置资源限制,容器可能会无限制地使用节点资源,导致其他工作负载受到影响。

实际应用场景

场景 1:确保关键应用获得足够资源

假设您有一个关键应用需要稳定的 CPU 和内存资源。您可以为该应用设置较高的资源请求和限制,以确保它始终获得足够的资源。

yaml
apiVersion: v1
kind: Pod
metadata:
name: critical-app
spec:
containers:
- name: critical-container
image: critical-app-image
resources:
requests:
memory: "512Mi"
cpu: "1000m"
limits:
memory: "1Gi"
cpu: "2000m"

场景 2:限制非关键应用的资源使用

对于非关键应用,您可以设置较低的资源限制,以避免它们占用过多资源。

yaml
apiVersion: v1
kind: Pod
metadata:
name: non-critical-app
spec:
containers:
- name: non-critical-container
image: non-critical-app-image
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"

资源限制的监控与调整

Kubernetes 提供了多种工具来监控资源使用情况,例如 kubectl top 和 Metrics Server。通过这些工具,您可以查看 Pod 和节点的资源使用情况,并根据需要调整资源请求和限制。

bash
# 查看节点的资源使用情况
kubectl top nodes

# 查看 Pod 的资源使用情况
kubectl top pods
提示

定期监控资源使用情况,并根据实际需求调整资源请求和限制,可以提高集群的资源利用率。

总结

Kubernetes 资源限制是确保集群资源合理分配和高效利用的关键机制。通过为容器设置资源请求和限制,您可以确保应用程序获得足够的资源,同时避免资源过度使用。在实际应用中,根据工作负载的重要性和需求,合理设置资源请求和限制,并定期监控和调整资源使用情况。

附加资源

练习

  1. 创建一个 Pod,为其设置 CPU 请求为 500m,内存请求为 256Mi,CPU 限制为 1000m,内存限制为 512Mi
  2. 使用 kubectl top 命令监控该 Pod 的资源使用情况。
  3. 尝试调整资源请求和限制,观察 Pod 的调度和运行情况。