kubernetes之配置namespace中内存最大最小值约束
简介
此文档讲述在namaspace中,将正在运行的容器配置最小使用内存及最大使用内存内存。在LimitRange
对象中设置最小和对大内存值约束后,如果Pod不满足约束条件,Pod不会被创建。
备注:此文档参考官方文档,并加以自己的理解。如有误导性的内容,请批评指正。
指定namespace中最大内存和最小内存值
创建namespace
# kubectl create namespace constraints-mem-example
创建Pod资源设置最大内存为1Gi
,最小内存为500Mi
。文件名:memory-constraints.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: mem-min-max-demo-lr
spec:
limits:
- max:
memory: 1Gi
min:
memory: 500Mi
type: Container
创建 LimitRange
对象
# kubectl apply -f memory-constraints.yaml --namespace=constraints-mem-example
查看LimitRange
资源详情
# kubectl get limitrange mem-min-max-demo-lr --namespace=constraints-mem-example --output=yaml
从输出中可以看出,默认内存请求数为1Gi
、内存限制数1Gi
、内存最小值为500Mi
,内存最大值为1Gi
limits:
- default:
memory: 1Gi
defaultRequest:
memory: 1Gi
max:
memory: 1Gi
min:
memory: 500Mi
type: Container
只要在创建的constraints-mem-example
namespace中创建的容器,Kubernetes执行步骤如下:
- 如果容器没有自定义自己的内存请求数和限制数,将会使用默认值
- 确认容器的内存请求数是否大于或等于默认值
500Mi
- 确认容器的内存限制数是否小于或等于默认值
1Gi
如果超过或小于约束条件,容器不会被创建。
定义容器内存请求数、限制数在约束条件内的容器
创建一个Pod,设置内存请求数为800Mi
,限制数为800Mi
。文件名:memory-constraints-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: constraints-mem-demo
spec:
containers:
- name: constraints-mem-demo-ctr
image: nginx
resources:
limits:
memory: "800Mi"
requests:
memory: "600Mi"
# kubectl apply -f /root/k8s-example/namespace/memory-constraints-pod.yaml --namespace=constraints-mem-example
查看Pod状态,确认Pod正在运行
# kubectl get pod constraints-mem-demo --namespace=constraints-mem-example
查看Pod资源信息
# kubectl get pod constraints-mem-demo --output=yaml --namespace=constraints-mem-example
从输出结果可以看出,Pod的内存请求数为800Mi
,限制数为600Mi
。
resources:
limits:
memory: 800Mi
requests:
memory: 600Mi
删除该Pod资源
# kubectl delete pod constraints-mem-demo --namespace=constraints-mem-example
定义Pod内存限制数大于约束条件最大内存的容器
创建一个Pod,设置内存限制数为1.5Gi
,内存请求数为800Mi
。文件名为:memory-constraints-pod-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: constraints-mem-demo-2
spec:
containers:
- name: constraints-mem-demo-2-ctr
image: nginx
resources:
limits:
memory: "1.5Gi"
requests:
memory: "800Mi"
# kubectl apply -f /root/k8s-example/namespace/memory-constraints-pod-2.yaml --namespace=constraints-mem-example
输出结果为:
Error from server (Forbidden): error when creating "/root/k8s-example/namespace/memory-constraints-pod-2.yaml": pods "constraints-mem-demo-2" is forbidden: maximum memory usage per Container is 1Gi, but limit is 1536Mi
定义Pod内存请求数小于约束条件最小内存的容器
创建一个Pod,设置内存限制数为800Mi
,内存请求数为100Mi
。文件名为:memory-constraints-pod-3.yaml
apiVersion: v1
kind: Pod
metadata:
name: constraints-mem-demo-3
spec:
containers:
- name: constraints-mem-demo-3-ctr
image: nginx
resources:
limits:
memory: "800Mi"
requests:
memory: "100Mi"
# kubectl apply -f /root/k8s-example/namespace/memory-constraints-pod-3.yaml --namespace=constraints-mem-example
输出结果为:
Error from server (Forbidden): error when creating "/root/k8s-example/namespace/memory-constraints-pod-3.yaml": pods "constraints-mem-demo-3" is forbidden: minimum memory usage per Container is 500Mi, but request is 100Mi
创建Pod不指定内存请求数和内存限制数
创建Pod资源,文件名:memory-constraints-pod-4.yaml
apiVersion: v1
kind: Pod
metadata:
name: constraints-mem-demo-4
spec:
containers:
- name: constraints-mem-demo-4-ctr
image: nginx
# kubectl apply -f /root/k8s-example/namespace/memory-constraints-pod-4.yaml --namespace=constraints-mem-example
查看Pod资源信息
# kubectl get pod constraints-mem-demo-4 --namespace=constraints-mem-example --output=yaml
从输出可以看出,由于容器没有指定内存请求数和限制数,因此,将会设置为LimitRange
对象中定义的资源默认值
resources:
limits:
memory: 1Gi
requests:
memory: 1Gi
删除pod资源
# kubectl delete pod constraints-mem-demo-4 --namespace=constraints-mem-example
实验完毕,删除namespace
# kubectl delete namespace constraints-mem-example
总结
1、在namespace中,可设置内存的最大最小值约束条件,不满足约束条件的任何Pod将不会被创建。
2、namespace中通过LimitRange
创建的最大最小CPU约束条件只对即将被创建的容器
或将要更新的容器
生效。如果改变了LimitRange
中的约束条件,不会影响已经创建的Pod。
3、使用最大最小内存约束条件的情况如下:
- k8s集群中,如果每个node的内存只有2GB,不能接受任何内存资源请求超过2GB的Pod被创建,可以设置约束条件
- 如果生产环境和开发环境共用一个k8s
集群,而且想要生产环境工作负载消耗的内存多达8GB,开发环境工作负载消耗的内存限制在512MB,可以创建两个不同的namespace,例如production
和development
,给每个namespace创建一个内存约束条件。