文章目录
- 一、ResourceQuota准入控制器
- 1、ResourceQuota是什么?
- 2、限制CPU、内存、Pod数量、Deployment数量
- 3、限制存储空间大小
 
- 二、LimitRanger准入控制器
- 1、LimitRanger是什么?
- 2、LimitRanger限制案例
 
 
一、ResourceQuota准入控制器
中文官方参考文档:
1、ResourceQuota是什么?
ResourceQuota准入控制器是K8S中内置的准入控制器,默认该控制器是启用状态,主要功能是限制名称空间下的资源使用,防止在一个名称空间下的Pod占用过多的资源,简单理解就是针对名称空间限制用户资源的使用。
2、限制CPU、内存、Pod数量、Deployment数量
第一步:创建 test 名称空间,针对这个名称空间做限制
kubectl create ns test
第二步:创建resourcequota资源限制CPU、内存、Pod数量、Deployment数量
cat resourcequota.yaml 
---
apiVersion: v1
kind: ResourceQuota
metadata: 
  name: resourcequota-demo
  namespace: test            # 针对test名称空间限制
spec:
  hard:
    pods: "6"                # 限制Pod数量
    requests.cpu: "2"        # 限制CPU请求
    requests.memory: 2Gi     # 限制内存请求
    limits.cpu: "4"          # 限制CPU使用
    limits.memory: 10Gi      # 限制内存使用
    count/deployments.apps: "10"  # 限制deployments数量
    persistentvolumeclaims: "10"  # 限制PVC数量
参数解释:
| 资源名称 | 描述 | 
|---|---|
| limits.cpu | 所有非终止状态的 Pod,其 CPU 限额总量不能超过该值。 | 
| limits.memory | 所有非终止状态的 Pod,其内存限额总量不能超过该值。 | 
| requests.cpu | 所有非终止状态的 Pod,其 CPU 需求总量不能超过该值。 | 
| requests.memory | 所有非终止状态的 Pod,其内存需求总量不能超过该值。 | 
| hugepages-<size> | 对于所有非终止状态的 Pod,针对指定尺寸的巨页请求总数不能超过此值。 | 
| cpu | 与 requests.cpu相同。 | 
| memory | 与 requests.memory相同。 | 
第三步:查看test名称空间限制信息
kubectl describe quota -n test
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TOPEINXn-1689485141312)(D:\MD归档文档\IMG\image-20230716113435632.png)]](https://img-blog.csdnimg.cn/619b0d476d714862948236b5a4914dd6.png)
3、限制存储空间大小
第一步:创建resourcequota资源限制存储空间大小
cat resourcequota-2.yaml 
---
apiVersion: v1
kind: ResourceQuota
metadata: 
  name: resourcequota-demo
  namespace: test            # 针对test名称空间限制
spec:
  hard:
    requests.storage: "5Gi"              # 限制存储总容量
    persistentvolumeclaims: "5"          # 限制pvc总数
    requests.ephemeral-storage: "1Gi"    # 限制使用本地临时存储的下限总容量
    limits.ephemeral-storage: "2Gi"      # 限制使用本地临时存储上限总容量 
参数解释:
| 资源名称 | 描述 | 
|---|---|
| requests.storage | 所有 PVC,存储资源的需求总量不能超过该值。 | 
| persistentvolumeclaims | 在该命名空间中所允许的 PVC 总量。 | 
| requests.ephemeral-storage | 在命名空间的所有 Pod 中,本地临时存储请求的总和不能超过此值 | 
| limits.ephemeral-storage | 在命名空间的所有 Pod 中,本地临时存储限制值的总和不能超过此值。 | 
第二步:验证
kubectl describe quota -n test
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-asiKagsR-1689485141313)(D:\MD归档文档\IMG\image-20230716115334720.png)]](https://img-blog.csdnimg.cn/bb38d558ebe34eef8ae63fe03148d215.png)
二、LimitRanger准入控制器
1、LimitRanger是什么?
LimitRanger准入控制器是Kubernetes的一种资源配额管理机制,用于限制Pod的资源使用情况。它主要用于以下几个方面:
-  设置容器的资源限制:LimitRanger可以强制要求每个Pod或容器设置资源限制,例如CPU使用量和内存使用量。这有助于避免某个Pod或容器过度消耗集群资源,导致其他应用程序受影响。 
-  强制执行资源限制:LimitRanger可以确保Pod或容器只使用指定的资源限制,通过对Pod的准入控制来强制执行这些限制。如果没有设置资源限制,在高负载情况下,一个应用程序可能消耗过多的资源,从而影响其他应用程序的稳定性。 
-  配额管理:LimitRanger可以与Kubernetes的配额管理机制一起使用,实现更精细的资源管理。通过设置配额限制,可以控制每个命名空间可用的资源总量,以及每个命名空间中每种资源的使用情况。 
总的来说,LimitRanger准入控制器有助于确保资源的合理使用和分配,提高集群的可靠性和稳定性。
如果我们在创建Pod定义了资源上下限,但不满足LimitRanger规则中定义的资源上下限,此时LimitRanger会拒绝创建Pod资源,如果创建Pod时没有指定资源上下限,默认会使用LimitRanger规则中的资源上下限制
2、LimitRanger限制案例
第一步:创建limit 名称空间,针对limit名称空间做演示
kubectl create ns limit
第二步:配置LimitRanger规则
cat limitrange.yaml 
---
apiVersion: v1
kind: LimitRange
metadata:
  name: limitrange-demo
  namespace: limit
spec:
  limits:
  - default:               # 默认容器上限值
      cpu: 1000m
      memory: 1000Mi
    defaultRequest:        # 默认容器下限值
      cpu: 500m
      memory: 500Mi
    min:                   # 创建Pod或Containerd中,requests字段值不得小于此值
      cpu: 500m
      memory: 500Mi
    max:                   # 创建Pod或Containerd中,requests字段值不得大于此值
      cpu: 2000m
      memory: 2000Mi
    maxLimitRequestRatio:  # 指定资源的上限和下限的比值,即上限是下限的多少倍
      cpu: 4
      memory: 4
    type: Container        # 针对Container做限制,也可以是Pods
kubectl apply -f limitrange.yaml
第三步:查看规则信息
kubectl describe limitrange -n limit
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8h2ws11W-1689485141314)(D:\MD归档文档\IMG\image-20230716131050591.png)]](https://img-blog.csdnimg.cn/99e0ad53a5ce49168633e027551ae41c.png)
第四步:测试默认上下限,创建Pod不指定限制,看是否使用LimitRanger规则中默认配置的值
cat limitrange-pod.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: limit-pod-demo
  namespace: limit
spec:
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: nginx
kubectl apply -f limitrange-pod.yaml
查看限制信息:
kubectl describe pod limit-pod-demo -n limit
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DsO8QRYx-1689485141314)(D:\MD归档文档\IMG\image-20230716131903333.png)]](https://img-blog.csdnimg.cn/526cc40b4a5a43c1bbb9267bf4f940f3.png)
第五步:测试CPU下限,创建Pod指定不合规的下限,看是否可以成功创建。
cat limitrange-pod-2.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: limit-pod-demo-2
  namespace: limit
spec:
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: nginx
    resources:
      requests:
        cpu: 100m   # 下限100m
kubectl apply -f limitrange-pod-2.yaml
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YBmyTFXC-1689485141314)(D:\MD归档文档\IMG\image-20230716132249261.png)]](https://img-blog.csdnimg.cn/2a7e5fe2572b4b358056e27b5d8ec58d.png)
可以看到不能成功创建Pod,因为我们指定的下限不合规,我们在定义LimitRanger规则是下限不得小于500m,我创建Pod是指定下限是100m 所有无法创建。



















