k8s资源限制


Resource Quotas

Resource Quotas 是 Kubernetes 中用于限制命名空间中资源消耗的机制。通过 Resource Quotas,集群管理员可以对命名空间中的资源使用量进行细粒度的控制,从而避免某个命名空间中的资源消耗过多,影响其他命名空间的正常运行。

主要作用

1.限制资源使用:确保命名空间中的 Pod、容器或其他资源不会超过预设的资源限制,避免资源过度消耗。

2.公平分配资源:通过资源限制,确保不同命名空间之间资源的公平分配。

3.防止滥用:防止用户或应用程序滥用资源,从而影响整个集群的稳定性和性能。

主要配置

Resource Quotas 可以限制多种资源类型,包括但不限于:

  • CPU:限制定义的 CPU 使用量。
  • 内存:限制定义的内存使用量。
  • 存储:限制 PersistentVolumeClaims (PVC) 的存储使用量。
  • Pod:限制命名空间中可以创建的 Pod 数量。
  • 容器:限制命名空间中可以创建的容器数量。
  • 配置映射(ConfigMaps):限制命名空间中可以创建的 ConfigMap 数量。
  • 密钥(Secrets):限制命名空间中可以创建的 Secret 数量。

示例 YAML 文件

以下是一个简单的 Resource Quota 配置示例:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-resources
  namespace: default
spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi
    pods: "10"
    configmaps: "5"
    secrets: "5"

解释

  • metadata.name: 资源配额的名称。
  • metadata.namespace: 资源配额应用的命名空间。
  • spec.hard: 定义各种资源的最大限制。
    • requests.cpu: 请求 CPU 的总限制。
    • requests.memory: 请求内存的总限制。
    • limits.cpu: 限制 CPU 的总限制。
    • limits.memory: 限制内存的总限制。
    • pods: 命名空间中允许创建的最大 Pod 数量。
    • configmaps: 命名空间中允许创建的最大 ConfigMap 数量。
    • secrets: 命名空间中允许创建的最大 Secret 数量。

应用和查看

1.创建 Resource Quota

kubectl apply -f resource-quota.yaml

2.查看 Resource Quota

kubectl get resourcequota compute-resources -n default

3.详细信息

kubectl describe resourcequota compute-resources -n default

最佳实践

  1. 合理配置:根据实际需求合理配置资源配额,避免过低或过高的限制。
  2. 监控和调整:定期监控资源使用情况,根据实际使用情况调整配额。
  3. 文档记录:记录资源配额的配置和调整历史,便于团队成员理解和维护。

通过 Resource Quotas,Kubernetes 提供了一种有效的机制来管理和控制资源使用,确保集群的稳定性和性能。

Limit Ranges

Limit Ranges 是 Kubernetes 中用于设置命名空间中默认资源限制的机制。通过 Limit Ranges,集群管理员可以确保在命名空间中的 Pod 和容器在创建时会自动应用默认的资源请求和限制,从而防止资源的过度消耗和滥用。

主要作用

  1. 设置默认资源限制:确保每个 Pod 和容器在创建时都有默认的资源请求和限制。
  2. 防止资源滥用:通过设置最大和最小资源限制,防止用户创建消耗过多资源的 Pod。
  3. 优化资源利用率:合理分配资源,提高集群的整体资源利用率。

配置选项

Limit Ranges 可以配置以下几种类型的限制:

1.容器级别的限制

  • min.cpu:最小 CPU 请求。
  • max.cpu:最大 CPU 请求。
  • min.memory:最小内存请求。
  • max.memory:最大内存请求。
  • default.cpu:默认 CPU 请求。
  • defaultRequest.cpu:默认 CPU 请求。
  • default.memory:默认内存请求。
  • defaultRequest.memory:默认内存请求。

2.Pod 级别的限制

  • maxLimitRequestRatio.cpu:CPU 限制与请求的最大比率。
  • maxLimitRequestRatio.memory:内存限制与请求的最大比率。

示例 YAML 文件

以下是一个 Limit Range 的示例 YAML 文件:

apiVersion: v1
kind: LimitRange
metadata:
  name: example-limitrange
  namespace: my-namespace
spec:
  limits:
  - default:
      cpu: "500m"
      memory: "1Gi"
    defaultRequest:
      cpu: "200m"
      memory: "500Mi"
    max:
      cpu: "1"
      memory: "2Gi"
    min:
      cpu: "100m"
      memory: "200Mi"
    maxLimitRequestRatio:
      cpu: 10
      memory: 5
    type: Container

解释

  • metadata.name: Limit Range 的名称。
  • metadata.namespace: Limit Range 应用的命名空间。
  • spec.limits: 定义各种限制的列表。
    • default: 设置默认的资源请求和限制。
    • defaultRequest: 设置默认的资源请求。
    • max: 设置允许的最大资源请求和限制。
    • min: 设置允许的最小资源请求和限制。
    • maxLimitRequestRatio: 设置资源限制与请求的最大比率。
    • type: 限制的类型,可以是 ContainerPod

应用和查看

1.创建 Limit Range

kubectl apply -f limit-range.yaml

2.查看 Limit Range

kubectl get limitrange example-limitrange -n my-namespace

3.详细信息

kubectl describe limitrange example-limitrange -n my-namespace

最佳实践

1.合理配置:根据实际需求和集群的资源状况,合理设置资源限制。

2.监控和调整:定期监控资源使用情况,根据实际使用情况调整 Limit Range。

3.文档记录:记录 Limit Range 的配置和调整历史,便于团队成员理解和维护。

4.与 Resource Quotas 配合使用:结合 Resource Quotas,确保命名空间中的资源使用在合理的范围内。

通过 Limit Ranges,Kubernetes 提供了一种有效的机制来确保集群中的资源请求和限制合理,从而提高集群的稳定性和资源利用率。

Limit Ranges与Resource Quotas对比

作用范围:

  • Limit Ranges:作用于单个 Pod 或容器的资源请求和限制。
  • Resource Quotas:作用于整个命名空间的总资源消耗。

功能侧重点:

  • Limit Ranges:侧重于设置个体资源的界限,包括默认值、最小值和最大值。
  • Resource Quotas:侧重于控制整个命名空间的资源总量,防止资源耗尽。

配置项:

  • Limit Ranges:包括 default、defaultRequest、min、max、maxLimitRequestRatio 等。
  • Resource Quotas:包括 requests、limits、count/pods、count/services 等。

应用场景:

  • Limit Ranges:适用于需要对 Pod 和容器的资源请求进行标准化和约束的场景。
  • Resource Quotas:适用于需要对命名空间的总资源消耗进行限制和管理的场景。

结合使用

在实际应用中,Limit Ranges 和 Resource Quotas 常常结合使用,以实现更全面的资源管理:

  • Limit Ranges 确保每个 Pod 的资源请求和限制在合理范围内。
  • Resource Quotas 确保整个命名空间的资源总消耗不超过预设的限制。

通过这种组合,可以有效防止个别 Pod 的资源滥用,同时控制整个命名空间的资源消耗,从而保持集群的稳定性和高效性。