Resource 需求和限制

发布时间: 更新时间: 总字数:735 阅读时间:2m 作者: IP上海 分享 网址

本文分别以 Pod(或容器)/NameSpace 等为维度,介绍资源需求和资源限制。

Pod 资源限制

  • requests: 资源需求的最低保证
  • limits: 资源硬限制(limits>=requests)

资源:

  • CPU:一颗逻辑 CPU

    • 1 CPU = 1000 millicores
    • 500m = 0.5 CPU
  • 内存:

    • 1000 进制:E、P、T、G、M、K
    • 1024 进制:Ei、Pi、Ti、Gi、Mi、Ki
  • QoS 分为以下 3 类(使用 kubectl describe pod | grep -i QoS),用来资源不足时清理 Pod:

    • Guranteed:确保,该类 QoS 的优先级最高,Pod 的每个容器需要同时分别设置 CPU 和内存的 requests 和 limits,且满足如下条件的 Pod 会自动设置为该类 QoS,条件如下:
      • limits.cpus = requests.cpus
      • limits.memory = requests.memroy
    • Burstable:至少有一个容器设置 CPU 或内存资源的 request 属性,中等优先级
    • BestEffort:没有任何一个容器设置 requests 或 limits 属性,最低优先级别
  • QoS 与有很大关系,参考k8s oomkilled 原理

容器内看到的内存为宿主机的,需要借助第三方工具(如 lxcfs)才能显示为限制的值。

帮助

kubectl explain pods.spec.containers.resources.[limits|requests]

示例

  • pod-resource.yaml
apiVersion: v1
kind: Pod
metadata:
  name: stress-demo
  labels:
    app: hestress
spec:
  containers:
  - name: hestress
    image: gcmirrors/stress:v1
    resources:
      requests:
        memory: "64Mi"
        cpu: "200m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  • 执行
$ kubectl apply -f pod-resource.yaml
pod/stress-demo created

LimitRange

以命名空间限制资源配置访问管理

  • 在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制。

  • 在一个命名空间中实施对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限制。

  • 在一个命名空间中实施对一种资源的申请值和限制值的比值的控制。

  • 设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个 Container 中。

  • limit-range.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: test-lr
----
apiVersion: v1
kind: LimitRange
metadata:
  name: test-lr
  namespace: test-lr-ns
spec:
  limits:
  - max:
      cpu: "1"
      memory: 1Gi
    min:
      cpu: 100m
      memory: 10Mi
    maxLimitRequestRatio:
      cpu: 3
      memory: 4
    type: Pod
  - default:
      cpu: 300m
      memory: 200Mi
    defaultRequest:
      cpu: 200m
      memory: 100Mi
    max:
      cpu: "2"
      memory: 1Gi
    min:
      cpu: 100m
      memory: 10Mi
    maxLimitRequestRatio:
      cpu: 5
      memory: 4
    type: Container

ResourceQuota

限定单个 namespace 中可使用集群资源的总量

  • 计算资源限制
    • limits.cpu
    • limits.memory
    • requests.cpu
    • requests.memory
  • 存储资源
    • requests.storage
    • persistentvolumeclaims
    • .storageclass.storage.k8s.io/requests.storage
    • .storageclass.storage.k8s.io/persistentvolumeclaims
    • requests.ephemeral-storage
    • limits.ephemeral-storage
$ kubectl create namespace test
$ cat quota-test.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: quota-test
  namespace: test
spec:
  hard:
    requests:
      cpu: "20"
      memory: 20Gi
    limits:
      cpu: "40"
      memory: 40Gi
    requests.nvidia.com/gpu: 10
    pods: "10"
    services: "10"
$ kubectl apply -f quota-test.yaml
$ kubectl get quota -n test
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数