K8s进阶之多租户场景下的资源配额(ResourceQuota)

打印 上一主题 下一主题

主题 1857|帖子 1857|积分 5571

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
概述

ResourceQuota官方文档:https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/
在 Kubernetes(K8s)中,ResourceQuota(资源配额)是一种用于管理命名空间(Namespace)资源使用的核心机制。它通过限制命名空间内可斲丧的资源总量,实现资源的精细化分配和隔离,制止单个命名空间过度占用集群资源,保障集群稳定性和多租户环境的公平性。
ResourceQuota 通常与 LimitRange 的配合使用:

  • ResourceQuota:限制命名空间级别的资源总量(如整个命名空间最多使用 2 核 CPU)。
  • LimitRange:限制单个 Pod / 容器的资源请求 / 限制范围(如单个 Pod 的 CPU 请求必须≥100m 且≤500m)。
关于LimitRange可以查看这篇文章:K8s进阶之LimitRange
应用场景

多租户资源隔离

场景:

在多租户集群中(如开辟、测试、生产环境共用一个集群),不同租户或团队使用独立的命名空间。
作用:

为每个命名空间设置 CPU、内存、存储等资源的硬限制,防止某个租户滥用资源影响其他租户。
开辟 / 测试环境资源管控

场景:

开辟和测试环境通常需要快速迭代,但资源使用大概缺乏束缚(如暂时创建大量 Pod)。
作用:

限制命名空间内可创建的 Pod、服务、PersistentVolumeClaim(PVC)等对象的数量,制止资源浪费。
生产环境资源预留与保障

场景:

生产环境需要为关键应用预留资源,制止被非关键业务抢占。
作用:

为生产环境的命名空间设置较高的资源配额,同时限制非生产环境的资源上限。
结合LimitRange(资源限制范围),确保 Pod 的资源请求 / 限制符合配额要求。
防止集群资源耗尽

场景:

当集群资源有限时(如 CPU、内存总量固定),未限制的命名空间大概导致集群整体资源不足,影响全部业务。
作用:

通过全局配额(在default命名空间或全部命名空间启用),限制整个集群的资源使用上限,保障体系组件(如 kube-proxy、CoreDNS)和高优先级应用的资源可用性。
ResourceQuota支持的资源范例

计算资源


  • requests.cpu:全部 Pod 的 CPU 请求总量(以核心数为单位,如1表示 1 核,0.5或500m表示 0.5 核)
  • requests.memory:内存请求总量(如1Gi、512Mi)
  • limits.cpu:CPU 限制总量(Pod 可突发使用的最大 CPU)
  • limits.memory:内存限制总量(Pod 的 OOM 阈值)
存储资源


  • persistentvolumeclaims:PVC 数量上限
  • storageclass.storage:特定存储类的存储总量(如storageclass.storage.k8s.io/ssd=100Gi)
对象数量


  • pods:Pod 数量上限(包括运行中、已终止的 Pod)
  • services:服务数量上限
  • replicationcontrollers:复制控制器数量上限
  • secrets:Secret 数量上限
  • configmaps:ConfigMap 数量上限
  • deployments.apps:Deployment 数量上限(需启用apps API 组)
  • statefulsets.apps:StatefulSet 数量上限
ResourceQuota资源文件解析
  1. apiVersion: v1
  2. kind: ResourceQuota
  3. metadata:
  4.   name: namespace-quota
  5.   namespace: my-namespace  # 指定要应用配额的命名空间
  6. spec:
  7.   hard:
  8.     # 计算资源配额
  9.     requests.cpu: "2"        # CPU 总请求量上限
  10.     requests.memory: 4Gi     # 内存总请求量上限
  11.     limits.cpu: "4"          # CPU 总限制量上限
  12.     limits.memory: 8Gi       # 内存总限制量上限
  13.     # 存储资源配额
  14.     requests.storage: 10Gi   # 存储总请求量上限
  15.     persistentvolumeclaims: "2"  # PVC 数量上限
  16.     # 对象数量配额
  17.     pods: "10"               # Pod 数量上限
  18.     services: "5"            # Service 数量上限
  19.     configmaps: "10"         # ConfigMap 数量上限
  20.     secrets: "10"            # Secret 数量上限
  21.     replicationcontrollers: "5"  # ReplicationController 数量上限
  22.     services.loadbalancers: "2"  # LoadBalancer 类型 Service 数量上限
  23.     services.nodeports: "2"      # NodePort 类型 Service 数量上限
复制代码
实战案例

创建命名空间并设置资源配额
  1. # 创建命名空间
  2. [root@master01 ~]# kubectl create namespace dev
  3. namespace/dev created
  4. # 查看命名空间是否创建成功
  5. [root@master01 ~]# kubectl get ns dev
  6. NAME   STATUS   AGE
  7. dev    Active   5s
复制代码
设置资源配额
  1. # 定义资源配额
  2. [root@master01 ~/quota]# cat dev-quota.yaml
  3. apiVersion: v1
  4. kind: ResourceQuota
  5. metadata:
  6.   name: dev-quota
  7.   # 指定要应用配额的命名空间
  8.   namespace: dev
  9. spec:
  10.   hard:
  11.     # 计算资源配额
  12.     # CPU 总请求量上限,1核心
  13.     requests.cpu: "1"
  14.     # 内存总请求量上限,1G
  15.     requests.memory: 1Gi
  16.     # CPU 总限制量上限,1核心
  17.     limits.cpu: "1"
  18.     # 内存总限制量上限,1G
  19.     limits.memory: 1Gi
  20.     # 存储资源配额
  21.      # 存储总请求量上限
  22.     requests.storage: 5Gi
  23.     # PVC 数量上限
  24.     persistentvolumeclaims: "2"
  25.     # 对象数量配额
  26.     # Pod 数量上限
  27.     pods: "10"
  28.     # Service 数量上限
  29.     services: "2"
  30.     # ConfigMap 数量上限
  31.     configmaps: "3"
  32.     # Secret 数量上限
  33.     secrets: "10"
  34.     # ReplicationController 数量上限
  35.     replicationcontrollers: "5"
  36.     # LoadBalancer 类型 Service 数量上限
  37.     services.loadbalancers: "2"
  38.     # NodePort 类型 Service 数量上限
  39.     services.nodeports: "2"
  40.     # Deployment 数量上限
  41.     apps/deployments: "3"
  42.     # replicasets 数量上限
  43.     apps/replicasets: "3"
  44.     # job的数量上限
  45.     batch/jobs: "2"
  46.     # cronjobs的数量上限
  47.     batch/cronjobs: "2"
  48. # 创建资源配额
  49. [root@master01 ~/quota]# kubectl apply -f dev-quota.yaml
  50. resourcequota/dev-quota created
复制代码
查看一下具体信息
  1. # 查看quota
  2. [root@master01 ~/quota]# kubectl get quota -n dev
  3. NAME        AGE   REQUEST                                                                                                                                                                                                                                                                                                                             LIMIT
  4. dev-quota   59s   apps/deployments: 0/3, apps/replicasets: 0/3, batch/cronjobs: 0/2, batch/jobs: 0/2, configmaps: 1/3, persistentvolumeclaims: 0/2, pods: 0/10, replicationcontrollers: 0/5, requests.cpu: 0/1, requests.memory: 0/1Gi, requests.storage: 0/5Gi, secrets: 0/10, services: 0/2, services.loadbalancers: 0/2, services.nodeports: 0/2   limits.cpu: 0/1, limits.memory: 0/1Gi
  5. # 查看详细信息
  6. [root@master01 ~/quota]# kubectl describe quota dev-quota -n dev
  7. Name:                   dev-quota
  8. Namespace:              dev
  9. Resource                Used  Hard
  10. --------                ----  ----
  11. apps/deployments        0     3
  12. apps/replicasets        0     3
  13. batch/cronjobs          0     2
  14. batch/jobs              0     2
  15. configmaps              1     3
  16. limits.cpu              0     1
  17. limits.memory           0     1Gi
  18. persistentvolumeclaims  0     2
  19. pods                    0     10
  20. replicationcontrollers  0     5
  21. requests.cpu            0     1
  22. requests.memory         0     1Gi
  23. requests.storage        0     5Gi
  24. secrets                 0     10
  25. services                0     2
  26. services.loadbalancers  0     2
  27. services.nodeports      0     2
复制代码
验证ResourceQuota

验证计算资源

当我们创建Pod时不指定CPU和memory的资源会发生什么呢?
创建Pod时会报错,错误信息提示我们需要指定request和limit,当在ResourceQuota限制的命名空间内,创建Pod时,需要设置对应的资源限额,这是一个逼迫性的诉求
  1. [root@master01 ~/quota]# cat pod.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: nginx-pod
  6.   namespace: dev
  7. spec:
  8.   containers:
  9.   - name: nginx-container-1
  10.     image: nginx:latest
  11. [root@master01 ~/quota]# kubectl apply -f pod.yaml
  12. Error from server (Forbidden): error when creating "pod.yaml": pods "nginx-pod" is forbidden: failed quota: dev-quota: must specify limits.cpu for: nginx-container-1; limits.memory for: nginx-container-1; requests.cpu for: nginx-container-1; requests.memory for: nginx-container-1
复制代码
创建出一个符合规则束缚的Pod,看看会发生什么
  1. [root@master01 ~/quota]# cat pod-1.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: nginx-pod-1
  6.   namespace: dev
  7. spec:
  8.   containers:
  9.   - name: nginx-container-1
  10.     image: nginx:latest
  11.     # 定义资源限制
  12.     resources:
  13.       requests:
  14.         cpu: "0.5"
  15.         memory: "500Mi"
  16.       limits:
  17.         cpu: "0.5"
  18.         memory: "500Mi"
  19. [root@master01 ~/quota]# kubectl apply -f pod-1.yaml
  20. pod/nginx-pod-1 created
  21. # 查看quota,发现Used列产生了数据
  22. [root@master01 ~/quota]# kubectl describe quota -n dev
  23. Name:                   dev-quota
  24. Namespace:              dev
  25. Resource                Used   Hard
  26. --------                ----   ----
  27. apps/deployments        0      3
  28. apps/replicasets        0      3
  29. batch/cronjobs          0      2
  30. batch/jobs              0      2
  31. configmaps              1      3
  32. limits.cpu              500m   1
  33. limits.memory           500Mi  1Gi
  34. persistentvolumeclaims  0      2
  35. pods                    1      10
  36. replicationcontrollers  0      5
  37. requests.cpu            500m   1
  38. requests.memory         500Mi  1Gi
  39. requests.storage        0      5Gi
  40. secrets                 0      10
  41. services                0      2
  42. services.loadbalancers  0      2
  43. services.nodeports      0      2
复制代码
在创建一个Pod,将CPU和memory分别设置为0.8和800Mi
发现在我们创建时,提示报错了,为什么呢?由于我们创建的Pod资源请求超出了规定的配额
  1. [root@master01 ~/quota]# cat pod-2.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: nginx-pod-2
  6.   namespace: dev
  7. spec:
  8.   containers:
  9.   - name: nginx-container-2
  10.     image: nginx:latest
  11.     resources:
  12.       requests:
  13.         cpu: "0.8"
  14.         memory: "800Mi"
  15.       limits:
  16.         cpu: "0.8"
  17.         memory: "800Mi"
  18. [root@master01 ~/quota]# kubectl apply -f pod-2.yaml
  19. Error from server (Forbidden): error when creating "pod-2.yaml": pods "nginx-pod-2" is forbidden: exceeded quota: dev-quota, requested: limits.cpu=800m,limits.memory=800Mi,requests.cpu=800m,requests.memory=800Mi, used: limits.cpu=500m,limits.memory=500Mi,requests.cpu=500m,requests.memory=500Mi, limited: limits.cpu=1,limits.memory=1Gi,requests.cpu=1,requests.memory=1Gi
复制代码
验证service资源

我们先创建两个service,范例分别是nodePort和loadBalancer
  1. [root@master01 ~/quota]# cat service-1.yaml
  2. # NodePort类型的service
  3. apiVersion: v1
  4. kind: Service
  5. metadata:
  6.   name: nginx-nodeport
  7.   namespace: dev
  8. spec:
  9.   type: NodePort
  10.   ports:
  11.     - protocol: TCP
  12.       port: 80
  13.       targetPort: 80
  14.       nodePort: 30080
  15. ---
  16. # LoadBalancer类型service
  17. apiVersion: v1
  18. kind: Service
  19. metadata:
  20.   name: nginx-loadbalancer
  21.   namespace: dev
  22. spec:
  23.   type: LoadBalancer
  24.   ports:
  25.     - protocol: TCP
  26.       port: 80
  27.       targetPort: 80
  28. # 创建
  29. [root@master01 ~/quota]# kubectl apply -f service-1.yaml
  30. service/nginx-nodeport created
  31. service/nginx-loadbalancer created
  32. # 查看
  33. [root@master01 ~/quota]# kubectl get service -n dev
  34. NAME                 TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
  35. nginx-loadbalancer   LoadBalancer   10.96.1.23   <pending>     80:30531/TCP   5s
  36. nginx-nodeport       NodePort       10.96.1.11   <none>        80:30080/TCP   5s
复制代码
查看一下quota具体信息
  1. [root@master01 ~/quota]# kubectl describe quota dev-quota -n dev
  2. Name:                   dev-quota
  3. Namespace:              dev
  4. Resource                Used   Hard
  5. --------                ----   ----
  6. apps/deployments        0      3
  7. apps/replicasets        0      3
  8. batch/cronjobs          0      2
  9. batch/jobs              0      2
  10. configmaps              1      3
  11. limits.cpu              500m   1
  12. limits.memory           500Mi  1Gi
  13. persistentvolumeclaims  0      2
  14. pods                    1      10
  15. replicationcontrollers  0      5
  16. requests.cpu            500m   1
  17. requests.memory         500Mi  1Gi
  18. requests.storage        0      5Gi
  19. secrets                 0      10
  20. services                2      2
  21. services.loadbalancers  1      2
  22. services.nodeports      2      2
复制代码
这里nodeports的数量为2,为什么呢?由于loadbalancer范例的service底层使用的就是nodeport。所以创建loadbalancer范例的service时会自动创建一个nodeport。
关于service可以学习这篇文章:K8s新手系列之Service资源
这个时候我们在创建一个clusterip范例的service,看看会发生什么?
再继续创建的话,会报错,提示我们service的数量已经不够了
  1. [root@master01 ~/quota]# cat service-3.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5.   name: nginx-clusterip
  6.   namespace: dev
  7. spec:
  8.   type: ClusterIP
  9.   ports:
  10.     - protocol: TCP
  11.       port: 80
  12.       targetPort: 80
  13. [root@master01 ~/quota]# kubectl apply -f service-3.yaml
  14. Error from server (Forbidden): error when creating "service-3.yaml": services "nginx-clusterip" is forbidden: exceeded quota: dev-quota, requested: services=1, used: services=2, limited: services=2
复制代码
验证其它资源

这里大家可以根据上面的案例自行测试,
ResourceQuota管理

查看ResourceQuota
  1. kubectl get quota <quota-name> -n <namespace>
  2. # 查看详细信息
  3. kubectl describe quota  <quota-name> -n <namespace>
复制代码
删除ResourceQuota
  1. kubectl delete quota <quota-name> -n <namespace>
复制代码
修改已经定义好的ResourceQuota

方式一,直接修改资源清单文件,重新应用即可

示例:
  1. [root@master01 ~/quota]# cat dev-quota.yaml
  2. apiVersion: v1
  3. kind: ResourceQuota
  4. metadata:
  5.   name: dev-quota
  6.   # 指定要应用配额的命名空间
  7.   namespace: dev
  8. spec:
  9.   hard:
  10.     # 修改为10
  11.     requests.cpu: "10"
  12.     # 修改为10G
  13.     requests.memory: 10Gi
  14.     limits.cpu: "1"
  15.     limits.memory: 10Gi
  16.     # 修改为50G
  17.     requests.storage: 50Gi
  18.     persistentvolumeclaims: "2"
  19.     pods: "10"
  20.     services: "2"
  21.     configmaps: "3"
  22.     secrets: "10"
  23.     replicationcontrollers: "5"
  24.     services.loadbalancers: "2"
  25.     services.nodeports: "2"
  26.     apps/deployments: "3"
  27.     apps/replicasets: "3"
  28.     batch/jobs: "2"
  29.     batch/cronjobs: "2"
  30. # 重新应用
  31. [root@master01 ~/quota]# kubectl apply -f dev-quota.yaml
  32. resourcequota/dev-quota configured
  33. # 查看更新后的资源
  34. [root@master01 ~/quota]# kubectl describe quota dev-quota -n dev
  35. Name:                   dev-quota
  36. Namespace:              dev
  37. Resource                Used   Hard
  38. --------                ----   ----
  39. apps/deployments        0      3
  40. apps/replicasets        0      3
  41. batch/cronjobs          0      2
  42. batch/jobs              0      2
  43. configmaps              1      3
  44. limits.cpu              500m   1
  45. limits.memory           500Mi  10Gi # 已更新
  46. persistentvolumeclaims  0      2
  47. pods                    1      10
  48. replicationcontrollers  0      5
  49. requests.cpu            500m   10
  50. requests.memory         500Mi  10Gi # 已更新
  51. requests.storage        0      50Gi # 已更新
  52. secrets                 0      10
  53. services                2      2
  54. services.loadbalancers  1      2
  55. services.nodeports      2      2
复制代码
方式二:使用kubectl edit 命令直接编辑保存即可


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表