在 Kubernetes 的 LimitRanger 之前为 Pod 应用的资源配额没有指定限制
Resource Quota applied before LimitRanger in Kubernetes for Pod without specified limits
在使用 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:
- 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 获取了限制值。
一切都很好!
当我尝试为命名空间强制执行资源配额时出现问题。
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" is forbidden: failed quota: mem-cpu-演示:必须指定 limits.cpu
换句话说,资源配额在 LimitRanger 之前应用,所以它不允许我在没有指定限制的情况下创建 pods。
有没有办法先执行 LimitRanger,然后再执行 ResourceQuota?
你如何将它们应用到你的命名空间?
我希望没有在 pod 定义中指定限制的开发人员能够在强制执行资源配额的同时获取默认值。
TL;DR:
Error from server (Forbidden): error when creating "test-pod.yml": pods "test-pod" is forbidden: failed quota: mem-cpu-demo: must specify limits.cpu
您没有为 CPU 设置默认限制,根据 ResourceQuota Docs:
If quota is enabled in a namespace for compute resources like cpu and memory, users must specify requests or limits for those values; otherwise, the quota system may reject pod creation.
这就是没有创建 pod 的原因。添加一个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
limitRanger 在容器运行时注入默认值,是的,它在 ResourceQuota 验证之前注入默认值。
我发现的其他小问题是,并非所有 yaml 都包含元数据下的 namespace: test
行,这对于将资源分配给正确的命名空间很重要,我将其修复在下面的示例。
复制:
- 创建命名空间,首先应用内存限制和配额,如您所述:
$ 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 -
- 现在,如果我尝试创建 pod:
$ 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
- 您遇到了同样的错误,因为没有设置 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 -
- 现在使用 cpu limitRange,让我们创建 pod 并检查它:
$ 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
- 我们的 pod 是使用强制限制范围创建的。
如果您有任何问题,请在评论中告诉我。
在使用 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:
- 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 获取了限制值。 一切都很好!
当我尝试为命名空间强制执行资源配额时出现问题。 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" is forbidden: failed quota: mem-cpu-演示:必须指定 limits.cpu
换句话说,资源配额在 LimitRanger 之前应用,所以它不允许我在没有指定限制的情况下创建 pods。
有没有办法先执行 LimitRanger,然后再执行 ResourceQuota? 你如何将它们应用到你的命名空间?
我希望没有在 pod 定义中指定限制的开发人员能够在强制执行资源配额的同时获取默认值。
TL;DR:
Error from server (Forbidden): error when creating "test-pod.yml": pods "test-pod" is forbidden: failed quota: mem-cpu-demo: must specify limits.cpu
您没有为 CPU 设置默认限制,根据 ResourceQuota Docs:
If quota is enabled in a namespace for compute resources like cpu and memory, users must specify requests or limits for those values; otherwise, the quota system may reject pod creation.
这就是没有创建 pod 的原因。添加一个
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
limitRanger 在容器运行时注入默认值,是的,它在 ResourceQuota 验证之前注入默认值。
我发现的其他小问题是,并非所有 yaml 都包含元数据下的
namespace: test
行,这对于将资源分配给正确的命名空间很重要,我将其修复在下面的示例。
复制:
- 创建命名空间,首先应用内存限制和配额,如您所述:
$ 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 -
- 现在,如果我尝试创建 pod:
$ 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
- 您遇到了同样的错误,因为没有设置 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 -
- 现在使用 cpu limitRange,让我们创建 pod 并检查它:
$ 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
- 我们的 pod 是使用强制限制范围创建的。
如果您有任何问题,请在评论中告诉我。