在Kubernetes中LimitRanger之前为无指定限制的Pod应用的资源配额
在使用Kubernetes v1.16.8时,ResourceQuota和LimitRanger都是默认启用的,我不必将它们添加到kube apiserver中的准入插件中。 在我的例子中,我使用以下LimitRanger在Kubernetes中LimitRanger之前为无指定限制的Pod应用的资源配额,kubernetes,limit,Kubernetes,Limit,在使用Kubernetes v1.16.8时,ResourceQuota和LimitRanger都是默认启用的,我不必将它们添加到kube apiserver中的准入插件中。 在我的例子中,我使用以下LimitRanger apiVersion: v1 items: - apiVersion: v1 kind: LimitRange metadata: name: mem-limit-range namespace: test spec: limits:
apiVersion: v1
items:
- apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
namespace: test
spec:
limits:
- default:
memory: 512Mi
defaultRequest:
memory: 256Mi
type: Container
并且,它在没有指定限制的新Pod中添加了默认的内存使用限制,正如预期的那样。Pod的定义尽可能简单:
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-pod-ctr
image: redis
当我得到所描述的创建的pod时,它已经从LimitRanger获得了limit的值。
一切都很好
当我尝试为名称空间强制执行resourcequota时,就会出现问题。
ResourceQuota如下所示:
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
limits.cpu: "2"
limits.memory: 2Gi
当我删除并重新创建pod时,它将不会被创建。
resourcequota将导致以下错误:
服务器错误(禁止):创建“test pod.yml”时出错:pods“test pod”被禁止:配额失败:mem cpu演示:必须指定限制。cpu
换句话说,resourcequota在LimitRanger之前应用,因此它不允许我创建没有指定限制的POD。
有没有办法先执行LimitRanger,然后再执行ResourceQuota?
如何将它们应用于名称空间
我希望没有在pod定义中指定限制的开发人员能够在强制执行资源配额的同时获得默认值;博士: 服务器错误(禁止):创建“test pod.yml”时出错:pods“test pod”被禁止:配额失败:mem cpu demo:必须指定限制。cpu
- 您没有设置CPU的默认限制,根据: 如果在计算资源(如cpu和内存)的命名空间中启用了配额,则用户必须为这些值指定请求或限制否则,配额系统可能会拒绝pod创建
- 这就是为什么没有创建pod。添加
:cpu限制。yaml
- limitRanger在容器运行时注入默认值,是的,它在ResourceQuota验证之前注入默认值
- 我发现的另一个小问题是,并非所有YAML都包含元数据下的
行,这对于将资源分配到正确的名称空间很重要,我在下面的示例中修复了它名称空间:test
- 创建名称空间,首先应用mem限制和配额,如您所述:
- 现在,如果我尝试创建pod:
- 和您遇到的错误相同,因为CPU设置没有默认限制。我们将创建并应用它:
- 现在,随着cpu limitRange的运行,让我们创建pod并检查它:
- 我们的吊舱是用强制限制范围创建的
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-limit-range
namespace: test
spec:
limits:
- default:
cpu: 1
defaultRequest:
cpu: 0.5
type: Container
$ kubectl create namespace test
namespace/test created
$ cat mem-limit.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
namespace: test
spec:
limits:
- default:
memory: 512Mi
defaultRequest:
memory: 256Mi
type: Container
$ cat quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
namespace: test
spec:
hard:
limits.cpu: "2"
limits.memory: 2Gi
$ kubectl apply -f mem-limit.yaml
limitrange/mem-limit-range created
$ kubectl apply -f quota.yaml
resourcequota/mem-cpu-demo created
$ kubectl describe resourcequota -n test
Name: mem-cpu-demo
Namespace: test
Resource Used Hard
-------- ---- ----
limits.cpu 0 2
limits.memory 0 2Gi
$ kubectl describe limits -n test
Name: mem-limit-range
Namespace: test
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container memory - - 256Mi 512Mi -
$ cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pod
namespace: test
spec:
containers:
- name: test-pod-ctr
image: redis
$ kubectl apply -f pod.yaml
Error from server (Forbidden): error when creating "pod.yaml": pods "test-pod" is forbidden: failed quota: mem-cpu-demo: must specify limits.cpu
$ cat cpu-limit.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-limit-range
namespace: test
spec:
limits:
- default:
cpu: 1
defaultRequest:
cpu: 0.5
type: Container
$ kubectl apply -f cpu-limit.yaml
limitrange/cpu-limit-range created
$ kubectl describe limits cpu-limit-range -n test
Name: cpu-limit-range
Namespace: test
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container cpu - - 500m 1 -
$ kubectl apply -f pod.yaml
pod/test-pod created
$ kubectl describe pod test-pod -n test
Name: test-pod
Namespace: test
Status: Running
...{{Suppressed output}}...
Limits:
cpu: 1
memory: 512Mi
Requests:
cpu: 500m
memory: 256Mi