kubernetes之配置namespace中CPU最大最小值约束

简介

此文档讲述在namaspace中,将正在运行的容器配置最小使用CPU及最大使用内存CPU。在LimitRange对象中设置最小和对大CPU值约束后,如果Pod不满足约束条件,Pod不会被创建。

备注:此文档参考官方文档,并加以自己的理解。如有误导性的内容,请批评指正。

指定namespace中最大CPU和最小CPU值

创建namespace

# kubectl create namespace constraints-cpu-example

创建LimitRange对象,文件名:cpu-constraints.yaml

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-min-max-demo-lr
spec:
  limits:
  - max:
      cpu: "800m"
    min:
      cpu: "200m"
    type: Container
# kubectl apply -f /root/k8s-example/namespace/cpu-constraints.yaml --namespace=constraints-cpu-example

查看LimitRange详情

# kubectl get limitrange cpu-min-max-demo-lr --output=yaml --namespace=constraints-cpu-example

从结果可以看出,容器的默认CPU请求数是800m,默认限制数200m;最小CPU值为200m,最大CPU值为800m

limits:
- default:
    cpu: 800m
  defaultRequest:
    cpu: 800m
  max:
    cpu: 800m
  min:
    cpu: 200m
  type: Container

constraints-cpu-examplenamespace中,只要容器被创建,kubernetes将会执行如下步骤:

  • 检查容器是否有自定义的CPU请求数和限制数,如果没有,将使用默认的CPU请求数和限制数
  • 确认容器自定义的CPU请求数是否大于或等于200m
  • 确认容器自定义的CPU限制数是否小于或等于800m

如果超过或小于约束条件,容器不会被创建。

定义容器CPU请求数、限制数在约束条件内的容器

创建Pod,配置容器的CPU限制数为800m,请求数为:500m。文件名cpu-constraints-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: constraints-cpu-demo
spec:
  containers:
  - name: constraints-cpu-demo-ctr
    image: nginx
    resources:
      limits:
        cpu: "800m"
      requests:
        cpu: "500m"

创建Pod

# kubectl apply -f /root/k8s-example/namespace/cpu-constraints-pod.yaml --namespace=constraints-cpu-example

确认Pod正在运行:

# kubectl apply -f /root/k8s-example/namespace/cpu-constraints-pod.yaml --namespace=constraints-cpu-example

查看Pod资源信息

# kubectl get pod constraints-cpu-demo --output=yaml --namespace=constraints-cpu-example

从结果可以看出CPU限制数为800m,请求数为:500m

resources:
  limits:
    cpu: 800m
  requests:
    cpu: 500m

删除Pod

# kubectl delete pod constraints-cpu-demo --namespace=constraints-cpu-example

定义Pod的CPU限制数大于约束条件最大CPU值的容器

创建Pod,文件名:cpu-constraints-pod-2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: constraints-cpu-demo-2
spec:
  containers:
  - name: constraints-cpu-demo-2-ctr
    image: nginx
    resources:
      limits:
        cpu: "1.5"
      requests:
        cpu: "500m"
# kubectl apply -f /root/k8s-example/namespace/cpu-constraints-pod-2.yaml --namespace=constraints-cpu-example

输出结果如下,Pod创建失败

Error from server (Forbidden): error when creating "/root/k8s-example/namespace/cpu-constraints-pod-2.yaml": pods "constraints-cpu-demo-2" is forbidden: maximum cpu usage per Container is 800m, but limit is 1500m

定义Pod的CPU请求数小于约束条件最小CPU值的容器

创建Pod,文件名:cpu-constraints-pod-3.yaml

apiVersion: v1
kind: Pod
metadata:
  name: constraints-cpu-demo-3
spec:
  containers:
  - name: constraints-cpu-demo-3-ctr
    image: nginx
    resources:
      limits:
        cpu: "800m"
      requests:
        cpu: "100m"
# kubectl apply -f /root/k8s-example/namespace/cpu-constraints-pod-3.yaml --namespace=constraints-cpu-example

输出结果如下,容器创建失败。

Error from server (Forbidden): error when creating "/root/k8s-example/namespace/cpu-constraints-pod-3.yaml": pods "constraints-cpu-demo-3" is forbidden: minimum cpu usage per Container is 200m, but request is 100m

创建Pod不指定CPU请求数和内存限制数

创建Pod,文件名为:cpu-constraints-pod-4.yaml

apiVersion: v1
kind: Pod
metadata:
  name: constraints-cpu-demo-4
spec:
  containers:
  - name: constraints-cpu-demo-4-ctr
    image: vish/stress
# kubectl apply -f /root/k8s-example/namespace/cpu-constraints-pod-4.yaml --namespace=constraints-cpu-example

查看Pod资源信息

kubectl get pod constraints-cpu-demo-4 --namespace=constraints-cpu-example --output=yaml

从结果可以看出,不指定Pod的CPU请求数和限制数,将会使用默认的CPU请求数和限制数

resources:
  limits:
    cpu: 800m
  requests:
    cpu: 800m

从上可以看出,自定义CPU资源的Pod可能能正常运行,可能不能运行。如果kubernetes集群中,每个node节点的只有1个CPU,则任何节点上可能没有足够的可分配CPU来容纳800m的请求,如果每个node节点的CPU恰好有2个CPU,则有足够的CPU容纳800m的CPU请求。

删除Pod

# kubectl delete pod constraints-cpu-demo-4 --namespace=constraints-cpu-example

实验完毕,删除namespace

# kubectl delete namespace constraints-cpu-example

总结

1、在namespace中,可设置CPU的最大最小值约束条件,不满足约束条件的任何Pod将不会被创建。

2、namespace中通过LimitRange创建的最大最小CPU约束条件只对即将被创建的容器将要更新的容器生效。如果改变了LimitRange中的约束条件,不会影响已经创建的Pod。

3、使用最大最小CPU约束条件的情况如下:

  • 如果集群中每个node节点只有2个CPU,不想让Pod的CPU请求数大于2个CPU,因为集群中任何一个node都无法支持CPU请求数超过2个CPU的Pod。
  • 如果生产环境和开发环境共用一个k8s 集群,而且想要生产环境工作负载消耗的内存多达3个CPU,开发环境工作负载消耗的内存限制在1个CPU,可以创建两个不同的namespace,例如production和development,给每个namespace创建一个内存约束条件。
posted @ 2020-01-19 16:33  McSiberiaWolf  阅读(464)  评论(0编辑  收藏  举报