Kubernetes theory
March 27, 2023

LimitRange

LimitRange помогает задать рамки и значения по умолчанию для запросов и лимитов на ресурсы для всего namespace. При этом надо помнить, что записанные ограничения на уровне конкретных ресурсов имеют больший приоритет.

Особенности.

  1. Устанавливается на namespace;
  2. При создании ограничивает ресурсы, которые можно установить для пода, контейнера, PVC.

Пример ограничения ресурсов для подов.

cat <<EOF | kubectl apply --validate=false -f -
apiVersion: v1
kind: LimitRange
metadata:
  name: cam-limits
  namespace: default
  labels:
    limit: pod
    environment: prod
  annotations:
    author: cameda
spec:
  limits:
  - type: Pod
    min:
      cpu: 100m
      memory: 100Mi
    max:
      cpu: 300m
      memory: 300Mi
EOF

Мы не сможем создать под, чей запрос на ресурсы (requests) меньше, чем указано в блоке min (cpu: 100m, 100Mi) и чьи лимиты (limits) указаны больше, чем в блоке max (cpu: 300m, 300Mi).

Следующий под будет создан:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: cam-nginx1
  namespace: default
  labels:
    app: nginx
    environment: prod
  annotations:
    author: cameda
spec:
  containers:
  - name: nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent
    resources:
      requests:
        cpu: 150m
        memory: 150Mi
      limits:
        cpu: 300m
        memory: 300Mi
    ports:
    - containerPort: 80
    - containerPort: 443
  restartPolicy: Always
  hostname: nginx
  subdomain: web
EOF

А манифест ниже не запустится, потому что в limits указано большее значение, чем установлено лимитом в LimitRange:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: cam-nginx1
  namespace: default
  labels:
    app: nginx
    environment: prod
  annotations:
    author: cameda
spec:
  containers:
  - name: nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent
    resources:
      requests:
        cpu: 150m
        memory: 150Mi
      limits:
        cpu: 400m
        memory: 400Mi
    ports:
    - containerPort: 80
    - containerPort: 443
  restartPolicy: Always
  hostname: nginx
  subdomain: web
EOF

Будет выдана ошибка:

Error from server (Forbidden): error when creating "STDIN": pods "cam-nginx1" is forbidden: [maximum cpu usage per Pod is 300m, but limit is 400m, maximum memory usage per Pod is 300Mi, but limit is 419430400]

Пример ограничения для нескольких ресурсов.

cat <<EOF | kubectl apply --validate=false -f -
apiVersion: v1
kind: LimitRange
metadata:
  name: cam-limits
  namespace: default
  labels:
    limit: nginx
    environment: prod
  annotations:
    author: cameda
spec:
  limits:
  - type: Pod
    min:
      cpu: 50m
      memory: 50Mi
    max:
      cpu: 1
      memory: 1Gi
  - type: Container
    defaultRequest:
      cpu: 20m
      memory: 20Mi
    default:
      cpu: 200m
      memory: 100Mi
    min:
      cpu: 20m
      memory: 20Mi
    max:
      cpu: 1
      memory: 1Gi
    maxLimitRequestRatio:
      cpu: 4
      memory: 10
  - type: PersistentVolumeClaim
    min:
      storage: 500Mi
    max:
      storage: 10Gi
EOF

Посмотреть информацию по LimitRange.

kubectl get limits
kubectl describe limits cam-limits
Name:                  cam-limits
Namespace:             default
Type                   Resource  Min    Max   Default Request  Default Limit  Max Limit/Request Ratio
----                   --------  ---    ---   ---------------  -------------  -----------------------
Pod                    cpu       50m    1     -                -              -
Pod                    memory    50Mi   1Gi   -                -              -
Container              cpu       20m    1     20m              200m           4
Container              memory    20Mi   1Gi   20Mi             100Mi          10
PersistentVolumeClaim  storage   500Mi  10Gi  -                -              -

Полезные ссылки.

https://kubernetes.io/docs/concepts/policy/limit-range/