在这个例子中,我们将为命名空间创建资源约束。这些约束本质上是容器可以在资源请求和限制中使用的最小和最大资源量。让我们看看它是如何工作的!
与前面的例子一样,首先创建名称空间:
kubectl create namespace resource-constraints-demo
namespace "resource-constraints-demo" created
接下来,我们将为这个名称空间创建一个限制范围:
apiVersion: v1
kind: LimitRange
metadata: name: resource-constraints-lr
spec: limits:
- max:
memory: 1Gi
cpu: 0.8
min:
memory: 500Mi
cpu: 0.3
type: Container
保存 LimitRange 为 limit-range-2.yaml 并创建它:
kubectl create -f limit-range-2.yaml --namespace resource-constraints-demo
limitrange "resource-constraints-lr" created
在创建了限制范围之后,让我们看看我们的最小和最大资源约束是否应用于名称空间:
kubectl get limitrange resource-constraints-lr --namespace resource-constraints-demo --output=yaml
响应如下:
spec:
limits:
- default:
cpu: 800m
memory: 1Gi
defaultRequest:
cpu: 800m
memory: 1Gi
max:
cpu: 800m
memory: 1Gi
min:
cpu: 300m
memory: 500Mi
type: Container
正如你所看到的,你的名称空间的默认资源请求和限制被自动设置为在 LimitRange 内指定的最大资源约束。现在,当我们在 resource-constraints-demo 名称空间中创建容器时,下面的规则将自动应用:
如果容器没有指定它的资源请求和限制,则应用默认的资源请求和限制。
名称空间中的所有容器都需要有大于或等于3亿的资源请求,用于CPU和500 Mi内存。
名称空间中的所有容器都需要资源限制小于或等于8亿,用于CPU和1 Gi内存。
让我们创建一个pod来说明如何将名称空间资源约束应用到容器中:
apiVersion: v1
kind: Pod
metadata:
name: resource-constraints-pod
spec:
containers:
- name: resource-constraints-ctr
image: httpd:2.4
resources:
limits:
memory: "900Mi"
cpu: 0.7
requests:
memory: "600Mi"
cpu: 0.4
该规范请求600 Mi RAM和0.4 CPU,并为这个pod中的httpd容器设置900 Mi RAM和0.7 CPU的限制。这些资源需求满足了名称空间的最小和最大约束。
我们保存为 default-resources-demo-pod-3.yaml 并在我们的名称空间中创建pod:
kubectl create -f resource-constraints-pod.yaml --namespace resource-constraints-demo
pod "resource-constraints-pod" created
接下来,检查分配给pod中的容器的资源:
kubectl get pod resource-constraints-pod --namespace resource-constraints-demo --output=yaml
你应该得到以下输出:
containers:
- image: httpd:2.4
imagePullPolicy: IfNotPresent
name: resource-constraints-ctr
resources:
limits:
cpu: 700m
memory: 900Mi
requests:
cpu: 400m
memory: 600Mi
之所以成功创建pod,是因为容器的请求和限制在名称空间的最小和最大约束范围内。
现在,让我们看看如果我们指定的请求和限制超出了为名称空间定义的最小值和最大值,会发生什么。让我们用新的请求和限制来创建一个新的pod:
apiVersion: v1
kind: Pod
metadata:
name: resource-constraints-pod-2
spec:
containers:
- name: resource-constraints-ctr-2
image: httpd:2.4
resources:
limits:
memory: "1200Mi"
cpu: 1.2
requests:
memory: "200Mi"
cpu: 0.2
我们保存为 resource-constraints-pod-2.yaml 并在我们的名称空间中创建pod:
kubectl create -f resource-constraints-pod-2.yaml --namespace resource-constraints-demo
pod "resource-constraints-pod-2" created
由于资源请求低于最小 LimitRange 的值,并且资源限制超出了这个名称空间的最大值,所以pod不会像预期的那样被创建:
Error from server (Forbidden): error when creating "resource-constraints-pod-2.yaml": pods "resource-constraints-pod-2" is forbidden: [minimum memory usage per Container is 500Mi, but request is 200Mi., minimum cpu usage per Container is 300m, but request is 200m., maximum cpu usage per Container is 800m, but limit is 1200m., maximum memory usage per Container is 1Gi, but limit is 1200Mi.]
清理
删除名称空间:
kubectl delete namespace resource-constraints-demo
namespace "resource-constraints-demo" deleted
在本篇文章中,我们将向大家展示了为名称空间设置最小和最大资源约束。后续系列文章将会继续展示:为名称空间中的所有容器设置资源配额。