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

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