k8s-资源限制学习
学习k8s资源限制
1. 资源限制对象
k8s资源限制对象从大到小为 namespace --> Pod --> Container
2. 资源限制类型
Pod 本身不直接设置资源限制,而是通过容器资源的总和间接限制:
- Pod 的总 requests 是所有容器 requests 之和(决定调度节点)。
- Pod 的总 limits 是所有容器 limits 之和(决定节点资源是否足够容纳)。
Container:
| 资源类型 | 如何表示 |
|---|---|
| CPU | 1000m = 1核 |
| Memory | 单位:Ki/Mi/Gi,1Gi=1024Mi |
| hugepages | 巨页(Huge Page)资源,默认内存块大小是4KB,可以设置为2MB或者更大 |
namespace:
| 资源类型 | 如何表示 |
|---|---|
| CPU | 1000m = 1核 |
| Memory | 单位:Ki/Mi/Gi,1Gi=1024M |
| API 对象配额 | pods,services,replicationcontrollers,resourcequotas,secrets,persistentvolumeclaims,services.nodeports,services.loadbalancers |
3. 资源限制实验
信息来源官方文档:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/manage-resources/
3.1. 配置命名空间下默认的内存和CPU请求和限制,和限制最小和最大请求限制。
创建一个命名空间:
kubectl create namespace test
创建LimitRange资源限制清单:cpu-memory-defaults.yaml:
apiVersion: v1
kind: LimitRange
metadata:
name: mem-cpu-limit-range
namespace: test
spec:
limits:
- default:
memory: 512Mi # 默认内存限制
cpu: 500m # 添加默认CPU限制(0.5核)
defaultRequest:
memory: 256Mi # 默认内存请求
cpu: 100m # 添加默认CPU请求(0.1核)
min:
memory: 64Mi # 不能小于此内存请求
cpu: 50m # 不能小于此cpu请求
max:
memory: 1Gi # 不能大于此内存请求
cpu: 1000m # 不能大于此cpu请求
type: Container # 资源对象为容器
kubectl create -f cpu-memory-defaults.yaml
使用kubectl describe ns test 可以查看到资源限制情况:
Resource Limits
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container cpu 50m 1 100m 500m -
Container memory 64Mi 1Gi 256Mi 512Mi -
创建一个Pod,不设置资源限制,来查看是否使用了默认配置:
kubectl run nginx --image=nginx --restart='Never' -n test
kubectl describe pod nginx -n test
Limits:
cpu: 500m
memory: 512Mi
Requests:
cpu: 100m
memory: 256Mi
可以看出走的是默认的请求和限制。
创建一个Pod单个内存限制为2G,查看效果:
apiVersion: v1
kind: Pod
metadata:
name: nginx01
namespace: test
spec:
containers:
- name: nginx01
image: nginx
resources:
limits:
memory: 2Gi
[root@k8s-master01 ~]# kubectl create -f nginx01-pod.yaml --dry-run=server
Error from server (Forbidden): error when creating "nginx01-pod.yaml": pods "nginx01" is forbidden: maximum memory usage per Container is 1Gi, but limit is 2Gi
可以看出有报错提示,最大内存为1Gi,但是我设置的是2Gi
根据现有的默认策略,我们不设置limits、requests或者只设置一个会有什么效果:
-
不设置声明和限制
当容器既没有设置资源请求,也没有设置资源限制时,会默认使用namespace设置的默认值。 -
只设置请求值,而不设置限制值时
当容器只设置请求值时,限制为为namespace设置的默认值 -
只设置限制值,而不设置请求值时
当容器只设置限制值而不设置请求值时,请求值默认你为namespace设置的默认值。
3.2. 为命令空间下内存、CPU、Pod创建数配额
还是延用之前创建的test命名空间
创建一个配额资源清单:quota-memcpupods-resourcequota.yaml:
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-pods-resourcequota
namespace: test # 作用在test命名空间
spec:
hard:
requests.cpu: "1" #
requests.memory: 2Gi
limits.cpu: "2"
limits.memory: 4Gi
pods: "2"
- 在该命名空间中的每个 Pod 的所有容器都必须要有内存请求和限制,以及 CPU 请求和限制。
- 在该命名空间中所有 Pod 的内存请求总和不能超过 2 GiB。
- 在该命名空间中所有 Pod 的内存限制总和不能超过 4 GiB。
- 在该命名空间中所有 Pod 的 CPU 请求总和不能超过 1 cpu。
- 在该命名空间中所有 Pod 的 CPU 限制总和不能超过 2 cpu。
- 在该命名空间中创建的Pod不能超过2个。
kubectl create -f quota-memcpupods-resourcequota.yaml
kubectl describe ns test
原来test ns是有po的但是被我删掉了。
Resource Quotas
Name: mem-cpu-pods-resourcequota
Resource Used Hard
-------- --- ---
limits.cpu 0 2
limits.memory 0 4Gi
pods 0 2
requests.cpu 0 1
requests.memory 0 2Gi
如上可以看出限制和使用情况,目前使用率是0。
使用deploy创建一个包含3个副本的Pod实验:
kubectl create deployment nginx --image=nginx --replicas=3 -n test
kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
nginx-66686b6766-dxnp4 1/1 Running 0 12s
nginx-66686b6766-rq9vd 1/1 Running 0 12s
如上可以看出我指定的是3个副本的Pod但是只创建了两个。
kubectl describe ns test
Resource Quotas
Name: mem-cpu-pods-resourcequota
Resource Used Hard
-------- --- ---
limits.cpu 1 2
limits.memory 1Gi 4Gi
pods 2 2
requests.cpu 200m 1
requests.memory 512Mi 2Gi
Resource Limits
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container cpu 50m 1 100m 500m -
Container memory 64Mi 1Gi 256Mi 512Mi -
如上是test ns内资源的使用情况,我创建deploy时没有指定Pod的资源请求和限制,默认走的是之前设置的。
再次创建一个Pod会发生什么:
kubectl run nginx01 --image=nginx --restart='Never' -n test
Error from server (Forbidden): pods "nginx01" is forbidden: exceeded quota: mem-cpu-pods-resourcequota, requested: pods=1, used: pods=2, limited: pods=2
Pod为API 对象,更多API对象配额参考:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/quota-api-object/,容器巨页配置这里就不演示了。
更多推荐


所有评论(0)