为命名空间配置默认的CPU请求和限制

本文来自k8s官网:https://kubernetes.io/zh/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/

本章介绍怎样为命名空间配置默认的CPU请求和限制。一个k8s集群可以被划分为多个命名空间。如果在配置了CPU限制的命名空间创建容器,并且该容器没有声明自己的CPU限制,那么这个容器会被指定默认的CPU限制。k8s在一些特定情况还会指定CPU请求,本文后续章节会对七进行解释

一、准备开始

准备一个k8s集群,并且已经安装kubelet

查看k8s版本信息,请使用kubectl version

二、创建命名空间

创建一个名称空间,以便于联系中创建的资源和其余部分相隔离

 kubectl create ns qzw-test2

创建LimitRange和Pod

这里给出了一个LimitRange对象的文件,该配置声明了一个默认的CPU请求和一个默认的CPU限制

[root@kube-master-1 ~/qzw-yaml]$ cat cpu-defaults.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-limit-range
spec:
  limits:
  - default:
      cpu: 1
    defaultRequest:
      cpu: 0.5
    type: Container

在名称空间qzw-test2上创建LimitRange对象

kubectl create -f cpu-defaults.yaml -n qzw-test2

现在如果在qzw-test2上创建一个容器,该容器没有声明自己的CPU请求和限制时,将使用默认的CPU请求0.5和默认的CPU限制值1

下面是一个创建Pod的配置文件,没有声明CPU的请求和和限制

[root@kube-master-1 ~/qzw-yaml]$ cat cpu-defaults-pod.yaml
apiVersion: v1
kind: Pod
metadata: 
  name: defaults-cpu-demo
spec:
  containers:
  - name: default-cpu-demo-ctr
    image: nginx

创建Pod

kubectl create -f cpu-defaults-pod.yaml -n qzw-test2

现在查看该Pod的声明

[root@kube-master-1 ~/qzw-yaml]$ kubectl get pod/defaults-cpu-demo -o yaml -n qzw-test2
...
containers:
- image: nginx
  imagePullPolicy: Always
  name: default-cpu-demo-ctr
  resources:
    limits:
      cpu: "1"
    requests:
      cpu: 500m
  terminationMessagePath: /dev/termination-log
  terminationMessagePolicy: File
  volumeMounts:
  - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
    name: default-token-t9jcw
    readOnly: true
...

可以看到,cpu的请求和限制都是namespace的默认值

三、只声明容器的请求,而不声明它的限制会怎么样

下面配置文件中该容器声明了CPU请求是0.75,但是没有声明CPU限制

[root@kube-master-1 ~/qzw-yaml]$ cat cpu-defaults-pod-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: defaults-cpu-demo-2
spec:
  containers:
  - name: defaults-cpu-demo-2-ctr
    image: nginx
    resources:
      requests:
        cpu: "0.75"

创建Pod

kubectl create -f cpu-defaults-pod-2.yaml -n qzw-test2

查看该Pod的声明,可以看到,最大值被限制为1,也就是ns的默认最大限制

[root@kube-master-1 ~/qzw-yaml]$ kubectl get pod/defaults-cpu-demo-2 -n qzw-test2 -o yaml
...
containers:
- image: nginx
  imagePullPolicy: Always
  name: defaults-cpu-demo-2-ctr
  resources:
    limits:
      cpu: "1"
    requests:
      cpu: 750m
  terminationMessagePath: /dev/termination-log
  terminationMessagePolicy: File
  volumeMounts:
  - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
    name: default-token-t9jcw
    readOnly: true
...

四、只声明容器的限制,而不声明容器的请求

看配置文件

[root@kube-master-1 ~/qzw-yaml]$ cat cpu-defaults-pod-3.yaml
apiVersion: v1
kind: Pod
metadata:
  name: defaults-cpu-demo-3
spec:
  containers:
  - name: defaults-cpu-demo-3-ctr
    image: nginx
    resources:
      limits:
        cpu: "1"

创建Pod

kubectl create -f cpu-defaults-pod-3.yaml -n qzw-test2

看下Pod的声明:可以看到,只声明最大CPU限制时,那它的请求也是这么大

[root@kube-master-1 ~/qzw-yaml]$ kubectl get pod/defaults-cpu-demo-3 -n qzw-test2 -o yaml
...
containers:
- image: nginx
  imagePullPolicy: Always
  name: defaults-cpu-demo-3-ctr
  resources:
    limits:
      cpu: "1"
    requests:
      cpu: "1"
  terminationMessagePath: /dev/termination-log
  terminationMessagePolicy: File
  volumeMounts:
  - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
    name: default-token-t9jcw
    readOnly: true
...

五、默认CPU限制和请求的动机

如果你的命名空间有一个资源配额,那么有一个默认的CPU限制是有帮助的。这里有两条资源配额强加给命名空间限制:

  • 命名空间中运行的每个容器必须有自己的CPU限制
  • 命名空间中所有容器使用的CPU总和不能超过一个声明值

如果容器没有声明自己的CPU限制,将会给它一个默认限制,这样就允许它被运行在一个有配额限制的命名空间中