gpt4 book ai didi

kubernetes - 在 Kubernetes 中的 LimitRanger 之前为 Pod 应用资源配额,没有指定限制

转载 作者:行者123 更新时间:2023-12-03 08:43:21 27 4
gpt4 key购买 nike

使用 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 时,它将不会被创建。资源配额将导致以下错误:

来自服务器的错误(禁止):创建“test-pod.yml”时出错:pod“test-pod”被禁止:配额失败:mem-cpu-demo:必须指定limits.cpu

换句话说,资源配额在 LimitRanger 之前应用,因此它不允许我创建没有指定限制的 pod。

有没有办法先强制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

  • 根据 ResourceQuota Docs,您没有设置 CPU 的默认限制。 :

    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 在容器运行时注入(inject)默认值,是的,它在 ResourceQuota 验证之前注入(inject)默认值。

  • 我发现的另一个小问题是,并非所有 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 是使用强制的 limitRange 创建的。

如果您有任何问题,请在评论中告诉我。

关于kubernetes - 在 Kubernetes 中的 LimitRanger 之前为 Pod 应用资源配额,没有指定限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62190478/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com