По умолчанию все ресурсы в кластере 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 |
Надеюсь, что вы можете применять пространства имен, квоты ресурсов и ограничения для совместного использования кластеров в разных средах.
- Источник: http://blog.couchbase.com/2016/march/kubernetes-namespaces-resource-quota-limits-qos-cluster
Ссылка: | Пространства имен Kubernetes, квота ресурсов и ограничения QoS в кластере от нашего партнера по JCG Аруна Гупта из Miles to go 2.0… блог. |