K8S入门篇-资源配额管理

一、资源配额(namespace)

1.1 为什么要有资源配额

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

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

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

资源配额限制的资源:

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"

  

1.2 资源配额案例

创建一个资源配额,对rq-test这个namespace。

cat resource-quota.yaml 
apiVersion: v1
kind: ResourceQuota
metadata:
  name: resource-test
  labels:
    app: resourcequota
spec:
  hard:
    pods: 2
    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"

 

创建

kubectl apply -f resource-quota.yaml -n rq-test

  

创建一个deployment

cat nginx-dp.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: rq-test-dp
  name: nginx
  namespace: rq-test
spec:
  replicas: 3 #副本数
  revisionHistoryLimit: 10 # 历史记录保留的个数
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.15.2
        imagePullPolicy: IfNotPresent
        name: nginx
        resources:
          limits:
            memory: "80Mi"
            cpu: "80m"
          requests:
            memory: "60Mi"
            cpu: "40m"

  注意:pod需要创建3个,而我们的资源配额限制的是2个。

创建  

kubectl apply -f nginx-dp.yaml 

  

查看结果

 

 

二、生产必备LimitRange(pod)

2.1 为什么要有limitrange

默认情况下, Kubernetes 集群上的容器运行使用的计算资源没有限制。 使用 Kubernetes 资源配额, 管理员(也称为集群操作者)可以在一个指定的命名空间内限制集群资源的使用与创建。 在命名空间中,一个 Pod 最多能够使用命名空间的资源配额所定义的 CPU 和内存用量。 作为集群操作者或命名空间级的管理员,你可能也会担心如何确保一个 Pod 不会垄断命名空间内所有可用的资源。

一个 LimitRange(限制范围) 对象提供的限制能够做到:

  • 在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制。
  • 在一个命名空间中实施对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限制。
  • 在一个命名空间中实施对一种资源的申请值和限制值的比值的控制。
  • 设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个 Container 中。

2.2 默认的limits和requests

创建limitrange

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-mem-limit-range
spec:
  limits:
  - default:  #limits
      cpu: 1
      memory: 512Mi
    defaultRequest: #requests
      cpu: 0.5
      memory: 256Mi
    type: Container

 

kubectl apply -f limitrange.yaml  -n rq-test

  

创建deploy测试

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: rq-test-dp
  name: nginx
  namespace: rq-test
spec:
  replicas: 3 #副本数
  revisionHistoryLimit: 10 # 历史记录保留的个数
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.15.2
        imagePullPolicy: IfNotPresent
        name: nginx
        resources:
          limits:
            memory: "200Mi"
            cpu: "400m"
          requests: #至少400mcore,200M内存
            memory: "200Mi"
            cpu: "400m"

 

[root@k8s-master01 ~/k8s]# kubectl describe quota -n rq-test
Name:                   resource-test
Namespace:              rq-test
Resource                Used   Hard
--------                ----   ----
configmaps              1      20
limits.cpu              400m   5
limits.memory           200Mi  16Gi
persistentvolumeclaims  0      20
pods                    1      3
replicationcontrollers  0      20
requests.cpu            400m   500m
requests.memory         200Mi  512Mi
requests.storage        0      40Gi
secrets                 1      20
services                0      50
services.loadbalancers  0      2
services.nodeports      0      10

  

查看结果:

发现只能创建1个pod,limitrange的cpu是500m,我们创建pod时一个使用400m,所以最多生成1个pod,其他因为资源不足而创建失败了。

 

2.3 limits和requests的范围

 

 

除了默认的limits和requests以外,我们还可以控制limits和requests的最大值和最小值

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-mem-limit-range
spec:
  limits:
  - max:         #限制最大值的cpu是800m,内存1G
      cpu: "800m"
      memory: "1Gi"
    min:         #限制最小值的cpu100m,内存99M
      cpu: "200m"
      memory: "99Mi"
    default:       #默认limits的cpu200m,内存500M
      cpu: "200m"
      memory: "500Mi"
    defaultRequest: #默认requests的cpu 100m,内存100M
      cpu: "200m"
      memory: "200Mi"
    type: Container

  如果deploy或pod中没有定义limits和requets的话,则会使用limitrange的limits和requests。否则会使用自己定义的值。

 

2.4 限制存储使用率

场景:限制存储使用量

集群管理员代表用户群操作集群,该管理员希望控制单个名字空间可以消耗多少存储空间以控制成本。该管理员想要限制:

  1. 名字空间中持久卷申领(persistent volume claims)的数量
  2. 每个申领(claim)可以请求的存储量
  3. 名字空间可以具有的累计存储量

使用quota限制请求的pvc数量和大小:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: storagequota
spec:
  hard:
    persistentvolumeclaims: "5"
    requests.storage: "5Gi"

  

使用limitrange限制申请PVC最小为1G,最大为2G:

apiVersion: v1
kind: LimitRange
metadata:
  name: storagelimits
spec:
  limits:
  - type: PersistentVolumeClaim
    max:
      storage: 2Gi
    min:
      storage: 1Gi

  

创建一个pvc,requests为8G,我们配置的quota为5G:

 

 

三、服务质量QoS

 

 

 

3.1 Guaranteed的pod实现

 

 

 

3.2 Burstable的pod实现

 

 

 

 

3.3 BestEffort的pod实现

 

 

  

posted @ 2022-10-28 16:33  skyflask  阅读(684)  评论(0编辑  收藏  举报