K8s LimitRange

作者: AlienPaul | 来源:发表于2020-02-17 10:51 被阅读0次

什么是LimitRange

LimitRange是在namespace范围内,限制pod或container资源使用量的策略。

LimitRange可以:

  • 限制namespace中每个pod或container的最小和最大资源用量。
  • 限制namespace中每个PVC的资源请求范围。
  • 限制namespace中资源请求和限制数量的比例。
  • 配置资源的默认限制。

使用LimitRange

默认来说k8s集群已启用LimitRange。创建LimitRange之后,LimitRange会在它所属namespace范围内生效。

使用概览

  1. 管理员创建一个LimitRange。
  2. 用户在namespace中创建pod,PVC等资源对象。
  3. 对于该namespace中所有没有配置资源使用限制的资源对象,第一步创建的LimitRange对他们生效。
  4. 如果创建的资源对象违反LimitRange的限制,k8s APIServer会给出403 FORBIDDEN。
  5. 如果namespace中配置了LimitRange,限制了类似cpu和内存等计算资源,用户必须指明这些限制的值,否则k8s可能拒绝pod。
  6. LimitRange在pod admission阶段检查,pod运行阶段不会检查。

注意:对于已经运行的pod,不存在资源竞争问题,LimitRange的修改对他们也不生效。只有在pod创建时LimitRange才有效。

使用LimitRange限制Container的资源使用

如下的例子建立了一个LimitRange资源对象,用来限制container使用的资源。

apiVersion: v1
kind: LimitRange
metadata:
  name: limit-mem-cpu-per-container
spec:
  limits:
  - max:
      cpu: "800m"
      memory: "1Gi"
    min:
      cpu: "100m"
      memory: "99Mi"
    default:
      cpu: "700m"
      memory: "900Mi"
    defaultRequest:
      cpu: "110m"
      memory: "111Mi"
    type: Container

查看LimitRange

kubectl describe limitrange/limit-mem-cpu-per-container

创建限制资源使用的pod

apiVersion: v1
kind: Pod
metadata:
  name: busybox1
spec:
  containers:
  - name: busybox-cnt01
    image: busybox
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo hello from cnt01; sleep 10;done"]
    resources:
      requests:
        memory: "100Mi"
        cpu: "100m"
      limits:
        memory: "200Mi"
        cpu: "500m"
  - name: busybox-cnt02
    image: busybox
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo hello from cnt02; sleep 10;done"]
    resources:
      requests:
        memory: "100Mi"
        cpu: "100m"
  - name: busybox-cnt03
    image: busybox
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo hello from cnt03; sleep 10;done"]
    resources:
      limits:
        memory: "200Mi"
        cpu: "500m"
  - name: busybox-cnt04
    image: busybox
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo hello from cnt04; sleep 10;done"]

获取container的资源限制信息

kubectl get po/busybox1 -n limitrange-demo -o json | jq ".spec.containers[0].resources"

最终pod资源限制的处理机制

  • 如果pod配置了请求和限制,并且请求和限制的值位于LimitRange对应类型资源的min和max之间。pod资源限制采用pod的配置。
  • 如果pod配置了请求但没有配置限制,pod限制会采用LimitRange中的默认配置。
  • 如果pod配置了限制但没有配置请求,pod请求会使用和limit相同的配置。
  • 如果pod既没有配置请求又没有配置限制,pod限制使用LimitRange定义的默认配置,请求使用defaultRequest的配置。

使用LimitRange限制Pod的资源使用

创建LimitRange是,将type的值指定为Pod即可。

apiVersion: v1
kind: LimitRange
metadata:
  name: limit-mem-cpu-per-pod
spec:
  limits:
  - max:
      cpu: "2"
      memory: "2Gi"
    type: Pod

注意:pod类型的LimitRange会检查之后创建的pod中所有container配置的资源限制总和,如果pod内所有container的资源限制总和超过了LimitRange的限制,pod创建会被拒绝。

使用LimitRange限制PVC的资源使用

一个例子如下所示:

apiVersion: v1
kind: LimitRange
metadata:
  name: storagelimits
spec:
  limits:
  - type: PersistentVolumeClaim
    max:
      storage: 2Gi
    min:
      storage: 1Gi

这个例子限制了PVC的最小存储请求和最大资源请求量。

使用LimitRange控制limit/request比例

LimitRange还可以控制资源限制量和请求量的最大比例,即limit/request要求小于等于maxLimitRequestRatio。

apiVersion: v1
kind: LimitRange
metadata:
  name: limit-memory-ratio-pod
spec:
  limits:
  - maxLimitRequestRatio:
      memory: 2
    type: Pod

这个例子限制了pod的内存request和limit的比例必须小于等于2。否则pod的创建会被拒绝。

比如创建下面这个pod:

apiVersion: v1
kind: Pod
metadata:
  name: busybox3
spec:
  containers:
  - name: busybox-cnt01
    image: busybox
    resources:
      limits:
        memory: "300Mi"
      requests:
        memory: "100Mi"

这个pod的内存资源的limit/request为3,大于LimitRange中配置的2,不符合要求,不允许创建这个pod。

相关文章

  • K8s LimitRange

    什么是LimitRange LimitRange是在namespace范围内,限制pod或container资源使...

  • K8s ResourceQuota

    ResourceQuota的用途 ResourceQuota和LimitRange类似,都是用于限制namespa...

  • Kubernetes 配置Pod和容器(五)应用资源配额和限制

    演示使用了下面的资源:Namespace, ResourceQuota, 和 LimitRange。 开始之前 你...

  • k8s - Limit Range

    LimitRange(限制范围) 1,介绍 默认情况下, Kubernetes 集群上的容器运行使用的计算资源没有...

  • 什么是k8s,k8s有什么功能?

    介绍:k8s是一个docker集群的管理工具 2.1 k8s的核心功能 2.2 k8s的历史 2.3 k8s的安装...

  • k8s的主要功能

    一、什么是k8s,k8s都有什么功能? k8s是一个docker容器管理工具 二、k8s的核心功能 自愈: 重新启...

  • cloud & HPC

    K8s & HPC k8s in hpc Requirement Hello, Kubernetes newbie...

  • 一键部署kubernetes 1.6高可用集群

    本文主要适合于那些有一定 k8s基础的人, 通过本文你将学到: k8s各组件的交互原理 k8s的集群规划 k8s系...

  • k8s专题目录

    初阶k8s集群搭建 高阶k8s HA 集群搭建(一) 高阶k8s HA 集群搭建(二) docker镜像私有仓库搭...

  • Pod内进程访问k8s服务

    Pod内进程访问k8s服务 外部服务可以通过kubeconfig访问k8s服务,那k8s集群内部服务(Pos内服务...

网友评论

    本文标题:K8s LimitRange

    本文链接:https://www.haomeiwen.com/subject/ktqbfhtx.html