Статьи

Пространства имен Kubernetes, квота ресурсов и ограничения для QoS в кластере

По умолчанию все ресурсы в кластере Kubernetes создаются в пространстве имен по умолчанию. Модуль будет работать с неограниченными запросами / ограничениями ЦП и памяти.

Пространство имен Kubernetes позволяет разделить созданные ресурсы на группы с логическим именем. Каждое пространство имен обеспечивает:

  • уникальная область для ресурсов, чтобы избежать конфликтов имен
  • политики для обеспечения соответствующих полномочий доверенным пользователям
  • возможность указать ограничения для потребления ресурсов

Это позволяет кластеру Kubernetes совместно использовать ресурсы по нескольким группам и предоставлять различные уровни QoS каждой группе.

Ресурсы, созданные в одном пространстве имен, скрыты от других пространств имен. Можно создать несколько пространств имен, каждое из которых может иметь различные ограничения.

Пространство имен Kubernetes по умолчанию

По умолчанию каждый ресурс, созданный пользователем в кластере Kubernetes, работает в пространстве имен по умолчанию, которое называется default .

1
2
3
4
./kubernetes/cluster/kubectl.sh get namespace
NAME          LABELS    STATUS    AGE
default       <none>    Active    1m
kube-system   <none>    Active    1m

Любой контроллер pod, службы или репликации будет создан в этом пространстве имен. kube-system имен kube-system зарезервировано для ресурсов, созданных кластером Kubernetes.

Более подробную информацию о пространстве имен можно увидеть:

01
02
03
04
05
06
07
08
09
10
11
./kubernetes/cluster/kubectl.sh describe namespaces default
Name:    default
Labels:    <none>
Status:    Active
  
No resource quota.
  
Resource Limits
 Type        Resource    Min    Max    Request    Limit    Limit/Request
 ----        --------    ---    ---    -------    -----    -------------
 Container    cpu        -    -    100m    -    -

В этом описании показана квота ресурса (если есть), а также диапазоны ограничений ресурса.

Итак, давайте создадим контроллер репликации Couchbase как:

1
./kubernetes/cluster/kubectl.sh run couchbase --image=arungupta/couchbase

Проверьте существующий контроллер репликации:

1
2
3
./kubernetes/cluster/kubectl.sh get rc
CONTROLLER   CONTAINER(S)   IMAGE(S)              SELECTOR        REPLICAS   AGE
couchbase    couchbase      arungupta/couchbase   run=couchbase   1          5m

По умолчанию отображаются только ресурсы в пространстве имен пользователя. Ресурсы во всех пространствах имен могут быть показаны с помощью параметра --all-namespaces :

01
02
03
04
05
06
07
08
09
10
11
12
13
./kubernetes/cluster/kubectl.sh get rc --all-namespaces
NAMESPACE     CONTROLLER                       CONTAINER(S)           IMAGE(S)                                                SELECTOR                           REPLICAS   AGE
default       couchbase                        couchbase              arungupta/couchbase                                     run=couchbase                      1          5m
kube-system   heapster-v11                     heapster               gcr.io/google_containers/heapster:v0.18.4               k8s-app=heapster,version=v11       1          6m
kube-system   kube-dns-v9                      etcd                   gcr.io/google_containers/etcd:2.0.9                     k8s-app=kube-dns,version=v9        1          6m
                                               kube2sky               gcr.io/google_containers/kube2sky:1.11                                                    
                                               skydns                 gcr.io/google_containers/skydns:2015-10-13-8c72f8c                                        
                                               healthz                gcr.io/google_containers/exechealthz:1.0                                                  
kube-system   kube-ui-v4                       kube-ui                gcr.io/google_containers/kube-ui:v4                     k8s-app=kube-ui,version=v4         1         6m
kube-system   l7-lb-controller-v0.5.2          default-http-backend   gcr.io/google_containers/defaultbackend:1.0             k8s-app=glbc,version=v0.5.2        1         6m
                                               l7-lb-controller       gcr.io/google_containers/glbc:0.5.2                                                       
kube-system   monitoring-influxdb-grafana-v2   influxdb               gcr.io/google_containers/heapster_influxdb:v0.4         k8s-app=influxGrafana,version=v2   1         6m
                                               grafana                beta.gcr.io/google_containers/heapster_grafana:v2.1.1

Как видите, arungupta/couchbase работает в пространстве имен по default . Все остальные ресурсы работают в пространстве имен kube-system .

Давайте проверим контекст этого контроллера репликации:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
./kubernetes/cluster/kubectl.sh config view couchbase
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://104.197.10.200
  name: couchbase-on-kubernetes_kubernetes
contexts:
- context:
    cluster: couchbase-on-kubernetes_kubernetes
    user: couchbase-on-kubernetes_kubernetes
  name: couchbase-on-kubernetes_kubernetes
current-context: couchbase-on-kubernetes_kubernetes
kind: Config
preferences: {}
users:
- name: couchbase-on-kubernetes_kubernetes
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
    token: 1RUrsvA5RDwwRNf0eOvz86elmniOK0oj
- name: couchbase-on-kubernetes_kubernetes-basic-auth
  user:
    password: cZ9fZSuzIqq5kdnj
    username: admin

Найдите атрибут contexts.context.name чтобы увидеть существующий контекст. Это будет манипулировать позже.

Создать ресурс в новом пространстве имен Kubernetes

Давайте сначала создадим новое пространство имен. Это можно сделать с помощью следующего файла конфигурации:

1
2
3
4
5
6
apiVersion: v1
kind: Namespace
metadata:
  name: development
  labels:
    name: development

Пространство имен создается как:

1
2
./kubernetes/cluster/kubectl.sh create -f myns.yaml
namespace "development" created

Затем запрос для всех пространств имен дает:

1
2
3
4
5
./kubernetes/cluster/kubectl.sh get namespace
NAME          LABELS             STATUS    AGE
default       <none>             Active    9m
development   name=development   Active    13s
kube-system   <none>             Active    8m

Новый контроллер репликации может быть создан в этом новом пространстве имен с помощью параметра --namespace :

1
2
./kubernetes/cluster/kubectl.sh --namespace=development run couchbase --image=arungupta/couchbase
replicationcontroller "couchbase" created

Список ресурсов во всех пространствах имен выглядит так:

1
2
3
4
5
6
./kubernetes/cluster/kubectl.sh get rc --all-namespaces
NAMESPACE     CONTROLLER                       CONTAINER(S)           IMAGE(S)                                                SELECTOR                           REPLICAS   AGE
default       couchbase                        couchbase              arungupta/couchbase                                     run=couchbase                      1          4m
development   couchbase                        couchbase              arungupta/couchbase                                     run=couchbase                      1          2m
kube-system   heapster-v11                     heapster               gcr.io/google_containers/heapster:v0.18.4               k8s-app=heapster,version=v11       1          31m
. . .

Как видно, есть два контроллера репликации с образом arungupta/couchbase — один в пространстве имен по default а другой в пространстве имен development .

Установить пространство имен Kubernetes для существующего ресурса

Если ресурс уже создан, ему может быть назначено пространство имен.

На ранее созданном ресурсе новый контекст может быть установлен в пространстве имен:

1
2
./kubernetes/cluster/kubectl.sh config set-context dev --namespace=development --cluster=couchbase-on-kubernetes_kubernetes --user=couchbase-on-kubernetes_kubernetes
context "dev" set.

Просмотр контекста теперь показывает:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
./kubernetes/cluster/kubectl.sh config view couchbase
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://104.197.10.200
  name: couchbase-on-kubernetes_kubernetes
contexts:
- context:
    cluster: couchbase-on-kubernetes_kubernetes
    user: couchbase-on-kubernetes_kubernetes
  name: couchbase-on-kubernetes_kubernetes
- context:
    cluster: couchbase-on-kubernetes_kubernetes
    namespace: development
    user: couchbase-on-kubernetes_kubernetes
  name: dev
current-context: couchbase-on-kubernetes_kubernetes
kind: Config
preferences: {}
users:
- name: couchbase-on-kubernetes_kubernetes
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
    token: 1RUrsvA5RDwwRNf0eOvz86elmniOK0oj
- name: couchbase-on-kubernetes_kubernetes-basic-auth
  user:
    password: cZ9fZSuzIqq5kdnj
    username: admin

Второй атрибут в массиве contexts.context показывает, что создан новый контекст. Это также показывает, что текущим контекстом по-прежнему является couchbase-on-kubernetes_kubernetes . Поскольку пространство имен в этом контексте не указано, оно принадлежит пространству имен по умолчанию.

Изменить контекст:

1
2
./kubernetes/cluster/kubectl.sh config use-context dev
switched to context "dev".

Смотрите список контроллеров репликации:

1
2
./kubernetes/cluster/kubectl.sh get rc
CONTROLLER   CONTAINER(S)   IMAGE(S)   SELECTOR   REPLICAS   AGE

Очевидно, что в этом контексте не работают контроллеры репликации. Давайте создадим новый контроллер репликации в этом новом пространстве имен:

1
2
./kubernetes/cluster/kubectl.sh run couchbase --image=arungupta/couchbase
replicationcontroller "couchbase" created

И посмотрите список контроллеров репликации во всех пространствах имен:

1
2
3
4
5
6
./kubernetes/cluster/kubectl.sh get rc --all-namespaces
NAMESPACE     CONTROLLER                       CONTAINER(S)           IMAGE(S)                                                SELECTOR                           REPLICAS   AGE
default       couchbase                        couchbase              arungupta/couchbase                                     run=couchbase                      1          16m
development   couchbase                        couchbase              arungupta/couchbase                                     run=couchbase                      1          4s
kube-system   heapster-v11                     heapster               gcr.io/google_containers/heapster:v0.18.4               k8s-app=heapster,version=v11       1          17m
. . .

Теперь вы можете видеть два arungupta/couchbase репликации arungupta/couchbase работающих в двух разных пространствах имен.

Удалить ресурс Kubernetes в пространстве имен

Ресурс можно удалить, указав полное имя ресурса:

1
2
./kubernetes/cluster/kubectl.sh --namespace=default delete rc couchbase
replicationcontroller "couchbase" deleted

Точно так же другой контроллер репликации может быть удален как:

1
2
./kubernetes/cluster/kubectl.sh --namespace=development delete rc couchbase
replicationcontroller "couchbase" deleted

Наконец, посмотрите список всех контроллеров репликации во всех пространствах имен:

1
2
3
4
5
./kubernetes/cluster/kubectl.sh get rc --all-namespaces
NAMESPACE     CONTROLLER                       CONTAINER(S)           IMAGE(S)                                                SELECTOR                           REPLICAS   AGE
kube-system   heapster-v11                     heapster               gcr.io/google_containers/heapster:v0.18.4               k8s-app=heapster,version=v11       1          3h
kube-system   kube-dns-v9                      etcd                   gcr.io/google_containers/etcd:2.0.9                     k8s-app=kube-dns,version=v9        1          3h
. . .

Это подтверждает, что все созданные пользователем контроллеры репликации удалены.

Квота и ограничение ресурсов с использованием пространства имен Kubernetes

Каждому пространству имен может быть назначена квота ресурса.

По умолчанию модуль будет работать с неограниченными запросами / ограничениями ЦП и памяти. Указание квоты позволяет ограничить объем ресурсов кластера, который может быть использован для всех модулей в пространстве имен.

Квоту ресурса можно указать с помощью файла конфигурации:

01
02
03
04
05
06
07
08
09
10
11
12
apiVersion: v1
kind: ResourceQuota
metadata:
  name: quota
spec:
  hard:
    cpu: "20"
    memory: 1Gi
    pods: "10"
    replicationcontrollers: "20"
    resourcequotas: "1"
    services: "5"

Следующие ресурсы поддерживаются системой квот:

Ресурс Описание
cpu Всего запрошенное использование процессора
memory Общее запрошенное использование памяти
pods Общее количество активных модулей, в которых фаза находится в состоянии ожидания или активна.
services Общее количество услуг
replicationcontrollers Общее количество контроллеров репликации
resourcequotas Общее количество квот ресурсов
secrets Общее количество секретов
persistentvolumeclaims Общее количество постоянных требований объема

Эта квота ресурса может быть создана в пространстве имен:

1
2
./kubernetes/cluster/kubectl.sh --namespace=development create -f quota.yaml
resourcequota "quota" created

Созданная квота может рассматриваться как:

01
02
03
04
05
06
07
08
09
10
11
./kubernetes/cluster/kubectl.sh --namespace=development describe quota
Name:            quota
Namespace:        development
Resource        Used    Hard
--------        ----    ----
cpu            0    20
memory            0    1Gi
pods            0    10
replicationcontrollers    0    20
resourcequotas        1    1
services        0    5

Теперь, если вы попытаетесь создать работающий контроллер репликации:

1
2
./kubernetes/cluster/kubectl.sh --namespace=development run couchbase --image=arungupta/couchbase
replicationcontroller "couchbase" created

Но описание квоты снова показывает:

01
02
03
04
05
06
07
08
09
10
11
./kubernetes/cluster/kubectl.sh --namespace=development describe quota
Name:            quota
Namespace:        development
Resource        Used    Hard
--------        ----    ----
cpu            0    20
memory            0    1Gi
pods            0    10
replicationcontrollers    1    20
resourcequotas        1    1
services        0    5

Мы ожидали, что новый модуль будет создан как часть этого контроллера репликации, но его там нет. Итак, давайте опишем наш контроллер репликации:

01
02
03
04
05
06
07
08
09
10
11
12
13
./kubernetes/cluster/kubectl.sh --namespace=development describe rc
Name:        couchbase
Namespace:    development
Image(s):    arungupta/couchbase
Selector:    run=couchbase
Labels:        run=couchbase
Replicas:    0 current / 1 desired
Pods Status:    0 Running / 0 Waiting / 0 Succeeded / 0 Failed
No volumes.
Events:
  FirstSeen    LastSeen    Count    From                SubobjectPath    Reason        Message
  ─────────    ────────    ─────    ────                ─────────────    ──────        ───────
  1m        24s        4    {replication-controller }            FailedCreate    Error creating: Pod "couchbase-" is forbidden: must make a non-zero request for memory since it is tracked by quota.

По умолчанию модуль использует все доступные ресурсы процессора и памяти. При применении квот ресурсов должно быть указано явное значение. В качестве альтернативы можно указать значение по умолчанию для модуля, используя следующий файл конфигурации:

01
02
03
04
05
06
07
08
09
10
11
12
13
apiVersion: v1
kind: LimitRange
metadata:
  name: limits
spec:
  limits:
  - default:
      cpu: 200m
      memory: 512Mi
    defaultRequest:
      cpu: 100m
      memory: 256Mi
    type: Container

Это ограничивает процессор и память, которые могут быть использованы модулем. Давайте применим эти ограничения как:

1
2
./kubernetes/cluster/kubectl.sh --namespace=development create -f limits.yaml
limitrange "limits" created

Теперь, когда вы снова описываете контроллер репликации, он показывает:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
./kubernetes/cluster/kubectl.sh --namespace=development describe rc
Name:        couchbase
Namespace:    development
Image(s):    arungupta/couchbase
Selector:    run=couchbase
Labels:        run=couchbase
Replicas:    1 current / 1 desired
Pods Status:    1 Running / 0 Waiting / 0 Succeeded / 0 Failed
No volumes.
Events:
  FirstSeen    LastSeen    Count    From                SubobjectPath    Reason            Message
  ─────────    ────────    ─────    ────                ─────────────    ──────            ───────
  8m        2m        14    {replication-controller }            FailedCreate        Error creating: Pod "couchbase-" is forbidden: must make a non-zero request for memory since it is tracked by quota.
  2m        2m        1    {replication-controller }            SuccessfulCreate    Created pod: couchbase-gzk0l

Это показывает успешное создание стручка.

И теперь, когда вы описываете квоту, она также показывает правильные значения:

01
02
03
04
05
06
07
08
09
10
11
./kubernetes/cluster/kubectl.sh --namespace=development describe quota
Name:            quota
Namespace:        development
Resource        Used        Hard
--------        ----        ----
cpu            100m        20
memory            268435456    1Gi
pods            1        10
replicationcontrollers    1        20
resourcequotas        1        1
services        0        5

Квота ресурсов предоставляет более подробную информацию о том, как установить / обновить эти значения.

Создание другой квоты дает следующую ошибку:

1
2
./kubernetes/cluster/kubectl.sh --namespace=development create -f quota.yaml
Error from server: error when creating "quota.yaml": ResourceQuota "quota" is forbidden: limited to 1 resourcequotas

Указание лимитов при создании Pod

Пределы могут быть указаны при создании модуля:

Если ограничение памяти для каждого модуля ограничено 1g, то допустимое определение модуля будет:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
apiVersion: v1
kind: Pod
metadata:
  name: couchbase-pod
spec:
  containers:
  - name: couchbase
    image: couchbase
    ports:
    - containerPort: 8091
    resources:
      limits:
        cpu: "1"
        memory: 512Mi

Это потому, что модуль pod запрашивает только 0,5 ГБ памяти. И неверное определение модуля будет:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
apiVersion: v1
kind: Pod
metadata:
  name: couchbase-pod
spec:
  containers:
  - name: couchbase
    image: couchbase
    ports:
    - containerPort: 8091
    resources:
      limits:
        cpu: "1"
        memory: 2G

Это потому, что модуль запрашивает 2G памяти. Создание такого модуля дает следующую ошибку:

1
2
./kubernetes/cluster/kubectl.sh --namespace=development create -f couchbase-pod.yaml
Error from server: error when creating "couchbase-pod.yaml": Pod "couchbase-pod" is forbidden: unable to admit pod without exceeding quota for resource memory:  limited to 1Gi but require 2805306368 to succeed

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