一资源管理概述
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