如果将大型应用调度在资源有限的节点中,那么很快就会导致 OOM 或其他情况并导致停机。
“Requests”和“Limit”是我们控制可分配给 Pod 的资源量(CPU 和内存等资源)的两种方式。
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.
可以使用kubectl run -h
来查看写法,然后直接生成yaml文件。
然后运行:
kubectl run nginx --image=nginx --dry-run -o yaml -n dev --limits='cpu=200m,memory=512Mi' --requests='cpu=100m,memory=256Mi'
生成yaml文件:
如果pod里有多个container,可以为每个container都设置limit和request。
这样pod占用的limit和request是所有container的累加值。
创建 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设置的值,分两种情况讨论: