k8s--Kubernetes资源监控--资源限制、资源配额
Kubernetes采用request和limit两种限制类型来对资源进行分配:request(资源需求):即运行Pod的节点必须满足运行Pod的最基本需求才能运行Pod。limit(资源限额):即运行Pod期间,可能内存使用量会增加,那最多能使用多少内存,这就是资源限额。资源类型:CPU 的单位是核心数,内存的单位是字节。一个容器申请0.5个CPU,就相当于申请1个CPU的一半,你也可以加个后缀
一、k8s容器资源限制简介
- Kubernetes采用request和limit两种限制类型来对资源进行分配:
request(资源需求):即运行Pod的节点必须满足运行Pod的最基本需求才能运行Pod。
limit(资源限额):即运行Pod期间,可能内存使用量会增加,那最多能使用多少内存,这就是资源限额。- 资源类型:
CPU 的单位是核心数,内存的单位是字节。
一个容器申请0.5个CPU,就相当于申请1个CPU的一半,你也可以加个后缀m 表示千分之一的概念。比如说100m的CPU,100豪的CPU和0.1个CPU都是一样的。
内存单位:
K、M、G、T、P、E #通常是以1000为换算标准的。
Ki、Mi、Gi、Ti、Pi、Ei #通常是以1024为换算标准的。
二、实验操作
1.资源限制
上传镜像
[root@k8s1 harbor]# docker push reg.westos.org/library/stress
[root@k8s2 limit]# vim limit.yaml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
spec:
containers:
- name: memory-demo
image: stress ##这个镜像可以直接模拟资源的使用,测试内存
args:
- --vm
- "1" ##开一个进程
- --vm-bytes
- 200M ##使用200M内存
resources:
requests:
memory: 50Mi
limits:
memory: 100Mi ##限制
[root@k8s2 limit]# kubectl apply -f limit.yaml
[root@k8s2 limit]# kubectl get pod
NAME READY STATUS RESTARTS AGE
memory-demo 0/1 OOMKilled 0 2s ##OOMKilled
注意:
1.如果容器超过其内存限制,则会被终止。
2.如果一个容器超过其内存请求,那么当节点内存不足时,它的 Pod 可能被逐出。
2.限制范围:limitrange
[root@k8s2 limit]# vim range.yaml
apiVersion: v1
kind: LimitRange ##limit限制
metadata:
name: limitrange-memory
spec:
limits:
- default: ##默认
cpu: 0.5 ##0.5个
memory: 512Mi
defaultRequest:
cpu: 0.1
memory: 256Mi
max: ##最大
cpu: 1
memory: 1Gi
min: ##最小
cpu: 0.1
memory: 100Mi
type: Container
[root@k8s2 limit]# kubectl apply -f range.yaml
创建的pod自动添加限制
[root@k8s2 limit]# kubectl run demo --image nginx
[root@k8s2 limit]# kubectl describe pod demo
注意:自定义限制的pod也需要在limitrange定义的区间内
LimitRange 在 namespace 中施加的最小和最大内存限制只有在创建和更新 Pod 时才会被应用。改变 LimitRange 不会对之前创建的 Pod 造成影响。
3.资源配额:ResourceQuota
资源配额:在当前namespace,所有的pod加起来的内存、CPU总量不能超
[root@k8s2 limit]# vim range.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: limitrange-memory
spec:
limits:
- default:
cpu: 0.5
memory: 512Mi
defaultRequest:
cpu: 0.1
memory: 256Mi
max:
cpu: 1
memory: 1Gi
min:
cpu: 0.1
memory: 100Mi
type: Container
--- ###以下为新添加
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1" ##需求1
requests.memory: 1Gi
limits.cpu: "2" ##限制2
limits.memory: 2Gi
pods: "2" ##pod最多为2个
为namespace设置资源限制
- 创建的ResourceQuota对象将在default名字空间中添加以下限制:
每个容器必须设置内存请求(memory request),内存限额(memory limit),cpu请求(cpu request)和cpu限额(cpu limit)。
所有容器的内存请求总额不得超过1 GiB。
所有容器的内存限额总额不得超过2 GiB。
所有容器的CPU请求总额不得超过1 CPU。
所有容器的CPU限额总额不得超过2 CPU。
[root@k8s2 limit]# kubectl apply -f range.yaml
[root@k8s2 limit]# kubectl describe resourcequotas
Name: mem-cpu-demo
Namespace: default
Resource Used Hard ##Used(已使用) Hard(总量)
-------- ---- ----
limits.cpu 500m 2
limits.memory 512Mi 2Gi
requests.cpu 100m 1
requests.memory 256Mi 1Gi
试验后务必回收资源,以免影响其他操作
1.配额是针对namespace施加的总限额,命名空间内的所有pod资源总和不能超过此配额
2.创建的pod必须定义资源限制,否则有如下报错;为了方便,可以设置limitrange(限制范围)
更多推荐
所有评论(0)