По умолчанию все ресурсы в кластере Kubernetes создаются в пространстве имен по умолчанию. Модуль будет работать с неограниченными запросами / ограничениями ЦП и памяти.
Пространство имен Kubernetes позволяет разделить созданные ресурсы на группы с логическим именем. Каждое пространство имен обеспечивает:
- уникальная область для ресурсов, чтобы избежать конфликтов имен
- политики для обеспечения соответствующих полномочий доверенным пользователям
- возможность указать ограничения для потребления ресурсов
Это позволяет кластеру Kubernetes совместно использовать ресурсы по нескольким группам и предоставлять различные уровни QoS каждой группе.
Ресурсы, созданные в одном пространстве имен, скрыты от других пространств имен. Можно создать несколько пространств имен, каждое из которых может иметь различные ограничения.
Пространство имен Kubernetes по умолчанию
По умолчанию каждый ресурс, созданный пользователем в кластере Kubernetes, работает в пространстве имен по умолчанию, которое называется default .
|
1
2
3
4
|
./kubernetes/cluster/kubectl.sh get namespaceNAME LABELS STATUS AGEdefault <none> Active 1mkube-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 defaultName: defaultLabels: <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 rcCONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGEcouchbase 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-namespacesNAMESPACE CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGEdefault couchbase couchbase arungupta/couchbase run=couchbase 1 5mkube-system heapster-v11 heapster gcr.io/google_containers/heapster:v0.18.4 k8s-app=heapster,version=v11 1 6mkube-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 6mkube-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 couchbaseapiVersion: v1clusters:- cluster: certificate-authority-data: REDACTED server: https://104.197.10.200 name: couchbase-on-kubernetes_kubernetescontexts:- context: cluster: couchbase-on-kubernetes_kubernetes user: couchbase-on-kubernetes_kubernetes name: couchbase-on-kubernetes_kubernetescurrent-context: couchbase-on-kubernetes_kuberneteskind: Configpreferences: {}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: v1kind: Namespacemetadata: 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 namespaceNAME LABELS STATUS AGEdefault <none> Active 9mdevelopment name=development Active 13skube-system <none> Active 8m |
Новый контроллер репликации может быть создан в этом новом пространстве имен с помощью параметра --namespace :
|
1
2
|
./kubernetes/cluster/kubectl.sh --namespace=development run couchbase --image=arungupta/couchbasereplicationcontroller "couchbase" created |
Список ресурсов во всех пространствах имен выглядит так:
|
1
2
3
4
5
6
|
./kubernetes/cluster/kubectl.sh get rc --all-namespacesNAMESPACE CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGEdefault couchbase couchbase arungupta/couchbase run=couchbase 1 4mdevelopment couchbase couchbase arungupta/couchbase run=couchbase 1 2mkube-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_kubernetescontext "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 couchbaseapiVersion: v1clusters:- cluster: certificate-authority-data: REDACTED server: https://104.197.10.200 name: couchbase-on-kubernetes_kubernetescontexts:- 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: devcurrent-context: couchbase-on-kubernetes_kuberneteskind: Configpreferences: {}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 devswitched to context "dev". |
Смотрите список контроллеров репликации:
|
1
2
|
./kubernetes/cluster/kubectl.sh get rcCONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGE |
Очевидно, что в этом контексте не работают контроллеры репликации. Давайте создадим новый контроллер репликации в этом новом пространстве имен:
|
1
2
|
./kubernetes/cluster/kubectl.sh run couchbase --image=arungupta/couchbasereplicationcontroller "couchbase" created |
И посмотрите список контроллеров репликации во всех пространствах имен:
|
1
2
3
4
5
6
|
./kubernetes/cluster/kubectl.sh get rc --all-namespacesNAMESPACE CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGEdefault couchbase couchbase arungupta/couchbase run=couchbase 1 16mdevelopment couchbase couchbase arungupta/couchbase run=couchbase 1 4skube-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 couchbasereplicationcontroller "couchbase" deleted |
Точно так же другой контроллер репликации может быть удален как:
|
1
2
|
./kubernetes/cluster/kubectl.sh --namespace=development delete rc couchbasereplicationcontroller "couchbase" deleted |
Наконец, посмотрите список всех контроллеров репликации во всех пространствах имен:
|
1
2
3
4
5
|
./kubernetes/cluster/kubectl.sh get rc --all-namespacesNAMESPACE CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGEkube-system heapster-v11 heapster gcr.io/google_containers/heapster:v0.18.4 k8s-app=heapster,version=v11 1 3hkube-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: v1kind: ResourceQuotametadata: name: quotaspec: 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.yamlresourcequota "quota" created |
Созданная квота может рассматриваться как:
|
01
02
03
04
05
06
07
08
09
10
11
|
./kubernetes/cluster/kubectl.sh --namespace=development describe quotaName: quotaNamespace: developmentResource Used Hard-------- ---- ----cpu 0 20memory 0 1Gipods 0 10replicationcontrollers 0 20resourcequotas 1 1services 0 5 |
Теперь, если вы попытаетесь создать работающий контроллер репликации:
|
1
2
|
./kubernetes/cluster/kubectl.sh --namespace=development run couchbase --image=arungupta/couchbasereplicationcontroller "couchbase" created |
Но описание квоты снова показывает:
|
01
02
03
04
05
06
07
08
09
10
11
|
./kubernetes/cluster/kubectl.sh --namespace=development describe quotaName: quotaNamespace: developmentResource Used Hard-------- ---- ----cpu 0 20memory 0 1Gipods 0 10replicationcontrollers 1 20resourcequotas 1 1services 0 5 |
Мы ожидали, что новый модуль будет создан как часть этого контроллера репликации, но его там нет. Итак, давайте опишем наш контроллер репликации:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
./kubernetes/cluster/kubectl.sh --namespace=development describe rcName: couchbaseNamespace: developmentImage(s): arungupta/couchbaseSelector: run=couchbaseLabels: run=couchbaseReplicas: 0 current / 1 desiredPods Status: 0 Running / 0 Waiting / 0 Succeeded / 0 FailedNo 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: v1kind: LimitRangemetadata: name: limitsspec: 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 rcName: couchbaseNamespace: developmentImage(s): arungupta/couchbaseSelector: run=couchbaseLabels: run=couchbaseReplicas: 1 current / 1 desiredPods Status: 1 Running / 0 Waiting / 0 Succeeded / 0 FailedNo 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 quotaName: quotaNamespace: developmentResource Used Hard-------- ---- ----cpu 100m 20memory 268435456 1Gipods 1 10replicationcontrollers 1 20resourcequotas 1 1services 0 5 |
Квота ресурсов предоставляет более подробную информацию о том, как установить / обновить эти значения.
Создание другой квоты дает следующую ошибку:
|
1
2
|
./kubernetes/cluster/kubectl.sh --namespace=development create -f quota.yamlError 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: v1kind: Podmetadata: name: couchbase-podspec: 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: v1kind: Podmetadata: name: couchbase-podspec: 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… блог. |