资源配额ResourceQuota实战案例

简介: 关于Kubernetes资源配额(ResourceQuota)的实战案例分析,涵盖了资源配额的概述、工作方式、计算资源配额、存储资源配额、对象数量配额的详细介绍和案例演示。

一.资源配额ResourceQuota概述

1.资源配额概述

当多个用户或团队共享具有固定节点数目的集群时,人们会担心有人使用超过其基于公平原则所分配到的资源量。

资源配额是帮助管理员解决这一问题的工具。

资源配额,通过 ResourceQuota 对象来定义,对每个命名空间的资源消耗总量提供限制。 它可以限制命名空间中某种类型的对象的总数目上限,也可以限制命名空间中的 Pod 可以使用的计算资源的总上限。

参考链接:
    https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/

2.资源配额ResourceQuota的工作方式

- 不同的团队可以在不同的命名空间下工作。这可以通过 RBAC 强制执行。

- 集群管理员可以为每个命名空间创建一个或多个 ResourceQuota 对象。

- 当用户在命名空间下创建资源(如 Pod、Service 等)时,Kubernetes 的配额系统会跟踪集群的资源使用情况, 以确保使用的资源用量不超过 ResourceQuota 中定义的硬性资源限额。

- 如果资源创建或者更新请求违反了配额约束,那么该请求会报错(HTTP 403 FORBIDDEN), 并在消息中给出有可能违反的约束。

- 如果命名空间下的计算资源 (如 cpu 和 memory)的配额被启用, 则用户必须为这些资源设定请求值(request)和约束值(limit),否则配额系统将拒绝 Pod 的创建。 提示: 可使用 LimitRanger 准入控制器来为没有设置计算资源需求的 Pod 设置默认值。

3.计算资源配额

资源名称 描述
limits.cpu 所有非终止状态的 Pod,其 CPU 限额总量不能超过该值。
limits.memory 所有非终止状态的 Pod,其内存限额总量不能超过该值。
requests.cpu 所有非终止状态的 Pod,其 CPU 需求总量不能超过该值。
requests.memory 所有非终止状态的 Pod,其内存需求总量不能超过该值。
hugepages-<size> 对于所有非终止状态的 Pod,针对指定尺寸的巨页请求总数不能超过此值。
cpu requests.cpu 相同。
memory requests.memory 相同。
参考链接:
    https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/#compute-resource-quota

4.存储资源配额

资源名称 描述
requests.storage 所有 PVC,存储资源的需求总量不能超过该值。
persistentvolumeclaims 在该命名空间中所允许的 PVC 总量。
<storage-class-name>.storageclass.storage.k8s.io/requests.storage 在所有与 <storage-class-name> 相关的持久卷申领中,存储请求的总和不能超过该值。
<storage-class-name>.storageclass.storage.k8s.io/persistentvolumeclaims 在与 storage-class-name 相关的所有持久卷申领中,命名空间中可以存在的持久卷申领总数。
参考链接:
    https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/#storage-resource-quota

5.对象数量配额

资源名称 描述
configmaps 在该命名空间中允许存在的 ConfigMap 总数上限。
persistentvolumeclaims 在该命名空间中允许存在的 PVC 的总数上限。
pods 在该命名空间中允许存在的非终止状态的 Pod 总数上限。Pod 终止状态等价于 Pod 的 .status.phase in (Failed, Succeeded) 为真。
replicationcontrollers 在该命名空间中允许存在的 ReplicationController 总数上限。
resourcequotas 在该命名空间中允许存在的 ResourceQuota 总数上限。
services 在该命名空间中允许存在的 Service 总数上限。
services.loadbalancers 在该命名空间中允许存在的 LoadBalancer 类型的 Service 总数上限。
services.nodeports 在该命名空间中允许存在的 NodePort 类型的 Service 总数上限。
secrets 在该命名空间中允许存在的 Secret 总数上限。
你可以使用以下语法对所有标准的、命名空间域的资源类型进行配额设置:
    count/<resource>.<group>:用于非核心(core)组的资源
    count/<resource>:用于核心组的资源


这是用户可能希望利用对象计数配额来管理的一组资源示例。
    count/persistentvolumeclaims
    count/services
    count/secrets
    count/configmaps
    count/replicationcontrollers
    count/deployments.apps
    count/replicasets.apps
    count/statefulsets.apps
    count/jobs.batch
    count/cronjobs.batch


推荐阅读:
    https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/#object-count-quota

二.资源配额案例

1.计算资源配额案例

1.1 创建计算资源配额

[root@master231 01-ResourceQuota]# cat 01-compute-resources.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-resources
  namespace: kube-public
spec:
  # 定义硬性配置
  hard:
    # 配置cpu 的相关参数
    requests.cpu: "1"
    limits.cpu: "2"
    # 定义memory相关的参数
    requests.memory: 2Gi
    limits.memory: 3Gi
    # 定义GPU相关的参数
    # requests.nvidia.com/gpu: 4
[root@master231 01-ResourceQuota]# kubectl apply -f 01-compute-resources.yaml 
resourcequota/compute-resources created
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl get quota -n kube-public 
NAME                AGE   REQUEST                                     LIMIT
compute-resources   13s   requests.cpu: 0/1, requests.memory: 0/2Gi   limits.cpu: 0/2, limits.memory: 0/3Gi
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl get pods -n kube-public 
No resources found in kube-public namespace.
[root@master231 01-ResourceQuota]#

1.2 验证计算资源配额

[root@master231 01-ResourceQuota]# cat 02-pods.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pods-nginx
  namespace: kube-public
spec:
  containers:
  - name: web
    image: nginx:1.20.1-alpine
    resources:
      requests:
        cpu: 0.5
        memory: 1Gi
      limits:
        cpu: 1
        memory: 2Gi
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl apply -f 02-pods.yaml 
pod/pods-nginx created
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl get pods -n kube-public 
NAME         READY   STATUS    RESTARTS   AGE
pods-nginx   1/1     Running   0          7s
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl get quota -n kube-public 
NAME                AGE   REQUEST                                          LIMIT
compute-resources   14m   requests.cpu: 500m/1, requests.memory: 1Gi/2Gi   limits.cpu: 1/2, limits.memory: 2Gi/3Gi
[root@master231 01-ResourceQuota]#

1.3 超出计算配额验证

[root@master231 01-ResourceQuota]# kubectl get quota -n kube-public 
NAME                AGE   REQUEST                                          LIMIT
compute-resources   17m   requests.cpu: 500m/1, requests.memory: 1Gi/2Gi   limits.cpu: 1/2, limits.memory: 2Gi/3Gi
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# cat 03-pods.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pods-alpine
  namespace: kube-public
spec:
  containers:
  - name: c1
    image: alpine
    resources:
      requests:
        cpu: 1.5
        memory: 2Gi
      limits:
        cpu: 2
        memory: 4Gi
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl apply -f 03-pods.yaml 
Error from server (Forbidden): error when creating "03-pods.yaml": pods "pods-alpine" is forbidden: exceeded quota: compute-resources, requested: limits.cpu=2,limits.memory=4Gi,requests.cpu=1500m,requests.memory=2Gi, used: limits.cpu=1,limits.memory=2Gi,requests.cpu=500m,requests.memory=1Gi, limited: limits.cpu=2,limits.memory=3Gi,requests.cpu=1,requests.memory=2Gi
[root@master231 01-ResourceQuota]#

2.存储资源配额案例

2.1 创建存储资源配额

[root@master231 01-ResourceQuota]# cat 04-storage-reources.yaml 
apiVersion: v1
kind: ResourceQuota
metadata:
  name: storage-resources
  namespace: kube-public
spec:
  hard:
    requests.storage: "10Gi"
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl apply -f 04-storage-reources.yaml 
resourcequota/storage-resources created
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl get quota -n kube-public storage-resources 
NAME                AGE   REQUEST                    LIMIT
storage-resources   7s    requests.storage: 0/10Gi   
[root@master231 01-ResourceQuota]#

2.2 验证存储资源配额

[root@master231 01-ResourceQuota]# kubectl get quota -n kube-public storage-resources 
NAME                AGE   REQUEST                    LIMIT
storage-resources   71s   requests.storage: 0/10Gi   
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# cat 05-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-demo
  namespace: kube-public
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl apply -f 05-pvc.yaml 
persistentvolumeclaim/pvc-demo created
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl get quota -n kube-public storage-resources 
NAME                AGE   REQUEST                      LIMIT
storage-resources   83s   requests.storage: 8Gi/10Gi   
[root@master231 01-ResourceQuota]#

2.3 超出存储资源配额

[root@master231 01-ResourceQuota]# kubectl get quota -n kube-public storage-resources 
NAME                AGE   REQUEST                      LIMIT
storage-resources   83s   requests.storage: 8Gi/10Gi   
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# cat 06-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-demo-02
  namespace: kube-public
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl apply -f 06-pvc.yaml 
Error from server (Forbidden): error when creating "06-pvc.yaml": persistentvolumeclaims "pvc-demo-02" is forbidden: exceeded quota: storage-resources, requested: requests.storage=3Gi, used: requests.storage=8Gi, limited: requests.storage=10Gi
[root@master231 01-ResourceQuota]#

3.对象数量配额案例

3.1 创建对象资源配额

[root@master231 01-ResourceQuota]# cat 07-object-counts.yaml 
apiVersion: v1
kind: ResourceQuota
metadata:
  name: object-counts
  namespace: kube-public
spec:
 hard:
   pods: "10"
   count/deployments.apps: "3"
   count/services: "3"
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl apply -f 07-object-counts.yaml
resourcequota/object-counts created
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl -n kube-public get quota object-counts 
NAME            AGE   REQUEST                                                        LIMIT
object-counts   30s   count/deployments.apps: 0/3, count/services: 0/3, pods: 1/10   
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl get pods -n kube-public 
NAME         READY   STATUS    RESTARTS   AGE
pods-nginx   1/1     Running   0          33m
[root@master231 01-ResourceQuota]#

3.2 验证对象资源配额

[root@master231 01-ResourceQuota]# kubectl -n kube-public get pods,deployment
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-55fd5fd97c-4fbnb   1/1     Running   0          2m36s
pod/nginx-deployment-55fd5fd97c-6flm6   1/1     Running   0          2m36s
pod/nginx-deployment-55fd5fd97c-8cxn9   1/1     Running   0          2m36s
pod/pods-nginx                          1/1     Running   0          51m

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   3/3     3            3           2m36s
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl -n kube-public get quota
NAME                AGE   REQUEST                                                        LIMIT
compute-resources   65m   requests.cpu: 800m/1, requests.memory: 1324Mi/2Gi              limits.cpu: 1600m/2, limits.memory: 2648Mi/3Gi
object-counts       18m   count/deployments.apps: 1/3, count/services: 0/3, pods: 4/10   
storage-resources   25m   requests.storage: 8Gi/10Gi                                     
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl -n kube-public get quota object-counts 
NAME            AGE   REQUEST                                                        LIMIT
object-counts   18m   count/deployments.apps: 1/3, count/services: 0/3, pods: 4/10   
[root@master231 01-ResourceQuota]#

3.3 超出对象资源配额

将pod副本数量改到10个后,测试发现无法到达10个,因为我们定义的"compute-resources"资源的"limit.cpu"资源已经达到上限啦~


[root@master231 01-ResourceQuota]# kubectl -n kube-public get quota 
NAME                AGE   REQUEST                                                        LIMIT
compute-resources   66m   requests.cpu: 1/1, requests.memory: 1524Mi/2Gi                 limits.cpu: 2/2, limits.memory: 3048Mi/3Gi
object-counts       19m   count/deployments.apps: 1/3, count/services: 0/3, pods: 6/10   
storage-resources   25m   requests.storage: 8Gi/10Gi                                     
[root@master231 01-ResourceQuota]# 



如果你不考虑其他两个因素,则可以直接使用删除其他的资源限制即可。
[root@master231 01-ResourceQuota]# kubectl -n kube-public delete quota compute-resources storage-resources
resourcequota "compute-resources" deleted
resourcequota "storage-resources" deleted
[root@master231 01-ResourceQuota]# 
[root@master231 01-ResourceQuota]# kubectl -n kube-public get quota 
NAME            AGE   REQUEST                                                        LIMIT
object-counts   22m   count/deployments.apps: 1/3, count/services: 0/3, pods: 6/10   
[root@master231 01-ResourceQuota]# 


再次测试效果如下: 发现deploy资源仅仅创建了9个哟~
[root@master231 01-ResourceQuota]# kubectl -n kube-public get quota,deploy,pods
NAME                          AGE   REQUEST                                                         LIMIT
resourcequota/object-counts   25m   count/deployments.apps: 1/3, count/services: 0/3, pods: 10/10   

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   9/10    9            9           9m54s

NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-55fd5fd97c-4fbnb   1/1     Running   0          9m54s
pod/nginx-deployment-55fd5fd97c-6flm6   1/1     Running   0          9m54s
pod/nginx-deployment-55fd5fd97c-8cxn9   1/1     Running   0          9m54s
pod/nginx-deployment-55fd5fd97c-8fwvt   1/1     Running   0          6m37s
pod/nginx-deployment-55fd5fd97c-l844s   1/1     Running   0          2m32s
pod/nginx-deployment-55fd5fd97c-qkn2x   1/1     Running   0          2m32s
pod/nginx-deployment-55fd5fd97c-tpcgt   1/1     Running   0          2m32s
pod/nginx-deployment-55fd5fd97c-wg4fq   1/1     Running   0          2m32s
pod/nginx-deployment-55fd5fd97c-xvhrs   1/1     Running   0          6m36s
pod/pods-nginx                          1/1     Running   0          58m
[root@master231 01-ResourceQuota]#
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Kubernetes 安全 Cloud Native
云原生|kubernetes|pod或容器的安全上下文配置解析
云原生|kubernetes|pod或容器的安全上下文配置解析
797 0
|
弹性计算 Kubernetes 监控
Kubernetes 资源观测利器:KubeWatch
KubeWatch 用于观测 Kubernetes 资源情况,并实时通知到各种协作软件/聊天软件
2971 0
Kubernetes 资源观测利器:KubeWatch
|
机器学习/深度学习 自然语言处理 PyTorch
大语言模型工作原理和工作流程
大语言模型(Large Language Models,简称LLMs)是一类具有大量参数的深度学习模型,它们在自然语言处理(NLP)领域中,通过处理大量的文本数据来学习语言模式、语法和语义,从而理解和生成人类语言。
2530 2
|
12月前
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
28977 18
|
Kubernetes 应用服务中间件 nginx
史上最全干货!Kubernetes 原理+实战总结(全文6万字,90张图,100个知识点)(上)
史上最全干货!Kubernetes 原理+实战总结(全文6万字,90张图,100个知识点)
52000 30
|
SQL 关系型数据库 数据库
克服“写不出来SQL”的困境:策略与技巧
在数据库管理和开发中,SQL(Structured Query Language)是不可或缺的工具
|
缓存 Shell API
PWA与原生应用:性能与用户体验的深度对比
【7月更文第28天】随着Web技术的进步,渐进式Web应用(Progressive Web Apps, PWA)已成为一种越来越受欢迎的选择,它结合了Web和原生应用的优点。尽管如此,原生应用仍然占据着移动应用市场的主导地位。本文将深入探讨PWA与原生应用之间的性能和用户体验方面的差异,并通过一些实际代码示例来展示如何构建高性能的PWA。
531 1
|
Kubernetes Cloud Native Docker
使用 kubevpn 在本地快速开发云原生应用
KubeVPN 是一个用于云原生开发的工具,它允许用户通过本地计算机直接访问远程 Kubernetes 集群中的服务,利用 k8s DNS 或 Pod IP/Service IP。它可以拦截并调试服务网格中的工作负载流量,并提供开发模式,让容器在本地以与 k8s pod 相同的环境运行。快速开始包括下载二进制文件、自定义 Krew 安装、构建二进制文件以及安装示例应用。KubeVPN 支持链接到多个集群、DNS 解析、反向代理,以及在 Docker 中的开发模式,确保与 Kubernetes 运行环境一致。此外,它还兼容多种协议和平台。
417 5
|
小程序 数据安全/隐私保护
阿里云服务器新手入门:注册账号、实名认证申请免费云服务器全流程
阿里云新手指南 1. 注册阿里云账号,支持手机号或支付宝等快捷注册。 2. 完成实名认证,个人/企业选择相应类型。 3. 访问免费服务器申请页面 4. 创建后,设置密码,通过安全组开通端口。 5. 使用教程包括远程连接、部署应用等,详细步骤见阿里云帮助中心。
1232 0
|
算法
数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)
数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)
650 0
下一篇
开通oss服务