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-examplenamespace中创建的容器,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,例如productiondevelopment,给每个namespace创建一个内存约束条件。
原文地址:https://www.cnblogs.com/mcsiberiawolf/p/12214481.html