k8s-----25、资源调度-ResourceQuota资源配额、资源限制limitrange、服务质量QoS

1、ResourceQuota资源配额

1.0 作用

命名空间资源配额。防止公司内部人员对资源的不合理利用。

1.1、为什么需要资源配额

1、作为k8s集群的管理员,知道集群的规模,会合理规划资源,但是使用侧不知道,会导致很多不合理的使用场景,造成浪费。

2、大量资源废弃后,没有合理清理,存在集群被打爆的风险。

3、加了资源配额限制之后,可以合理配置资源,并让使用方做到定期清理无用资源。

1.2、配置参数

yaml 复制代码
#创建resourcequota
apiVersion: v1
kind: ResourceQuota 
metadata:
  name: resource-test 
  labels:
    app: resourcequota 
spec:
  hard:
    pods: 50 
    requests.cpu: 0.5 
    requests.memory: 512Mi 
    limits.cpu: 5 
    limits.memory: 16Gi 
    configmaps: 20 
    requests.storage: 40Gi 
    persistentvolumeclaims: 20 
    replicationcontrollers: 20 
    secrets: 20
    services: 50 
    services.loadbalancers: "2" 
    services.nodeports: "10"

#参数解释
➢ pods:限制最多启动Pod的个数
➢ requests.cpu:限制pod最低CPU请求数
➢ requests.memory:限制pod最低内存的请求数 
➢ limits.cpu:限制最高CPU的limit上限
➢ limits.memory:限制最高内存的limit上限

2、LimitRange资源限制

2.1 作用

1、防止出现总资源一定的情况下,大家不指定pod的所需资源,那么创建的Pod都没有配置resources,会发现最终统计的资源使用为0,那么就可以无限创建pod。

2、可以无限制的对pod的资源进行扩展,比如可能直接创建的就是16C16G,导致无资源可用。

2.2 限制

1、deploy 已经创建的不会影响,如果pod重建过后,会将limitrange的配置刷新到新的pod里。

2、通过edit编辑了pod的resource参数,那么是不会被limitrange更改掉。

3、创建的时候需要指定对应的命名空间。

2.3 使用

limit可以同时配置,只有type不一致的时候,需要新开一行编写。

2.3.1 默认limitrange配置

yaml 复制代码
# 默认配置是为了控制资源利用情况,针对不同类型进行了默认的资源使用配置
# default:默认limits配置
# defaultRequest:默认requests配置
apiVersion: v1 
kind: LimitRange 
metadata:
  name: cpu-mem-limit-range 
spec:
  limits:
  - default:
      cpu: 1
      memory: 512Mi 
    defaultRequest:
      cpu: 0.5
      memory: 256Mi 
    type: Container  #类型是容器

2.3.2 requests和limits的范围

yaml 复制代码
#最大最小的配置是为了方式资源无限制的配置,导致资源浪费与资源打满
# max:内存CPU的最大配置 
# min:内存CPU的最小配置
apiVersion: v1 
kind: LimitRange 
metadata:
  name: cpu-min-max-demo-lr 
spec:
  limits: 
  - max:
      cpu: "800m"
      memory: 1Gi 
    min:
      cpu: "200m"
      memory: 500Mi 
    type: Container

2.3.3 限制申请存储空间

yaml 复制代码
# max:最大PVC的空间 
# min:最小PVC的空间
apiVersion: v1 
kind: LimitRange 
metadata:
  name: storagelimits 
spec:
  limits:
  - type: PersistentVolumeClaim #类型是pvc
    max: 
      storage: 2Gi
    min:
      storage: 1Gi

2.3.4 整体配置

yaml 复制代码
apiVersion: v1 
kind: LimitRange 
metadata:
  name: cpu-min-max-demo-lr 
spec:
  limits: 
  - default:
      cpu: 1
      memory: 512Mi 
    defaultRequest:
      cpu: 0.5
      memory: 256Mi 
    max:
      cpu: "800m"
      memory: 1Gi 
    min:
      cpu: "200m"
      memory: 500Mi 
    type: Container #类型容器
  - type: PersistentVolumeClaim #类型是pvc
    max: 
      storage: 2Gi
    min:
      storage: 1Gi

3、服务质量QoS

3.1 QoS级别

➢ Guaranteed:最高服务质量,当宿主机内存不够时,会先kill掉QoS为BestEffort和 Burstable的Pod,如果内存还是不够,才会kill掉QoS为Guaranteed,该级别Pod的资源 占用量一般比较明确,即requests的cpu和memory和limits的cpu和memory配置的一致。

➢ Burstable: 服务质量低于Guaranteed,当宿主机内存不够时,会先kill掉QoS为 BestEffort的Pod,如果内存还是不够之后就会kill掉QoS级别为Burstable的Pod,用来保 证QoS质量为Guaranteed的Pod,该级别Pod一般知道最小资源使用量,但是当机器资 源充足时,还是想尽可能的使用更多的资源,即limits字段的cpu和memory大于 requests的cpu和memory的配置。

➢ BestEffort:尽力而为,当宿主机内存不够时,首先kill的就是该QoS的Pod,用以保证 Burstable和Guaranteed级别的Pod正常运行。这个类型的QoS没有配置resources。

3.2 不同级别的配置

3.2.1 QoS为Guaranteed的Pod

yaml 复制代码
# 1 Pod中的每个容器必须指定limits.memory和requests.memory, 并且两者需要相等;
# 2 Pod中的每个容器必须指定limits.cpu和limits.memory,并且两 者需要相等。

apiVersion: v1 
kind: Pod 
metadata:
  name: qos-demo
  namespace: qos-example 
spec:
  containers:
  - name: qos-demo-ctr
    image: nginx
    resources: 
      limits:
        memory: "200Mi"
        cpu: "700m" 
      requests:
        memory: "200Mi" 
        cpu: "700m"

3.2.2 QoS为Burstable的Pod

yaml 复制代码
# 1 Pod不符合Guaranteed的配置要求;
# 2 Pod中至少有一个容器配置了requests.cpu或requests.memory。
apiVersion: v1 
kind: Pod 
metadata:
  name: qos-demo
  namespace: qos-example 
spec:
  containers:
  - name: qos-demo-ctr
    image: nginx
    resources: 
      limits:
        memory: "200Mi"
      requests:
        memory: "100Mi" 
       

3.2.3 QoS为BestEffort的Pod

yaml 复制代码
# 1 不设置resources参数
apiVersion: v1 
kind: Pod 
metadata:
  name: qos-demo
  namespace: qos-example 
spec:
  containers:
  - name: qos-demo-ctr
    image: nginx
相关推荐
昌sit!3 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
A ?Charis6 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
北漂IT民工_程序员_ZG7 小时前
k8s集群安装(minikube)
云原生·容器·kubernetes
2301_8061313614 小时前
Kubernetes的基本构建块和最小可调度单元pod-0
云原生·容器·kubernetes
SilentCodeY14 小时前
containerd配置私有仓库registry
容器·kubernetes·containerd·镜像·crictl
binqian20 小时前
【k8s】ClusterIP能http访问,但是不能ping 的原因
http·容器·kubernetes
探索云原生21 小时前
GPU 环境搭建指南:如何在裸机、Docker、K8s 等环境中使用 GPU
ai·云原生·kubernetes·go·gpu
是垚不是土1 天前
Istio流量镜像测试
运维·kubernetes·云计算·istio
蚊子不吸吸1 天前
DevOps开发运维简述
linux·运维·ci/cd·oracle·kubernetes·gitlab·devops
林小果11 天前
K8S搭建
云原生·容器·kubernetes