Pod资源管理

一资源管理概述

1.为什么要资源配额?

-当多个应用共享节点数目的集群时。人们担心某些应用无法获得足够的资源,从而影响其正常运行,我们需要设定一些规则,用来保证应用能获得其运行所需资源

2.CPU资源类型

-CPU资源的约束和请求以毫核(m)为单位。在k8s中1m是最小的调度单元,CPU的一个核心可以看作1000m

-如果你有2颗CPU,并且每CPU为4个核心,那么你的CPU资源总量就是8000m

3.内存资源类型

-memory的约束和请求以字节为单位。

-你可以使用以下单位来表示内存:E、P、T、G、M、K

-你也可以使用对应的2的幂数:Ei、Pi、Ti、Gi、Mi、Ki

-例如,以下表达式所代表的是相同的值:

1K==1000

1Ki==1024

案例:

编写资源清单文件,实现资源配额

(1).为 Pod 保留至少需要 300m 计算资源

(2).为 Pod 保留至少需要 500M 内存资源

# 创建 Pod
[root@master ~]# vim app.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: app
spec:
  containers:
  - name: web
    image: myos:httpd

[root@master ~]# kubectl apply -f app.yaml
pod/app created

# 使用 memtest.py 占用内存资源
[root@master ~]# kubectl cp memtest.py app:/usr/bin/
[root@master ~]# kubectl exec -it app -- bash
[root@app html]# memtest.py 1000
use memory success
press any key to exit :

# 使用 info.php 占用计算资源
[root@master ~]# curl http://10.244.1.10/info.php?id=9999999

# 在另一个终端监控
[root@master ~]# watch -n 1 'kubectl top pods'
NAME   CPU(cores)   MEMORY(bytes)      
app    993m         19Mi
app    3m           1554Mi
资源配额
[root@master ~]# vim app.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: app
spec:
  containers:
  - name: web
    image: myos:httpd
    resources:                  # 配置资源策略
      requests:                 # 配额策略
        cpu: 1500m              # 计算资源配额
        memory: 800Mi           # 内存资源配额

[root@master ~]# kubectl replace --force -f app.yaml
pod "app" deleted
pod/app replaced

[root@master ~]# kubectl describe pods app
......
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:          1500m
      memory:       800Mi
验证配额策略
[root@master ~]# sed "s,app,app1," app.yaml |kubectl apply -f -
pod/app1 created
[root@master ~]# sed "s,app,app2," app.yaml |kubectl apply -f -
pod/app2 created
[root@master ~]# sed "s,app,app3," app.yaml |kubectl apply -f -
pod/app3 created

[root@master ~]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
app    1/1     Running   0          18s
app1   1/1     Running   0          16s
app2   1/1     Running   0          15s
app3   0/1     Pending   0          12s

# 清理实验配置
[root@master ~]# kubectl delete pod --all

二.资源限额

1.为什么需要使用资源限额?

-限额策略是为了防止某些应用对节点资源过度使用,而配置的限制性策略。

-资源限额使用 limits 进行配置。

-资源限额必须与资源配额共同配置,如果没有设置,默认使用资源限额的值配置资源配额。

2.实例和用法

(1).限制内存、CPU

---
kind: Pod
apiVersion: v1
metadata:
  name: app
spec:
  containers:
    - name: web
      image: myos:httpd
      resources:            # 资源策略
        limits:             # 限额策略
          cpu: 600m         # 计算资源限额
          memory: 800Mi     # 内存资源限额

(2).查看资源限额

[root@master ~]# kubectl apply -f app.yaml
pod/app created

# 查看资源策略
[root@master ~]# kubectl describe pods app
......
Ready:              True
Restart Count:      0
Limits:
  cpu:                600m
  memory:             800Mi
Requests:
  cpu:                600m
  memory:             800Mi

(3).验证资源限额

# cpu 限额
[root@master ~]# curl http://10.244.1.10/info.php?id=9999999

# 在其他终端查看
[root@master ~]# kubectl top pods
NAME           CPU(cores)    MEMORY(bytes)
app            600m          19Mi

# 内存限额
[root@master ~]# kubectl exec -it app -- bash
[root@app html]# memtest.py 1000
Killed

[root@app html]# memtest.py 700
use memory success
press any key to exit :

3.节点压力驱逐

-kubelet 监控集群节点的内存、磁盘空间和文件系统的等资源。当这些资源中的一个或者多个达到特定的消耗水平的时候,kubelet 可以主动的终止一个或者多个 Pod,以回收资源防止饥饿的过程。

-在节点压力驱逐期间,kubelet 将所选 Pod 的状态设置为 Failed 并终止 Pod 的运行。

-一般来说,Kubernetes在触发节点压力驱逐时会考虑QoS类别,进行如下处理。

-Guaranteed(保障型):这类Pod有稳定的资源配额/限额,通常情况下最不容易被驱逐。

-Burstable(爆发型):这类Pod的资源使用会在1一定的范围内波动,它们在节点资源不足时可能会被驱逐。

-BesEffort(尽量型):没有明确的资源使用量,被认为是首选被驱逐的对象。

4.Pod服务质量(QoS)

-如果你给Pod设置的资源配额等于资源限额(固定值),那么这个Pod属于Guaranteed型。

-如果你给Pod设置的资源配额小于资源限额,那么这个Pod属于Burstable型。

-如果你既没有设置Pod的资源限额,也没有设置Pod的资源配额,那么这个Pod属于BestEffort

案例: Pod质量服务

按照不同服务质量等级,创建 3 个 Pod

(1).创建服务质量等级为 BestEffort 的 Pod

(2).创建服务质量等级为 Burstable 的 Pod

(3).创建服务质量等级为 Guaranteed 的 Pod

Pod 服务质量
BestEffort
[root@master ~]# vim app1.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: app1
spec:
  containers:
  - name: web
    image: myos:httpd

[root@master ~]# kubectl apply -f app1.yaml 
pod/app1 created
[root@master ~]# kubectl describe pods app1 |grep QoS
QoS Class:                   BestEffort
Burstable
[root@master ~]# vim app2.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: app2
spec:
  containers:
  - name: web
    image: myos:httpd
    resources:
      requests:
        cpu: 400m
        memory: 200Mi

[root@master ~]# kubectl apply -f app2.yaml 
pod/app2 created
[root@master ~]# kubectl describe pods app2 |grep QoS
QoS Class:                   Burstable
Guaranteed
[root@master ~]# vim app3.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: app3
spec:
  containers:
  - name: web
    image: myos:httpd
    resources:
      requests:
        cpu: 200m
        memory: 200Mi
      limits:
        cpu: 200m
        memory: 200Mi

[root@master ~]# kubectl apply -f app3.yaml 
pod/app3 created
[root@master ~]# kubectl describe pods app3 |grep QoS
QoS Class:                   Guaranteed

三.全局资源管理概述

1.全局资源配额

-如果有大量的容器需要设置资源配额,为每个 Pod 设置资源配额策略不方便且不好管理。管理员可以以名称空间为单位(namespace),限制其资源的使用与创建。在该名称空间中创建的容器都会受到规则的限制。

-k8s 支持的全局资源配额方式有:

-对单个 Pod 内存、CPU 进行配额:LimitRange

-对资源总量进行配额:ResourceQuota

2.限制没有资源配额Pod数量

---
apiVersion: V1
KIBD: ResourceQuota               #全局资源限额对象
metadata:                          
  name: myquotal                   #规则名称
  namespace: work                  #规则作用的名称空间
spec:                              #ResourceQuota.spec定义
  hard:                            #创建强制规则
    pods: 3                        #限制创建资源对象总量
  scpes:                           #配置服务质量类型
  - BestEffort                     #Pod QoS类型

案例 ReourceQuota

全局资源配额管理

创建 work 名称空间,并为其配置资源管理策略

1、没有资源配额的 Pod 最多允许创建 3 个

2、有资源配额的 Pod 最多允许创建 10 个

3、限制所有 Pod 资源配额总和,计算资源不得超过 2300m,内存资源不得超过 3Gi

全局资源配额
[root@master ~]# vim quota.yaml
---
kind: ResourceQuota
apiVersion: v1
metadata:
  name: myquota1
  namespace: work
spec:
  hard:
    pods: 3
  scopes:
  - BestEffort

[root@master ~]# kubectl create namespace work
namespace/work created
[root@master ~]# kubectl apply -f quota.yaml 
resourcequota/myquota1 created

# 查看配额信息
[root@master ~]# kubectl describe namespaces work 
......
Resource Quotas
  Name:     myquota1
  Scopes:   BestEffort
  * Matches all pods that do not have resource requirements set. These pods have a best effort quality of service.
  Resource  Used  Hard
  --------  ---   ---
  pods      0     3
验证配额策略
[root@master ~]# sed 's,app1,app11,' app1.yaml |kubectl -n work apply -f -
[root@master ~]# sed 's,app1,app12,' app1.yaml |kubectl -n work apply -f -
[root@master ~]# sed 's,app1,app13,' app1.yaml |kubectl -n work apply -f -
[root@master ~]# sed 's,app1,app14,' app1.yaml |kubectl -n work apply -f -
Error from server (Forbidden): error when creating "STDIN": pods "app14" is forbidden: exceeded quota: myquota1, requested: pods=1, used: pods=3, limited: pods=3
[root@master ~]# sed 's,app3,app31,' app3.yaml |kubectl -n work apply -f -
[root@master ~]# sed 's,app3,app32,' app3.yaml |kubectl -n work apply -f -
服务质量配额
[root@master ~]# vim quota.yaml
---
kind: ResourceQuota
apiVersion: v1
metadata:
  name: myquota1
  namespace: work
spec:
  hard:
    pods: 3
  scopes:
  - BestEffort

---
kind: ResourceQuota
apiVersion: v1
metadata:
  name: myquota2
  namespace: work
spec:
  hard:
    pods: 10
    cpu: 2300m
    memory: 3Gi
  scopes:
  - NotBestEffort

# 更新配额策略
[root@master ~]# kubectl apply -f quota.yaml 
resourcequota/myquota1 configured
resourcequota/myquota2 created

# 查看配额信息
[root@master ~]# kubectl describe namespace work
......
Resource Quotas
  Name:     myquota1
  Scopes:   BestEffort
  * Matches all pods that do not have resource requirements set. These pods have a best effort quality of service.
  Resource  Used  Hard
  --------  ---   ---
  pods      3     3
  Name:     myquota2
  Scopes:   NotBestEffort
  * Matches all pods that have at least one resource requirement set. These pods have a burstable or guaranteed quality of service.
  Resource  Used  Hard
  --------  ---   ---
  cpu       400   2300m
  memory    400   3Gi
  pods      2     10
验证配额策略
[root@master ~]# sed 's,app2,app21,' app2.yaml |kubectl -n work apply -f -
[root@master ~]# sed 's,app2,app22,' app2.yaml |kubectl -n work apply -f -
[root@master ~]# sed 's,app2,app23,' app2.yaml |kubectl -n work apply -f -
[root@master ~]# sed 's,app2,app24,' app2.yaml |kubectl -n work apply -f -
[root@master ~]# sed 's,app2,app25,' app2.yaml |kubectl -n work apply -f -
Error from server (Forbidden): error when creating "STDIN": pods "app25" is forbidden: exceeded quota: myquota2, requested: cpu=400m, used: cpu=2, limited: cpu=2300m
清理实验配置
[root@master ~]# kubectl -n work delete pods --all
[root@master ~]# kubectl delete namespace work
namespace "work" deleted

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值