Подробное объяснение ResourceQuota пределов ресурсов Kubernetes | Проблемы в августовском обновлении

задняя часть Kubernetes
Подробное объяснение ResourceQuota пределов ресурсов Kubernetes | Проблемы в августовском обновлении

1. Введение

Kubernetes предоставляет два способа ограничения ресурсов:ResourceQuotaиLimitRange.

вResourceQuotaнаправлен наnamespaceсделать ограничения ресурсов, в то время какLimitRangeнаправлен наnamespaceОграничение ресурсов, которое делает каждый компонент.

Когда несколько пространств имен совместно используют один и тот же кластер, квота ресурсов, используемая пространством имен, может превышать его справедливую квоту, что приводит к занятию ресурсов других пространств имен. В настоящее время мы можем создать ResourceQuota для каждого пространства имен,

Когда пользователь создает ресурс в пространстве имен, система квот отслеживает использование, чтобы гарантировать, что ограничение ResourceQuota не превышено. Если создание или обновление ресурса нарушает ограничения квоты, код состояния HTTP приведет к сбою запроса с ошибкой 403 FORBIDDEN. Изменения квот на ресурсы не влияют на уже созданные модули.

Параметры запуска apiserver обычно включены по умолчанию в kubernetes.ResourceQuota, в параметрах запуска аписервера–enable-admission-plugins=в, если естьResourceQuotaначать.

2 использовать

Создайте тест с помощью NS

[~] kubectl create ns testquota
namespace/testquota created
[~] kubectl get ns | grep quota
testquota         Active   3m41s

Создать ресурсную квоту

[yaml] cat resourcequota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: testquota-resources
  namespace: testquota
spec:
  hard:
    pods: "4"
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi
[yaml] kubectl apply -f resourcequota.yaml
resourcequota/testquota-resources created
[yaml] kubectl describe resourcequotas -n testquota testquota-resources
Name:            testquota-resources
Namespace:       testquota
Resource         Used  Hard
--------         ----  ----
limits.cpu       0     2
limits.memory    0     2Gi
pods             0     4
requests.cpu     0     1
requests.memory  0     1Gi

Создайте развертывание и ограничьте ресурсы

[yaml] cat quota-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: testquota
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        resources:
          requests:
            memory: "100Mi"
            cpu: "100m"
          limits:
            memory: "200Mi"
            cpu: "500m"
[yaml] kubectl apply -f quota-deploy.yaml
deployment.apps/nginx-deployment created
[yaml] kubectl get po -n testquota
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7c6bbc77d8-mfxnl   1/1     Running   0          9s

Измените количество реплик развертывания, чтобы общие используемые ресурсы превышали ресурсы, определенные в ResourceQuota.

Сначала проверьте текущее использование ресурсов

[yaml] kubectl describe resourcequotas -n testquota testquota-resources
Name:            testquota-resources
Namespace:       testquota
Resource         Used   Hard
--------         ----   ----
limits.cpu       500m   2
limits.memory    200Mi  2Gi
pods             1      4
requests.cpu     100m   1
requests.memory  100Mi  1Gi

Изменить количество копий

[yaml] kubectl scale deployment -n testquota nginx-deployment --replicas=4
deployment.apps/nginx-deployment scaled
[yaml] kubectl get po -n testquota
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7c6bbc77d8-5mbc6   1/1     Running   0          7s
nginx-deployment-7c6bbc77d8-ld69h   1/1     Running   0          7s
nginx-deployment-7c6bbc77d8-mfxnl   1/1     Running   0          5m18s
nginx-deployment-7c6bbc77d8-sdcxb   1/1     Running   0          7s

Текущее использование ресурсов

[yaml] kubectl describe resourcequotas -n testquota testquota-resources
Name:            testquota-resources
Namespace:       testquota
Resource         Used   Hard
--------         ----   ----
limits.cpu       2      2
limits.memory    800Mi  2Gi
pods             4      4
requests.cpu     400m   1
requests.memory  400Mi  1Gi

Создать другое развертывание

[yaml] kubectl apply -f quota-deploy-2.yaml
deployment.apps/nginx2-deployment created
[yaml] kubectl get deployment -n testquota
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment    4/4     4            4           7m48s
nginx2-deployment   0/1     0            0           34s

Видно, что хотя развертывание было успешно создано, соответствующий pod не был создан.Вы можете просмотреть ошибку развертывания

[yaml] kubectl describe deployments -n testquota nginx2-deployment
Name:                   nginx2-deployment
Namespace:              testquota
...
Replicas:               1 desired | 0 updated | 0 total | 0 available | 1 unavailable
NewReplicaSet:     nginx2-deployment-7c6bbc77d8 (0/1 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  98s   deployment-controller  Scaled up replica set nginx2-deployment-7c6bbc77d8 to 1

Видно, что модуль не может быть создан, поскольку сумма созданных модулей превысила общий лимит ресурсов пространства имен.

3 распространенных типа ресурсов

Имя ресурса описывать
limits.cpu Сумма лимитов ЦП всех подов в пространстве имен.
limits.memory Сумма лимитов памяти
requests.cpu Сумма запросов процессора
requests.memory Сумма лимитов памяти
requests.storage Сумма значений хранения, запрошенных PVC
persistentvolumeclaims Количество ПВХ
requests.ephemeral-storage Сумма запросов локального временного хранилища
limits.ephemeral-storage Сумма лимита локального временного хранилища