为命名空间配置默认的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限制,将会给它一个默认限制,这样就允许它被运行在一个有配额限制的命名空间中