k8s 资源配额

内容纲要

概述

k8s资源配额(ResourceQuota)是对k8s集群中命名空间中资源的限制。

在k8s官网文档中,对k8s资源配置解决的问题描述是:
当多个用户或团队共享有固定节点数的一个集群时,可能会某个团队使用的资源超过其公平份额,从而应用其他用户或者团队的使用。

When several users or teams share a cluster with a fixed number of nodes, there is a concern that one team could use more than its fair share of resources.
Resource quotas are a tool for administrators to address this concern.

但是我觉得k8s资源配额即使不是团队共享集群场景也非常有必要,因为我们需要限制k8s集群的资源使用以防止整个集群崩溃,包括:预留足够的操作系统资源和k8s核心资源的资源(dns,api server,etcd,schduler)。

资源配额

启用ResourceQuota

在使用ResourceQuota之前需要先确认ResourceQuota是否被启用,我们需要查看一下k8s api-server的清单文件,如果kube-apiserver.yaml中没有启用,则直接添加–enable-admission-plugin=ResourceQuota或者追加,ResourceQuota即可。

vim vim /etc/kubernetes/manifests/kube-apiserver.yaml

# 添加完成后生效
systemctl restart kubelet

file

资源配额类型

在 Kubernetes 中,你可以使用 ResourceQuota 对以下类型的资源进行限制:

  1. Pods: 你可以限制命名空间中可以运行的 Pod 的数量。
  2. Services: 你可以限制命名空间中可以创建的 Service 的数量。
  3. ReplicationControllers: 你可以限制命名空间中可以创建的 ReplicationController 的数量。
  4. Secrets: 你可以限制命名空间中可以保存的 Secret 的数量。
  5. ConfigMaps: 你可以限制命名空间中可以保存的 ConfigMap 的数量。
  6. PersistentVolumeClaims: 你可以限制命名空间中可以创建的 PersistentVolumeClaim 的数量。
  7. Requests 和 Limits: 对于 CPU 和内存资源,你可以限制命名空间中所有 Pod 可以请求(Requests)或者限制(Limits)的资源总量。
  8. PersistentVolumeClaim Size: 对于存储资源,你可以限制命名空间中所有 PersistentVolumeClaims 可以请求的存储总量。
  9. Requests.Storage: 对于持久卷存储,你可以限制命名空间中所有持久卷可以请求的存储总量。
  10. Ephemeral storage: 对于暂态存储,你可以限制命名空间中所有Pods可以请求的暂态存储总量。

以上类型是 Kubernetes 默认支持的资源类型,一些特殊的资源类型,比如自定义资源或者扩展资源(如 GPU),也是可以被 ResourceQuota 控制的,只需要正确配置即可。

资源配置级别

ResourceQuota 有两个级别:hard 和 soft。

  1. Hard quotas: 如果设置了 hard quotas,一旦这个命名空间的资源用量达到了设定的上限,那么这个命名空间就不能再创建新的资源。这种情况下,Pod 可能会创建失败,或者不能被调度。

  2. Soft quotas: soft quotas 则不同,如果设置了 soft quotas,这个命名空间的资源用量一旦超过设定的上限,就会生成一条警告信息。而不会如 hard quotas 那样阻止新的资源被创建。

资源配置示例

hard级别

apiVersion: v1
kind: ResourceQuota
metadata:
  name: myresourcequota
  namespace: default
spec:
  hard:
    pods: "10"
    services: "5"
    replicationcontrollers: "5"
    secrets: "10"
    configmaps: "10"
    persistentvolumeclaims: "5"
    requests.cpu: "1"
    requests.memory: "1Gi"
    requests.storage: "50Gi"
    limits.cpu: "2"
    limits.memory: "2Gi"

soft级别

apiVersion: v1
kind: ResourceQuota
metadata:
  name: myresourcequota
  namespace: default
spec:
  soft:
    pods: "10"
    services: "5"
    replicationcontrollers: "5"
    secrets: "10"
    configmaps: "10"
    persistentvolumeclaims: "5"
    requests.cpu: "1"
    requests.memory: "1Gi"
    requests.storage: "50Gi"
    limits.cpu: "2"
    limits.memory: "2Gi"

应用资源配额

创建ResourceQuota

kubectl apply -f rq.yaml
resourcequota/myresourcequota created

查询ResourceQuota

kubectl get resourcequota

kubectl describe resourcequota/myresourcequota

file

总结

k8s ResourceQuota用于限制命名空间资源使用,无论何时我们都要设置ResourceQuota以满足不同团队共享资源或者防止k8s集群过度使用硬件资源而导致集群故障。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部