Resource Limits

背景

如果将大型应用调度在资源有限的节点中,那么很快就会导致 OOM 或其他情况并导致停机。

“Requests”和“Limit”是我们控制可分配给 Pod 的资源量(CPU 和内存等资源)的两种方式。

  • Request: Guaranteed to get
  • Limit:确保容器不会占用超过特定值的节点资源。

image-20200122194328050

Kubernetes Scheduler 根据Request和Limit决定运行 pod 的理想节点。

如果 POD 需要 8GB RAM,但集群中没有节点具有 8GB RAM,那么它将永远不会被调度。

测试

在container定义下加resources

apiVersion: v1
kind: Pod
metadata:
  name: pod-request
spec:
  containers:
  - name: pod-request
    image: nginx
    resources:
      requests:
        memory: "64Mi"
        cpu: "0.5"
      limits:
        memory: "128Mi"
        cpu: "1"

如果申请的资源超出了node内存或cpu限制,则不会创建成功:

apiVersion: v1
kind: Pod
metadata:
  name: pod-request
spec:
  containers:
  - name: pod-request
    image: nginx
    resources:
      requests:
        memory: "6400Mi"
        cpu: "0.5"
      limits:
        memory: "12800Mi"
        cpu: "1"
Events:
  Type Reason Age From Message
  ---- ------ ---- ---- -------
  Warning FailedScheduling 54s default-scheduler 0/3 nodes are available: 3 Insufficient memory.

使用limit的技巧

可以使用kubectl run -h来查看写法,然后直接生成yaml文件。 image-20200315172736120

然后运行:

kubectl run nginx --image=nginx --dry-run -o yaml -n dev --limits='cpu=200m,memory=512Mi' --requests='cpu=100m,memory=256Mi'

生成yaml文件: image-20200315172848704

multi container场景

如果pod里有多个container,可以为每个container都设置limit和request。

这样pod占用的limit和request是所有container的累加值。

gcp-container-pod-specil8w.PNG

LimitRange

创建 Pod 时,可以给容器分配默认的 CPU 请求和内存。为了使 POD 获取这些默认值,必须首先通过在该命名空间中创建 LimitRange 将这些设置为Request和Limit的默认值。

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-limit-range
spec:
  limits:
  - default:
      cpu: 1
    defaultRequest:
      cpu: 0.5
    type: Container

https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/

资源超出限制的处理

如果POD在运行时超出limit设置的值,分两种情况讨论:

  • 如果cpu超出了设定值,则会throttle。
  • 如果memory超出了设定值,则会terminate,终止掉。