一个 Kubernetes 集群可被划分为多个命名空间。 如果你在具有默认内存限制的命名空间内尝试创建一个 Pod,并且这个 Pod 中的容器没有声明自己的内存资源限制, 那么控制面会为该容器设定默认的内存限制。
创建namespace
[root@master ~]# kubectl create namespace default-mem-example
namespace/default-mem-example created
[root@master pod]# kubectl get namespace default-mem-example
NAME STATUS AGE
default-mem-example Active 14m
[root@master pod]#
namespace
创建内存LimitRange
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
namespace: default-mem-example
spec:
limits:
- default:
memory: 512Mi
defaultRequest:
memory: 256Mi
type: Container
namespace
详细信息[root@master pod]# kubectl apply -f memory-defaults.yaml
limitrange/mem-limit-range created
[root@master pod]#
[root@master pod]# kubectl describe namespace default-mem-example
Name: default-mem-example
Labels: kubernetes.io/metadata.name=default-mem-example
Annotations:
Status: Active
No resource quota.
Resource Limits
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container memory - - 256Mi 512Mi -
[root@master pod]#
apiVersion: v1
kind: Pod
metadata:
name: default-mem-demo
namespace: default-mem-example
spec:
containers:
- name: default-mem-demo-ctr
image: nginx
kubectl describe -n default-mem-example pods default-mem-demo
## 输出内容显示该 Pod 的容器有 256 MiB 的内存请求和 512 MiB 的内存限制。 这些都是 LimitRange 设置的默认值。
containers:
- image: nginx
imagePullPolicy: Always
name: default-mem-demo-ctr
resources:
limits:
memory: 512Mi
requests:
memory: 256Mi
说明:
LimitRange
不会检查它应用的默认值的一致性。 这意味着LimitRange
设置的 limit 的默认值可能小于客户端提交给 API 服务器的声明中为容器指定的 request 值。如果发生这种情况,最终会导致 Pod 无法调度。
如果你的命名空间设置了内存 资源配额, 那么为内存限制设置一个默认值会很有帮助。 以下是内存资源配额对命名空间的施加的三条限制:
当你添加 LimitRange
时:
如果该命名空间中的任何 Pod 的容器未指定内存限制, 控制面将默认内存限制应用于该容器, 这样 Pod 可以在受到内存 ResourceQuota
限制的命名空间中运行。
- 以下为
LimitRange
的示例清单。 清单中声明了默认 CPU 请求和默认 CPU 限制。
[root@master ~]# kubectl create namespace default-cpu-example
namespace/default-cpu-example created
[root@master pod]# kubectl get namespace default-cpu-example
NAME STATUS AGE
default-cpu-example Active 14m
[root@master pod]#
namespace
创建CPU的LimitRange
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-limit-range
namespace: default-cpu-example
spec:
limits:
- default:
cpu: 1
defaultRequest:
cpu: 0.5
type: Container
namespace
详细信息kubectl get pod default-cpu-demo --output=yaml --namespace=default-cpu-example
## 输出显示该 Pod 的唯一的容器有 500m cpu 的 CPU 请求和 1 cpu 的 CPU 限制。 这些是 LimitRange 声明的默认值。
containers:
- image: nginx
imagePullPolicy: Always
name: default-cpu-demo-ctr
resources:
limits:
cpu: "1"
requests:
cpu: 500m
如果你的命名空间设置了 CPU 资源配额, 为 CPU 限制设置一个默认值会很有帮助。 以下是 CPU 资源配额对命名空间的施加的两条限制:
预留给命名空间中所有 Pod 使用的 CPU 总量不能超过规定的限制。
当你添加LimitRange
时:
如果该命名空间中的任何 Pod 的容器未指定 CPU 限制, 控制面将默认 CPU 限制应用于该容器, 这样 Pod 可以在受到 CPU ResourceQuota
限制的命名空间中运行。
namespace
kubectl create namespace default-mem-example
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
namespace: default-mem-example
spec:
limits:
- default:
memory: 512Mi
defaultRequest:
memory: 256Mi
max:
memory: 1Gi
min:
memory: 200Mi
type: Container
[root@master pod]# kubectl describe namespace default-mem-example
Name: default-mem-example
Labels: kubernetes.io/metadata.name=default-mem-example
Annotations:
Status: Active
No resource quota.
Resource Limits
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container memory 200Mi 1Gi 256Mi 512Mi -
现在,每当在
default-mem-example
命名空间中创建 Pod 时,Kubernetes
就会执行下面的步骤:
- 如果 Pod 中的任何容器未声明自己的内存请求和限制,控制面将为该容器设置默认的内存请求和限制。
- 确保该 Pod 中的每个容器的内存请求至少
200MiB。
- 确保该 Pod 中每个容器内存请求不大于
1 GiB。
LimitRange
获取默认的内存请求和限制 应用于容器
LimitRange
为命名空间设定的最小和最大内存限制只有在 Pod 创建和更新时才会强制执行。
namespace
kubectl create namespace default-mem-example
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
namespace: default-mem-example
spec:
limits:
- default:
cpu: 1
defaultRequest:
cpu: 0.8
max:
cpu: 2
min:
cpu: 0.6
type: Container
[root@master pod]# kubectl describe namespace default-mem-example
Name: default-mem-example
Labels: kubernetes.io/metadata.name=default-mem-example
Annotations:
Status: Active
No resource quota.
Resource Limits
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container cpu 600m 2 800m 1 -
[root@master pod]#
现在,每当你在
default-mem-example
命名空间中创建 Pod 时,或者某些其他的Kubernetes API
客户端创建了等价的 Pod 时,Kubernetes
就会执行下面的步骤:
- 如果 Pod 中的任何容器未声明自己的 CPU 请求和限制,控制面将为该容器设置默认的 CPU 请求和限制。
- 确保该 Pod 中的每个容器的 CPU 请求至少 600 millicpu。
- 确保该 Pod 中每个容器 CPU 请求不大于 2 gcpu。
只有当 Pod 创建或者更新时,
LimitRange
为命名空间规定的 CPU 最小和最大限制才会被强制执行。 如果你对 LimitRange 进行修改,那不会影响此前创建的 Pod。
为命名空间下运行的所有 Pod 设置总的内存和 CPU 配额。你可以通过使用
ResourceQuota
对象设置配额.
kubectl create namespace quota-mem-cpu-example
ResourceQuota
的示例清单apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
ResourceQuota
在uota-mem-cpu-example
命名空间中设置了如下要求:
- 在该命名空间中的每个 Pod 的所有容器都必须要有内存请求和限制,以及 CPU 请求和限制。
- 在该命名空间中所有 Pod 的内存请求总和不能超过 1 GiB。
- 在该命名空间中所有 Pod 的内存限制总和不能超过 2 GiB。
- 在该命名空间中所有 Pod 的 CPU 请求总和不能超过 1 cpu。
- 在该命名空间中所有 Pod 的 CPU 限制总和不能超过 2 cpu。
注意:是namespace下所有pod资源的总和
- Pod配额是配置pod中容器的副本数
- 即使 Deployment 指定了三个副本, 也只有两个 Pod 被创建,原因是之前已经定义了配额
apiVersion: v1
kind: ResourceQuota
metadata:
name: pod-demo
spec:
hard:
pods: "2"
以下是配置命名空间的cpu和内存的默认值,以及最大,最小值
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
namespace: default-mem-example
spec:
limits:
- default:
memory: 512Mi
cpu: 1
defaultRequest:
memory: 256Mi
cpu: 0.8
max:
memory: 1Gi
cpu: 2
min:
memory: 200Mi
cpu: 0.6
type: Container
[root@master pod]# kubectl describe namespace default-mem-example
Name: default-mem-example
Labels: kubernetes.io/metadata.name=default-mem-example
Annotations:
Status: Active
No resource quota.
Resource Limits
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container cpu 600m 2 800m 1 -
Container memory 200Mi 1Gi 256Mi 512Mi -
[root@master pod]#
pod中的容器不指定cpu,内存的限制和请求时
,将使用命名空间设置的默认值;pod中的容器只设置cpu或者内存的请求时
,容器的 CPU 和内存的限制被设置为命名空间的默认 CPU CPU 和内存限制值;pod中的容器只设置cpu或者内存的限制时
,容器的 CPU 与内存请求,和 ,CPU 与内存限制设置相同;- 命令空间的配额限制的是该空间中所有pod资源的总和不能超过配额;