涉及参考文档:
- 为命名空间配置默认内存请求和限制
- 为命名空间配置默认 CPU 请求和限制
- 为命名空间配置最小和最大内存约束
- 为命名空间配置最小和最大 CPU 约束
- 为命名空间配置内存和 CPU 配额
- 为命名空间配置 Pod 配额
前提条件
- Kubernetes 集群
- 集群名称空间
mem-cpu
测试总结小图
一、为命名空间配置默认内存请求和限制
简介: 命名空间中创建 Container,并且 Container 未指定自己的内存限制,则为 Container 分配默认内存限制
。Kubernetes 在特定条件下分配默认内存请求。
1、书写yaml文件
vim memory-defaults-pod.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
namespace: mem-cpu
spec:
limits:
- default:
memory: 512Mi
defaultRequest:
memory: 256Mi
type: Container
---
apiVersion: v1
kind: Pod
metadata:
name: default-mem-demo
namespace: mem-cpu
spec:
containers:
- name: default-mem-demo-ctr
image: nginx:latest
imagePullPolicy: IfNotPresent
2、生成默认内存请求/限制Pod资源
kubectl apply -f memory-defaults-pod.yaml
3、查看详细信息
- 查看对名称空间下Pod的默认内存请求/限制
kubectl get limitranges -n mem-cpu mem-limit-range && kubectl describe limitranges -n mem-cpu mem-limit-range
可以看到默认内存请求/限制分别为256Mi/512Mi, 接下来只需要查看Pod是否继承
- 查看Pod的详细信息
kubectl get po -n mem-cpu default-mem-demo -o yaml |grep " resources" -A4
可以看到Pod继承了设定名称空间下对Pod的默认内存请求/限制值。
4、设置指定一个容器的内存请求
vim memory-defaults-requestspod.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
namespace: mem-cpu
spec:
limits:
- default:
memory: 512Mi
defaultRequest:
memory: 256Mi
type: Container
---
apiVersion: v1
kind: Pod
metadata:
name: default-mem-demo
namespace: mem-cpu
spec:
containers:
- name: default-mem-demo-ctr
image: nginx
resources:
requests:
memory: "128Mi"
重新更新资源,并且查看Pod的请求资源的值
kubectl delete -f memory-defaults-pod.yaml && \
kubectl apply -f memory-defaults-requestspod.yaml && \
kubectl get po -n mem-cpu default-mem-demo -o yaml |grep " resources" -A4 && \
kubectl describe limitranges -n mem-cpu mem-limit-range
设置默认内存请求/限制Pod资源 可以修改请求资源的值
5、设置指定一个容器的内存限制
vim memory-defaults-limitspod.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
namespace: mem-cpu
spec:
limits:
- default:
memory: 512Mi
defaultRequest:
memory: 256Mi
type: Container
---
apiVersion: v1
kind: Pod
metadata:
name: default-mem-demo
namespace: mem-cpu
spec:
containers:
- name: default-mem-demo
image: nginx
resources:
limits:
memory: "1Gi"
kubectl delete -f memory-defaults-requestspod.yaml && \
kubectl apply -f memory-defaults-limitspod.yaml && \
kubectl get po -n mem-cpu default-mem-demo -o yaml |grep " resources" -A4 && \
kubectl describe limitranges -n mem-cpu mem-limit-range
设置默认内存请求/限制Pod资源 可以修改限制资源的值,其中Pod请求/限制设置值为最大值
总结:
不设置限制/请求继承默认值,
设置 限制超过默认值,请求和限制都为超过值
设置 请求小于默认值,请求为最小值但限制值依旧为默认限制值
二、为命名空间配置默认 CPU 请求和限制
简介: CPU 限制的命名空间中创建 Container,并且 Container 未指定自己的 CPU 限制,则为 Container 分配默认 CPU 限制
1、书写yaml文件
vim cpu-defaults-pod.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-limit-range
namespace: mem-cpu
spec:
limits:
- default:
cpu: 1
defaultRequest:
cpu: 0.5
type: Container
---
apiVersion: v1
kind: Pod
metadata:
name: default-cpu-demo
namespace: mem-cpu
spec:
containers:
- name: default-cpu-demo-ctr
image: nginx
imagePullPolicy: IfNotPresent
2、生成默认CPU 请求/限制Pod资源
kubectl apply -f cpu-defaults-pod.yaml
3、查看详细信息
-
查看对名称空间下Pod的默认CPU请求/限制
可以看到默认CPU 请求/限制分别为 0.5/1 , 接下来只需要查看Pod是否继承 -
查看Pod的详细信息
kubectl get po -n mem-cpu default-cpu-demo -o yaml |grep " resources" -A4
可以看到Pod继承了设定名称空间下对Pod的默认CPU 请求/限制值。
4、设置指定一个容器的CPU请求
vim cpu-defaults-requestspod.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-limit-range
namespace: mem-cpu
spec:
limits:
- default:
cpu: 1
defaultRequest:
cpu: 0.5
type: Container
---
apiVersion: v1
kind: Pod
metadata:
name: default-cpu-demo
namespace: mem-cpu
spec:
containers:
- name: default-cpu-demo-ctr
image: nginx
resources:
requests:
cpu: "0.75"
imagePullPolicy: IfNotPresent
kubectl delete -f cpu-defaults-pod.yaml && \
kubectl apply -f cpu-defaults-requestspod.yaml && \
kubectl get pod -n mem-cpu default-cpu-demo -o yaml |grep " resources" -A4 && \
kubectl describe limitranges -n mem-cpu cpu-limit-range
设置默认CPU 请求/限制Pod资源 可以修改请求资源的值
5、设置指定一个容器的CPU限制
vim cpu-defaults-limitspod.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-limit-range
namespace: mem-cpu
spec:
limits:
- default:
cpu: 1
defaultRequest:
cpu: 0.5
type: Container
---
apiVersion: v1
kind: Pod
metadata:
name: default-cpu-demo
namespace: mem-cpu
spec:
containers:
- name: default-cpu-demo-ctr
image: nginx
resources:
limits:
cpu: "2"
kubectl delete -f cpu-defaults-requestspod.yaml && \
kubectl apply -f cpu-defaults-limitspod.yaml && \
kubectl get pod -n mem-cpu default-cpu-demo -o yaml |grep " resources" -A4 && \
kubectl describe limitranges -n mem-cpu cpu-limit-range
设置默认CPU 请求/限制Pod资源 可以修改限制资源的值,其中Pod请求/限制设置值为最大值
总结:
不设置限制/请求继承默认值
设置 限制超过默认值,请求和限制都为超过值
设置 请求小于默认值,请求为最小值但限制值依旧为默认限制值
对此以上CPU、内存设定值超过默认的限制值,随之Pod的请求/限制值都变成了设定值。 这样是否做不打到真正的资源隔离。 我们应当对最大限制值进行也有个上限,同理最小限制值如同。
接下来引入新的概念 对命名空间最大与最小的约束
三、为命名空间配置最小和最大内存约束
简介: 命名空间中运行的容器使用的内存设置最小值和最大值。您可以在LimitRange 对象中指定最小和最大内存值
。如果 Pod 不满足 LimitRange 施加的约束,则无法在命名空间中创建它
1、书写yaml文件
vim memory-constraints-default.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: mem-min-max-demo-lr
namespace: mem-cpu
spec:
limits:
- max:
memory: 1Gi
min:
memory: 500Mi
type: Container
---
apiVersion: v1
kind: Pod
metadata:
name: constraints-mem-demo
namespace: mem-cpu
spec:
containers:
- name: constr
2、生成默认 最小和最大内存约束
kubectl apply -f memory-constraints-default.yaml
3、查看详细信息
- 查看对名称空间下Pod的默认 最小和最大内存约束
kubectl get limitranges -n mem-cpu mem-min-max-demo-lr && \
kubectl describe limitranges -n mem-cpu mem-min-max-demo-lr
可以看到默认 最小和最大内存约束分别为 500Mi/1Gi ,其中默认内存请求/限制 分别为1Gi/1Gi ,接下来只需要查看Pod继承值
- 查看Pod的详细信息
kubectl get po -n mem-cpu constraints-mem-demo -oyaml |grep " resources" -A4 && \
kubectl describe limitranges -n mem-cpu mem-min-max-demo-lr
4、设置指定一个容器的内存请求、限制值
vim memory-constraints-init.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: mem-min-max-demo-lr
namespace: mem-cpu
spec:
limits:
- max:
memory: 1Gi
min:
memory: 500Mi
type: Container
---
apiVersion: v1
kind: Pod
metadata:
name: constraints-mem-demo
namespace: mem-cpu
spec:
containers:
- name: constraints-mem-demo-ctr
image: nginx
resources:
limits:
memory: "800Mi"
requests:
memory: "600Mi"
kubectl apply -f memory-constraints-init.yaml && \
kubectl get po -n mem-cpu constraints-mem-demo -o yaml |grep " resources" -A4 && \
kubectl describe limitranges -n mem-cpu mem-min-max-demo-lr
设置默认内存 请求/限制Pod资源,如果符合最大与最小范围值,可以修改默认的请求与限制资源的值
5、设置指定容器不满足最小内存请求
vim memory-constraints-requests.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: mem-min-max-demo-lr
namespace: mem-cpu
spec:
limits:
- max:
memory: 1Gi
min:
memory: 500Mi
type: Container
---
apiVersion: v1
kind: Pod
metadata:
name: constraints-mem-demo
namespace: mem-cpu
spec:
containers:
- name: constraints-mem-demo-ctr
image: nginx
resources:
limits:
memory: "800Mi"
requests:
memory: "100Mi"
kubectl delete -f memory-constraints-init.yaml && \
kubectl apply -f memory-constraints-requests.yaml && \
kubectl get po -n mem-cpu constraints-mem-demo -o yaml |grep " resources" -A4 && \
kubectl describe limitranges -n mem-cpu mem-min-max-demo-lr
6、设置指定容器超过最大内存限制的 Pod
vim memory-constraints-limits.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: mem-min-max-demo-lr
namespace: mem-cpu
spec:
limits:
- max:
memory: 1Gi
min:
memory: 500Mi
type: Container
---
apiVersion: v1
kind: Pod
metadata:
name: constraints-mem-demo
namespace: mem-cpu
spec:
containers:
- name: constraints-mem-demo-ctr
image: nginx
resources:
limits:
memory: "1.5Gi"
requests:
memory: "600Mi"
kubectl delete -f memory-constraints-requests.yaml && \
kubectl apply -f memory-constraints-limits.yaml && \
kubectl describe limitranges -n mem-cpu mem-min-max-demo-lr
总结:
1、若Pod不设置请求值与限制值,Pod容器内存的请求与限制值为最大约束值
2、设置 请求小于默认值,Pod容器内存的请求为最小值但限制值依旧为默认限制值
3、设置 限制超过默认值,Pod容器内存的请求和限制值都为超过值
四、为命名空间配置最小和最大 CPU 约束
简介: 命名空间中的容器和 Pod 使用的 CPU 资源设置最小值和最大值。在LimitRange 对象中指定最小和最大 CPU 值 。如果 Pod 不满足 LimitRange 施加的约束,则无法在命名空间中创建它
1、书写yaml文件
vim cpu-constraints-default.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-min-max-demo-lr
namespace: mem-cpu
spec:
limits:
- max:
cpu: "800m"
min:
cpu: "200m"
type: Container
---
apiVersion: v1
kind: Pod
metadata:
name: constraints-cpu-demo
namespace: mem-cpu
spec:
containers:
- name: constraints-cpu-demo-ctr
image: nginx
2、生成默认 最小和最大 CPU 约束
kubectl apply -f cpu-constraints-default.yaml
3、查看详细信息
- 查看对名称空间下Pod的默认 最小和最大 CPU 约束
kubectl get limitranges -n mem-cpu cpu-min-max-demo-lr && \
kubectl describe limitranges -n mem-cpu cpu-min-max-demo-lr
可以看到默认 最小和最大CPU 约束分别为 200m/800m ,其中默认内存请求/限制 分别为800m/800m ,接下来只需要查看Pod继承值
- 查看Pod的详细信息
kubectl get po -n mem-cpu constraints-cpu-demo -oyaml |grep " resources" -A4 && \
kubectl describe limitranges -n mem-cpu cpu-min-max-demo-lr
Pod继承值了名称空间设定的限制请求、限制值
4、设置指定一个容器的CPU请求、限制值
vim cpu-constraints-init.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-min-max-demo-lr
namespace: mem-cpu
spec:
limits:
- max:
cpu: "800m"
min:
cpu: "200m"
type: Container
---
apiVersion: v1
kind: Pod
metadata:
name: constraints-cpu-demo
namespace: mem-cpu
spec:
containers:
- name: constraints-cpu-demo-ctr
image: nginx
resources:
limits:
cpu: "800m"
requests:
cpu: "500m"
kubectl delete -f cpu-constraints-default.yaml && \
kubectl apply -f cpu-constraints-init.yaml && \
kubectl get po -n mem-cpu constraints-cpu-demo -o yaml |grep " resources" -A4 && \
kubectl describe limitranges -n mem-cpu cpu-min-max-demo-lr
设置默认CPU 请求/限制Pod资源,如果符合最大与最小范围值,可以修改默认的请求与限制资源的值
5、设置指定容器不满足最小CPU请求
vim cpu-constraints-requests.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-min-max-demo-lr
namespace: mem-cpu
spec:
limits:
- max:
cpu: "800m"
min:
cpu: "200m"
type: Container
---
apiVersion: v1
kind: Pod
metadata:
name: constraints-cpu-demo
namespace: mem-cpu
spec:
containers:
- name: constraints-cpu-demo-ctr
image: nginx
resources:
limits:
cpu: "800m"
requests:
cpu: "100m" #小于
kubectl delete -f cpu-constraints-init.yaml && \
kubectl apply -f cpu-constraints-requests.yaml
6、设置指定容器超过最大CPU 限制的 Pod
vim cpu-constraints-limits.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-min-max-demo-lr
namespace: mem-cpu
spec:
limits:
- max:
cpu: "800m"
min:
cpu: "200m"
type: Container
---
apiVersion: v1
kind: Pod
metadata:
name: constraints-cpu-demo
namespace: mem-cpu
spec:
containers:
- name: constraints-cpu-demo-ctr
image: nginx
resources:
limits:
cpu: "1.5"
requests:
cpu: "500m"
kubectl delete -f cpu-constraints-requests.yaml
kubectl apply -f cpu-constraints-limits.yaml
总结:
1、若Pod不设置请求值与限制值,Pod容器CPU的请求与限制值为最大约束值
2、设置 请求小于默认值,Pod容器CPU的请求为最小值但限制值依旧为默认限制值
3、设置 限制超过默认值,Pod容器CPU的请求和限制值都为超过值
如上测试可以总结 容器设定的请求值、限制值,当符合对名称空间下的资源最大到最小的范围值,不过当多个设定的资源设定也有个上限,对此可以对名称空间做资源的限定。 接下来引入新的概念对命名空间内存和 CPU 配额。
五、为命名空间配置内存和 CPU 配额
vim quota-mem-cpu.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
namespace: mem-cpu
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
---
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo
namespace: mem-cpu
spec:
containers:
- name: quota-mem-cpu-demo-ctr
image: nginx
resources:
limits:
memory: "800Mi"
cpu: "800m"
requests:
memory: "600Mi"
cpu: "400m"
kubectl get resourcequotas -n mem-cpu
计算下剩下的资源:
requests.cpu: 600m
requests.memory: 400Mi
limits.cpu: 1200m
limits.memory: 1200Mi
创建第二个 Pod
vim quota-mem-cpu2.yaml
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo-2
namespace: mem-cpu
spec:
containers:
- name: quota-mem-cpu-demo-2-ctr
image: redis
resources:
limits:
memory: "1Gi"
cpu: "800m"
requests:
memory: "700Mi"
cpu: "400m"
kubectl apply -f quota-mem-cpu2.yaml
创建第三个 Pod
vim quota-mem-cpu2.yaml
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo-2
namespace: mem-cpu
spec:
containers:
- name: quota-mem-cpu-demo-2-ctr
image: redis
resources:
limits:
memory: "2Gi"
cpu: "800m"
requests:
memory: "400Mi"
cpu: "400m"
总结:
1、设置了名称空间的资源配,当请求内存、CPU 或者 限制内存、CPU 超过指定的配额,将无法分配资源空间给相应的Pod,造成Pod无法创建