0%

k8s资源限制【针对namespace、pod、Container】

综述

K8s中对资源的限制分以下情况:

  • namespace中容器、pod等使用总和限制
ResourceQuota
  • namespace中容器、pod等使用单独限制:
LimitRange

创建一个namespace用于测试

kubectl create namespace quota-mem-cpu-example

创建一个ResourceQuota

创建一个ResourceQuotanamespace中资源使用总和做限制,创建quota-mem-cpu.yaml

资源配额的类型

  1. 计算资源,包括cpumemory
    • cpu, limits.cpu, requests.cpu
    • memory, limits.memory, requests.memory
  2. 存储资源,包括存储资源的总量以及指定storage class的总量
    • requests.storage:存储资源总量,如500Gi
    • persistentvolumeclaimspvc的个数
    • storageclass.storage.k8s.io/requests.storage
    • storageclass.storage.k8s.io/persistentvolumeclaims
  3. 对象数,即可创建的对象的个数
    • pods, replicationcontrollers, configmaps, secrets
    • resourcequotas, persistentvolumeclaims
    • services, services.loadbalancers, services.nodeports

示例1:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: object-counts
spec:
  hard:
    pods: "4"
    configmaps: "10"
    persistentvolumeclaims: "4"
    replicationcontrollers: "20"
    secrets: "10"
    services: "10"
    services.loadbalancers: "2"

示例2:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-demo
spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi
kubectl create -f quota-mem-cpu.yaml --namespace=quota-mem-cpu-example

查看 ResourceQuota 详情:

kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml

ResourceQuotaquota-mem-cpu-example 命名空间中设置了如下要求:

  • 每个容器必须有内存请求和限制,以及 CPU 请求和限制。
  • 所有容器的内存请求总和不能超过1 GiB
  • 所有容器的内存限制总和不能超过2 GiB
  • 所有容器的 CPU 请求总和不能超过1 cpu
  • 所有容器的 CPU 限制总和不能超过2 cpu

创建一个LimitRange

创建一个LimitRange,对namespacepod、容器设置单独的默认限制

创建limits.yaml

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:  # default limit
      memory: 512Mi
      cpu: 2
    defaultRequest:  # default request
      memory: 256Mi
      cpu: 0.5
    max:  # max limit
      memory: 800Mi
      cpu: 3
    min:  # min request
      memory: 100Mi
      cpu: 0.3
    maxLimitRequestRatio:  # max value for limit / request
      memory: 2
      cpu: 2
    type: Container # limit type, support: Container / Pod / PersistentVolumeClaim
kubectl create -f limits.yaml --namespace=limit-example

查看一下在该 Namespace 中被强加的限制

kubectl describe limits mylimits --namespace=limit-example

CPU和内存的单位

  • CPU的测量单位是cpus,允许分数值。你可以使用前缀m来表示mili(千分之一)。例如100mcpu就是100 milicpu,等价于0.1CPU
  • 内存的测量单位是字节。你可以使用纯整数来表示内存,也可以使用一些前缀:E, P, T, G, M, K, Ei, Pi, Ti, Gi, Mi, Ki.

创建pod时,指定资源限制

apiVersion: v1
kind: Pod
metadata:
  name: quota-mem-cpu-demo
spec:
  containers:
  - name: quota-mem-cpu-demo-ctr
    image: nginx
    resources:
      limits:
        memory: "800Mi"
        cpu: "800m" 
      requests:
        memory: "600Mi"
        cpu: "400m"