跳转至

Kubernetes 资源限制范围


2020-04-15 by dongnan

开始之前

在前面的三篇文章中,至此我们已经准备好了K8S集群环境。

接下来我们将以在K8S集群运行一个真实的项目为目标,依次介绍项目所使用的K8S资源对象。

这个项目是一个典型的Web系统,使用 Java Spring Boot框架开发,需要使用 MySqlRedis数据库、NFS共享存储(多个Pod容器间共享文件)。

由于K8S环境部署在阿里云上,所以这里使用了阿里云提供的 RDS-MysqlRDS-Redis 数据库服务、NAS(NFS) 网络附加存储等中间件产品,对于K8S集群来说,我们需要将这些服务映射为K8S的资源对象。

项目使用的K8S的资源对象包括:

环境

测试的k8s集群由一个Master管理节点、两个Worker计算节点组成,详细请参考这里

目标

某些情况下一个 Pod或者 Container 可能会占用宿主机全部的资源,可以使用 LimitRange 限制范围策略,在命名空间内限制多个 PodContainer 资源分配规则。

举个栗子

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 资源配额以命名空间为单位,限制 PodContainer 最多能够使用命名空间的资源配额所定义的 CPU 和内存资源。 LimitRange 是在命名空间内限制资源分配(多个PodContainer)的策略对象。

LimitRange 有以下功能:

  • 在一个命名空间中对每个 PodContainer 最小和最大的资源使用量的限制。
  • 在一个命名空间中对一种资源的申请值和限制值的比值的控制。
  • 设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个 Container 中。

此外 LimitRange 还可以使用 MinMaxMax Limit/Request Ratio 等参数,设置不同的资源限制策略, 也支持 PersistentVolumeClaim 存储空间大小限制,更多参数选项说明请参考 kubernetes 官方文档

小结

  • 通过配置资源 RequestLimits 可以限制Pod(容器)的资源使用,但是为每一个Pod配置 RequestLimits是很麻烦的,通过LimitRange 策略可以化繁为简。
  • 只有 Container 类型的LimitRange,才可以设置 Default RequestDefault Limit 参数,而 Pod 类型是不能设置这两个参数的。
  • LimitRange 对象,只会在创建(更新)Pod等资源时触发,改变 LimitRange 规则不会影响任何已经创建的资源。

参考

回到页面顶部