Kubernetes 资源限制范围
2020-04-15 by dongnan
开始之前
在前面的三篇文章中,至此我们已经准备好了K8S
集群环境。
接下来我们将以在K8S
集群运行一个真实的项目为目标,依次介绍项目所使用的K8S
资源对象。
这个项目是一个典型的Web
系统,使用 Java Spring Boot
框架开发,需要使用 MySql
、Redis
数据库、NFS
共享存储(多个Pod
容器间共享文件)。
由于K8S
环境部署在阿里云上,所以这里使用了阿里云提供的 RDS-Mysql
、RDS-Redis
数据库服务、NAS(NFS)
网络附加存储等中间件产品,对于K8S
集群来说,我们需要将这些服务映射为K8S
的资源对象。
项目使用的K8S
的资源对象包括:
- PV&PVC,用于Pod数据卷(NFS)。
- Pod (volumeMounts、readinessProbe),挂载数据卷、健康检查。
- Secret,存储机密数据。
- Service,服务-外部域名(ExternalName)。
- NetworkPolicy,网络策略。
- LimitRange,限制资源。
- Ingress
环境
测试的k8s
集群由一个Master
管理节点、两个Worker
计算节点组成,详细请参考这里。
目标
某些情况下一个 Pod
或者 Container
可能会占用宿主机全部的资源,可以使用 LimitRange
限制范围策略,在命名空间内限制多个 Pod
或 Container
资源分配规则。
举个栗子
Yaml文档
定义 yyi-limit
的资源限制范围:
---
apiVersion: v1
kind: LimitRange
metadata:
name: yyi-limit
namespace: yyi-prod
spec:
limits:
- default:
cpu: "1000m"
memory: "3072Mi"
defaultRequest:
cpu: "100m"
memory: "512Mi"
type: Container
这个 LimitRange
对象的作用如下:
- 对
yyi-prod
命名空间中所有的Pod
对象有效。 - 保证命名空间内的
Container
容器使用的资源(下限),0.1
个CPU、512M
内存。 - 限制命名空间内的
Container
容器使用的资源(上限),1
个CPU、3G
内存。
创建 LimitRange
kubectl apply -f yii-limits.yaml
验证 LimitRange
查看 LimitRange
详细信息:
kubectl -n yyi-prod describe limitranges yyi-limit
Name: yyi-limit
Namespace: yyi-prod
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container cpu - - 100m 1 -
Container memory - - 256Mi 3Gi
创建Pod
容器时,LimitRange
对象自动注入到Pod
容器:
kubectl -n yyi-prod describe pod yyi-server-78xx94d-gxxxr
Name: yyi-server-78xx94d-gxxxr
Namespace: yyi-prod
#...省略
Containers:
yyi-server:
#...省略
Limits: # 这里对应资源上限
cpu: 1
memory: 3Gi
Requests: # 这里对应资源下限
cpu: 100m
memory: 256Mi
Readiness: tcp-socket :8080 delay=25s timeout=5s period=10s #success=3 #failure=3
Environment:
logtail: true
JAVA_OPTS: -Xmx2000m
#...省略
可以看到创建的Pod
容器已经使用了定义的LimitRange
对象。
LimitRange
默认情况下 Kubernetes
集群上的容器运行使用的计算资源没有限制。
使用 LimitRange
资源配额以命名空间为单位,限制 Pod
或 Container
最多能够使用命名空间的资源配额所定义的 CPU
和内存资源。
LimitRange
是在命名空间内限制资源分配(多个Pod
或Container
)的策略对象。
LimitRange
有以下功能:
- 在一个命名空间中对每个
Pod
或Container
最小和最大的资源使用量的限制。 - 在一个命名空间中对一种资源的申请值和限制值的比值的控制。
- 设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个
Container
中。
此外 LimitRange
还可以使用 Min
、Max
、Max Limit/Request Ratio
等参数,设置不同的资源限制策略,
也支持 PersistentVolumeClaim
存储空间大小限制,更多参数选项说明请参考 kubernetes 官方文档 。
小结
- 通过配置资源
Request
和Limits
可以限制Pod(容器)的资源使用,但是为每一个Pod配置Request
和Limits
是很麻烦的,通过LimitRange
策略可以化繁为简。 - 只有
Container
类型的LimitRange
,才可以设置Default Request
和Default Limit
参数,而Pod
类型是不能设置这两个参数的。 LimitRange
对象,只会在创建(更新)Pod
等资源时触发,改变LimitRange
规则不会影响任何已经创建的资源。