官网:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-memory-resource/
官网:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-cpu-resource/
在 K8s 中对于容器资源主要分为以下两类,都可以对容器的内存和 CPU 进行限制:
- 请求资源(request):可以使用的基础资源
- 限制资源(limit):可以使用的最大资源,超过最大资源之后容器会被杀死,限制资源一定大于等于请求资源
内存资源限制
为容器指定内存请求,请在容器资源清单中包含 resources:requests
字段。同理,要指定内存限制,请包含 resources:limits
。
apiVersion: v1 kind: Pod metadata: name: nginx-memory-demo spec: containers: - name: nginx-memory-demo image: nginx:1.19 resources: requests: memory: "100Mi" limits: memory: "200Mi"
内存资源的基本单位是字节(byte)。你可以使用这些后缀之一,将内存表示为纯整数或定点整数:
- Ei(EB):2^60字节
- Pi(PB):2^50字节
- Ti(TB):2^40字节
- Gi(GB):2^30字节
- Mi(MB):2^20字节
- Ki(KB):2^10字节
示例中的 100Mi
即表示 100 兆字节。
内存请求和限制的目的
通过为集群中运行的容器配置内存请求和限制,你可以有效利用集群节点上可用的内存资源。通过将 Pod 的内存请求保持在较低水平,你可以更好地安排 Pod 调度。通过让内存限制大于内存请求,你可以完成两件事:
- Pod 可以进行一些突发活动,从而更好的利用可用内存。
- Pod 在突发活动期间,可使用的内存被限制为合理的数量。
没有指定内存限制
如果你没有为一个容器指定内存限制,则自动遵循以下情况之一:
- 容器可无限制地使用内存。容器可以使用其所在节点所有的可用内存,进而可能导致该节点调用 OOM Killer。此外,如果发生 OOM Kill,没有资源限制的容器将被杀掉的可行性更大。
- 运行的容器所在命名空间有默认的内存限制,那么该容器会被自动分配默认限制。
如果只设置了限制但未设置请求
如果容器设置了内存限制值但未设置内存请求值,Kubernetes 也会为其设置与内存限制值相同的内存请求。即 requests = limits。
CPU资源限制
为容器指定 CPU 请求,请在容器资源清单中包含 resources:requests
字段。要指定 CPU 限制,请包含resources:limits
。
apiVersion: v1 kind: Pod metadata: name: nginx-cpu-demo spec: containers: - name: nginx-cpu-demo image: nginx:1.19 resources: limits: cpu: "1" requests: cpu: "0.5"
CPU 资源以 CPU 单位度量。小数值是可以使用的。一个请求 0.5 CPU 的容器保证会获得请求 1 个 CPU 的容器的 CPU 的一半。你可以使用后缀 m 表示毫。例如 100m CPU、100 milliCPU 和 0.1 CPU 都相同。CPU 请求只能使用绝对数量,而不是相对数量。0.1 在单核、双核或 48 核计算机上的 CPU 数量值是一样的。
CPU 请求和限制的初衷
通过配置你的集群中运行的容器的 CPU 请求和限制,你可以有效利用集群上可用的 CPU 资源。通过将 Pod CPU 请求保持在较低水平,可以使 Pod 更有机会被调度。通过使 CPU 限制大于 CPU 请求,你可以完成两件事:
- Pod 可能会有突发性的活动,它可以利用碰巧可用的 CPU 资源。
- Pod 在突发负载期间可以使用的 CPU 资源数量仍被限制为合理的数量。
如果不指定 CPU 限制
如果你没有为容器指定 CPU 限制,则会发生以下情况之一:
- 容器在可以使用的 CPU 资源上没有上限。因而可以使用所在节点上所有的可用 CPU 资源。
- 容器在具有默认 CPU 限制的名字空间中运行,系统会自动为容器设置默认限制。
如果只设置了限制但未设置请求
如果你为容器指定了 CPU 限制值但未为其设置 CPU 请求,Kubernetes 会自动为其设置与 CPU 限制相同的 CPU 请求值。即 requests = limits。
注意:容器的 CPU 可能会超出限制一点点!但是不会被杀死