1 Kubernetes对资源的限制
在Kubernetes中,对资源(CPU、内存等)的限制,需要定义在yaml中,以Deployment举例:
apiVersion: v1
kind: Pod
metadata:
name: cpu-overload
namespace: test
spec:
containers:
- name: cpu-overload
image: stress/stress:latest
resources:
limits:
cpu: "2"
memory: 1000Mi
requests:
cpu: "1"
memory: 500Mi
command: ["stress"]
args: ["-c", "2"]
其中,CPU 有2个限制:
- requests:相对限制,是容器的最低申请资源,这个限制是相对的,无法做到绝对严格。
- limits:绝对限制,这个是限制的绝对的,不可能超越。
本例中,对容器cpu-overload的 CPU 的限制,是,申请1个核的运算资源,最多可以使用2个核。
这里需要特别说明一点,所谓的最多2个核,其实是均摊的,如果这个容器真的触发了计算瓶颈,在docker中看,CPU使用率是200%,但在宿主机去看,其实并非是将2个核占满了,而是将压力分摊到了多个CPU的核上。
对Kubernetes来说,只能做到限制容器资源,无法对pod资源做限制,Kubernetes官方认为,要计算一个pod的资源限制,将pod中各个容器的资源做加和就行了。
2 资源限制的传递
Kubernetes其实可以认为是一系列组件包装起来的一个大型工具。关于资源限制,其实Kubernetes自己做不了这些,而是将对资源限制,通过yaml中的定义,传递到Docker容器中。比如,之前我们在Deployment中容器的CPU,限制为最多使用2个核,这个限制,Kubernetes会传递给Docker来做,所以本质上,Kubernetes资源的限制能力,来源于Docker,而Docker能做到什么程度的限制,又取决于Linux的cgroups,所以在很早之前的Docker是不支持在Windows平台运行的,归根结底,还是因为cgroups是Linux内核支持的产物。
说了这么多,我们可以通过一个实例来说明这个传递性。在开始前,简单说一下步骤:
- 1、在Kubernetes中启动一个单独的pod,资源限制为最多4个CPU核。
- 2、找到这个pod对应的容器,看一下容器的运行配置,是 不是限制了4个核。
- 3、找到这个容器对应的Cgroups配置,看是否对容器限制了4个核。3、实验
2.1 创建一个限制了1个核的pod
apiVersion: v1
kind: Pod
metadata:
labels:
system: centos7
name: centos7
namespace: test
spec:
containers:
- image: centos:7
imagePullPolicy: IfNotPresent
name: centos7
command: [ "/bin/bash", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]
ports:
- containerPort: 30008
hostPort: 30008
name: http
protocol: TCP
resources:
limits:
cpu: "1"
memory: 2000Mi
requests:
cpu: "0.1"
memory: 100Mi
hostNetwork: true
restartPolicy: Always
在这个ya