k8s资源限制


在Kubernetes中,Namespace的资源限制主要通过两种资源对象实现:

ResourceQuota(资源配额)和LimitRange(限制范围)。它们共同作用于Namespace级别,用于控制资源使用、防止资源滥用,并确保集群资源的合理分配。

1. ResourceQuota(资源配额)

ResourceQuota 用于限制整个Namespace可使用的总资源量对象数量,防止单个Namespace过度占用集群资源。它可以限制的内容包括:

  • 计算资源总量(CPU、内存的请求和限制)
  • 存储资源总量(PVC的存储请求)
  • 可创建的对象数量(如Pod、Service、ConfigMap等)

配置示例(ResourceQuota)

# resource-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: ns-resource-quota
  namespace: my-namespace    # 目标Namespace
spec:
  hard:  # 硬限制(不可突破)
    # 计算资源总限制
    requests.cpu: "1"        # 所有Pod的CPU请求总和≤1核
    requests.memory: "1Gi"   # 所有Pod的内存请求总和≤1Gi
    limits.cpu: "2"          # 所有Pod的CPU限制总和≤2核
    limits.memory: "2Gi"     # 所有Pod的内存限制总和≤2Gi

    # 存储资源限制
    requests.storage: "5Gi"  # 所有PVC的存储请求总和≤5Gi
    persistentvolumeclaims: "3"  # 最多创建3个PVC

    # 对象数量限制
    pods: "10"               # 最多创建10个Pod
    services: "5"            # 最多创建5个Service
    configmaps: "10"         # 最多创建10个ConfigMap

2. LimitRange(限制范围)

LimitRange 用于为Namespace内的单个资源对象(如Pod、Container)设置默认的资源请求(requests)和限制(limits),以及最小/最大值约束。它解决的问题是:

  • 当用户创建Pod时未指定资源配置,自动应用默认值
  • 防止单个Pod/容器请求过小(无法正常运行)或过大(浪费资源)

配置示例(LimitRange)

# limit-range.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: ns-limit-range
  namespace: my-namespace # 目标Namespace
spec:
  limits:
  - type: Container       # 对容器的限制
    default:              # 容器未指定时的默认limits
      cpu: "500m"         # 默认CPU限制:0.5核
      memory: "512Mi"     # 默认内存限制:512Mi
    defaultRequest:       # 容器未指定时的默认requests
      cpu: "100m"         # 默认CPU请求:0.1核
      memory: "128Mi"     # 默认内存请求:128Mi
    min:                  # 容器资源的最小值(不能低于此值)
      cpu: "50m"
      memory: "64Mi"
    max:                  # 容器资源的最大值(不能超过此值)
      cpu: "1000m"
      memory: "1Gi"
  - type: Pod             # 对Pod的限制(所有容器的资源总和)
    max:
      cpu: "2000m"        # 单个Pod的总CPU限制≤2核
      memory: "2Gi"       # 单个Pod的总内存限制≤2Gi

核心概念:资源请求(requests)与限制(limits)

  • requests:容器需要的最小资源量(Kubernetes调度时保证分配)
  • limits:容器允许使用的最大资源量(超出可能被限流或终止)

ResourceQuota 限制的是Namespace内所有对象的requestslimits总和;LimitRange 限制的是单个对象的requestslimits的默认值、最小值和最大值。

使用流程

1.创建目标Namespace:

kubectl create namespace my-namespace

2.应用ResourceQuota:

kubectl apply -f resource-quota.yaml

3.应用LimitRange:

kubectl apply -f limit-range.yaml

4.查看配置:

# 查看资源配额
kubectl get resourcequota -n my-namespace
kubectl describe resourcequota ns-resource-quota -n my-namespace

# 查看限制范围
kubectl get limitrange -n my-namespace
kubectl describe limitrange ns-limit-range -n my-namespace

注意事项

  • 若仅配置ResourceQuota而无LimitRange,用户创建Pod时必须显式指定资源requestslimits,否则会被拒绝(无法满足配额约束)。
  • LimitRange的默认值仅对新创建的对象生效,不影响已存在的对象。
  • 资源限制需根据集群实际容量和业务需求合理配置,避免过松(资源滥用)或过紧(业务无法运行)。

通过这两种机制,可以实现Namespace级别的精细化资源管控,确保Kubernetes集群的稳定性和资源利用率。