
Por padrão, todos os recursos no cluster do Kubernetes são criados em um namespace padrão. Um pod será executado com solicitações/limites ilimitados de CPU e memória. A Espaço de nomes do Kubernetes permite particionar os recursos criados em um grupo logicamente nomeado. Cada namespace fornece:
- um escopo exclusivo para recursos a fim de evitar colisões de nomes
- políticaspara garantir a autoridade adequada aos usuários confiáveis
- capacidade de especificar restrições para o consumo de recursos
Isso permite que um cluster Kubernetes compartilhe recursos por vários grupos e forneça diferentes níveis de QoS para cada grupo. Os recursos criados em um namespace ficam ocultos de outros namespaces. Vários namespaces podem ser criados, cada um potencialmente com restrições diferentes.
Namespace padrão do Kubernetes
Por padrão, cada recurso criado pelo usuário no cluster do Kubernetes é executado em um namespace padrão, chamado padrão.
|
1 2 3 4 |
./kubernetes/cluster/kubectl.sh get namespace NAME LABELS STATUS AGE default Active 1m kube-system Active 1m |
Qualquer pod, serviço ou controlador de replicação será criado nesse namespace. sistema kube é reservado para recursos criados pelo cluster do Kubernetes. Mais detalhes sobre o namespace podem ser vistos:
|
1 2 3 4 5 6 7 8 9 10 11 |
./kubernetes/cluster/kubectl.sh describe namespaces default Name: default Labels: Status: Active No resource quota. Resource Limits Type Resource Min Max Request Limit Limit/Request ---- -------- --- --- ------- ----- ------------- Container cpu - - 100m - - |
Essa descrição mostra a cota de recursos (se houver), bem como os intervalos de limites de recursos. Portanto, vamos criar um controlador de replicação do Couchbase como:
|
1 |
./kubernetes/cluster/kubectl.sh run couchbase --image=arungupta/couchbase |
Verifique o controlador de replicação existente:
|
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 |
Por padrão, somente os recursos no namespace do usuário são mostrados. Os recursos em todos os namespaces podem ser mostrados usando --todos os espaços de nome opção:
|
1 2 3 4 5 6 7 8 9 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 |
Como você pode ver, o arungupta/couchbase A imagem é executada no padrão namespace. Todos os outros recursos são executados no namespace sistema kube namespace. Vamos verificar o contexto desse controlador de replicação:
|
1 2 3 4 5 6 7 8 9 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 |
Procure por contexts.context.name para ver o contexto existente. Isso será manipulado posteriormente.
Criar um recurso em um novo espaço de nomes do Kubernetes
Primeiro, vamos criar um novo namespace. Isso pode ser feito usando o seguinte arquivo de configuração:
|
1 2 3 4 5 6 |
apiVersion: v1 kind: Namespace metadata: name: development labels: name: development |
O espaço de nome é criado como:
|
1 2 |
./kubernetes/cluster/kubectl.sh create -f myns.yaml namespace "development" created |
Em seguida, a consulta de todos os namespaces fornece:
|
1 2 3 4 5 |
./kubernetes/cluster/kubectl.sh get namespace NAME LABELS STATUS AGE default Active 9m development name=development Active 13s kube-system Active 8m |
Um novo controlador de replicação pode ser criado nesse novo namespace usando --namespace opção:
|
1 2 |
./kubernetes/cluster/kubectl.sh --namespace=development run couchbase --image=arungupta/couchbase replicationcontroller "couchbase" created |
A lista de recursos em todos os namespaces é semelhante:
|
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 . . . |
Como visto, há dois controladores de replicação com arungupta/couchbase imagem - uma em padrão e outro no namespace desenvolvimento namespace.
Definir o espaço de nome do Kubernetes para um recurso existente
Se um recurso já tiver sido criado, poderá ser atribuído a ele um namespace. Em um recurso criado anteriormente, um novo contexto pode ser definido no namespace:
|
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. |
A visualização do contexto agora mostra:
|
1 2 3 4 5 6 7 8 9 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 |
O segundo atributo em contextos.contexto mostra que um novo contexto foi criado. Ele também mostra que o contexto atual ainda é couchbase-em-kubernetes_kubernetes. Como nenhum namespace é especificado nesse contexto, ele pertence ao namespace padrão. Altere o contexto:
|
1 2 |
./kubernetes/cluster/kubectl.sh config use-context dev switched to context "dev". |
Consulte a lista de controladores de replicação:
|
1 2 |
./kubernetes/cluster/kubectl.sh get rc CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGE |
Obviamente, nenhum controlador de replicação está em execução nesse contexto. Vamos criar um novo controlador de replicação nesse novo namespace:
|
1 2 |
./kubernetes/cluster/kubectl.sh run couchbase --image=arungupta/couchbase replicationcontroller "couchbase" created |
E veja a lista de controladores de replicação em todos os namespaces:
|
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 . . . |
Agora você pode ver dois arungupta/couchbase controladores de replicação em execução em dois namespaces diferentes.
Excluir um recurso do Kubernetes no namespace
Um recurso pode ser excluído por meio da qualificação completa do nome do recurso:
|
1 2 |
./kubernetes/cluster/kubectl.sh --namespace=default delete rc couchbase replicationcontroller "couchbase" deleted |
Da mesma forma, o outro controlador de replicação pode ser excluído como:
|
1 2 |
./kubernetes/cluster/kubectl.sh --namespace=development delete rc couchbase replicationcontroller "couchbase" deleted |
Por fim, veja a lista de todos os controladores de replicação em todos os namespaces:
|
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 . . . |
Isso confirma que todos os controladores de replicação criados pelo usuário foram excluídos.
Cota e limite de recursos usando o espaço de nomes do Kubernetes
A cada namespace pode ser atribuída uma cota de recursos. Por padrão, um pod será executado com solicitações/limites ilimitados de CPU e memória. Especificar a cota permite restringir a quantidade de recursos do cluster que pode ser consumida por todos os pods em um namespace. A cota de recursos pode ser especificada usando um arquivo de configuração:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
apiVersion: v1 kind: ResourceQuota metadata: name: quota spec: hard: cpu: "20" memory: 1Gi pods: "10" replicationcontrollers: "20" resourcequotas: "1" services: "5" |
Os recursos a seguir são compatíveis com o sistema de cotas:
| Recursos | Descrição |
|---|---|
CPU |
Uso total da cpu solicitada |
memória |
Uso total da memória solicitada |
cápsulas |
Número total de pods ativos em que a fase está pendente ou ativa. |
serviços |
Número total de serviços |
controladores de replicação |
Número total de controladores de replicação |
recursosquotas |
Número total de cotas de recursos |
segredos |
Número total de segredos |
reivindicações de volume persistente |
Número total de reclamações de volume persistente |
Essa cota de recursos pode ser criada em um namespace:
|
1 2 |
./kubernetes/cluster/kubectl.sh --namespace=development create -f quota.yaml resourcequota "quota" created |
A cota criada pode ser vista como:
|
1 2 3 4 5 6 7 8 9 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 |
Agora, se você tentar criar o controlador de replicação, isso funcionará:
|
1 2 |
./kubernetes/cluster/kubectl.sh --namespace=development run couchbase --image=arungupta/couchbase replicationcontroller "couchbase" created |
Mas a descrição da cota mostra novamente:
|
1 2 3 4 5 6 7 8 9 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 |
Esperávamos que um novo pod fosse criado como parte desse controlador de replicação, mas ele não está lá. Portanto, vamos descrever nosso controlador de replicação:
|
1 2 3 4 5 6 7 8 9 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. |
Por padrão, o pod consome toda a CPU e a memória disponíveis. Com cotas de recursos aplicadas, um valor explícito deve ser especificado. Como alternativa, um valor padrão para o pod pode ser especificado usando o seguinte arquivo de configuração:
|
1 2 3 4 5 6 7 8 9 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 |
Isso restringe a CPU e a memória que podem ser consumidas por um pod. Vamos aplicar esses limites como:
|
1 2 |
./kubernetes/cluster/kubectl.sh --namespace=development create -f limits.yaml limitrange "limits" created |
Agora, quando você descreve o controlador de replicação novamente, ele é exibido:
|
1 2 3 4 5 6 7 8 9 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 |
Isso mostra que a criação do pod foi bem-sucedida. E agora, quando você descreve a cota, ela também mostra os valores corretos:
|
1 2 3 4 5 6 7 8 9 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 |
Cota de recursos fornecem mais detalhes sobre como definir/atualizar esses valores. A criação de outra cota apresenta o seguinte erro:
|
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 |
Especificação de limites durante a criação de pods
Os limites também podem ser especificados durante a criação do pod: Se o limite de memória para cada pod for restrito a 1g, uma definição de pod válida seria:
|
1 2 3 4 5 6 7 8 9 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 |
Isso ocorre porque o pod solicita apenas 0,5 G de memória. E uma definição de pod inválida seria:
|
1 2 3 4 5 6 7 8 9 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 |
Isso ocorre porque o pod solicita 2G de memória. A criação desse pod apresenta o seguinte erro:
|
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 |
Espero que você possa aplicar namespaces, cotas de recursos e limites para compartilhar seus clusters em diferentes ambientes.