
Por defecto, todos los recursos del clúster Kubernetes se crean en un espacio de nombres predeterminado. Un pod se ejecutará con solicitudes/límites de CPU y memoria ilimitados. A Espacio de nombres de Kubernetes permite particionar los recursos creados en un grupo de nombres lógicos. Cada espacio de nombres proporciona:
- un alcance único de recursos para evitar colisiones de nombres
- políticasgarantizar una autoridad adecuada a los usuarios de confianza
- capacidad de especificar limitaciones para el consumo de recursos
Esto permite que un clúster Kubernetes comparta recursos por múltiples grupos y proporcione diferentes niveles de QoS a cada grupo. Los recursos creados en un espacio de nombres se ocultan de otros espacios de nombres. Se pueden crear múltiples espacios de nombres, cada uno potencialmente con diferentes restricciones.
Espacio de nombres predeterminado de Kubernetes
Por defecto, cada recurso creado por el usuario en el clúster Kubernetes se ejecuta en un espacio de nombres predeterminado, denominado por defecto.
|
1 2 3 4 |
./kubernetes/cluster/kubectl.sh get namespace NAME LABELS STATUS AGE default Active 1m kube-system Active 1m |
Cualquier pod, servicio o controlador de replicación se creará en este espacio de nombres. sistema kube está reservado para los recursos creados por el clúster Kubernetes. Puede consultar más detalles sobre el espacio de nombres:
|
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 - - |
Esta descripción muestra la cuota de recursos (si existe), así como los rangos de límite de recursos. Así que vamos a crear un controlador de replicación Couchbase como:
|
1 |
./kubernetes/cluster/kubectl.sh run couchbase --image=arungupta/couchbase |
Compruebe el controlador de replicación 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 defecto, sólo se muestran los recursos del espacio de nombres del usuario. Los recursos de todos los espacios de nombres pueden mostrarse utilizando --all-namespaces opción:
|
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 puede ver, el arungupta/couchbase se ejecuta en el por defecto espacio de nombres. Todos los demás recursos se ejecutan en el espacio de nombres sistema kube namespace. Comprobemos el contexto de este controlador de replicación:
|
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 |
Busque contextos.nombre.contexto para ver el contexto existente. Este se manipulará más adelante.
Crear un recurso en un nuevo espacio de nombres de Kubernetes
Primero vamos a crear un nuevo espacio de nombres. Esto puede hacerse utilizando el siguiente archivo de configuración:
|
1 2 3 4 5 6 |
apiVersion: v1 kind: Namespace metadata: name: development labels: name: development |
El espacio de nombres se crea como:
|
1 2 |
./kubernetes/cluster/kubectl.sh create -f myns.yaml namespace "development" created |
A continuación, la consulta de todos los espacios de nombres da:
|
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 |
Se puede crear un nuevo controlador de replicación en este nuevo espacio de nombres utilizando --namespace opción:
|
1 2 |
./kubernetes/cluster/kubectl.sh --namespace=development run couchbase --image=arungupta/couchbase replicationcontroller "couchbase" created |
La lista de recursos en todos los espacios de nombres tiene este aspecto:
|
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 se ve, hay dos controladores de replicación con arungupta/couchbase imagen - una en por defecto y otro en desarrollo espacio de nombres.
Establecer el espacio de nombres de Kubernetes para un recurso existente
Si un recurso ya está creado, se le puede asignar un espacio de nombres. En un recurso creado previamente, se puede establecer un nuevo contexto en el espacio de nombres:
|
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. |
Ahora se muestra el contexto:
|
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 |
El segundo atributo de contextos.contexto muestra que se ha creado un nuevo contexto. También muestra que el contexto actual sigue siendo couchbase-en-kubernetes_kubernetes. Dado que no se especifica ningún espacio de nombres en ese contexto, pertenece al espacio de nombres por defecto. Cambie el contexto:
|
1 2 |
./kubernetes/cluster/kubectl.sh config use-context dev switched to context "dev". |
Consulte la lista de controladores de replicación:
|
1 2 |
./kubernetes/cluster/kubectl.sh get rc CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGE |
Obviamente, no hay controladores de replicación ejecutándose en este contexto. Vamos a crear un nuevo controlador de replicación en este nuevo espacio de nombres:
|
1 2 |
./kubernetes/cluster/kubectl.sh run couchbase --image=arungupta/couchbase replicationcontroller "couchbase" created |
Y ver la lista de controladores de replicación en todos los espacios de nombres:
|
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 . . . |
Ahora puedes ver dos arungupta/couchbase controladores de replicación que se ejecutan en dos espacios de nombres diferentes.
Eliminar un recurso de Kubernetes en el espacio de nombres
Se puede eliminar un recurso calificando completamente el nombre del recurso:
|
1 2 |
./kubernetes/cluster/kubectl.sh --namespace=default delete rc couchbase replicationcontroller "couchbase" deleted |
Del mismo modo, el otro controlador de replicación se puede eliminar como:
|
1 2 |
./kubernetes/cluster/kubectl.sh --namespace=development delete rc couchbase replicationcontroller "couchbase" deleted |
Por último, vea la lista de todos los controladores de replicación en todos los espacios de nombres:
|
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 . . . |
Esto confirma que se han eliminado todos los controladores de replicación creados por el usuario.
Cuota y límite de recursos mediante el espacio de nombres de Kubernetes
A cada espacio de nombres se le puede asignar una cuota de recursos. Por defecto, un pod se ejecutará con solicitudes/límites de CPU y memoria ilimitados. Especificar una cuota permite restringir la cantidad de recursos del clúster que pueden consumir todos los pods de un espacio de nombres. La cuota de recursos puede especificarse utilizando un archivo de configuración:
|
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" |
El sistema de cuotas admite los siguientes recursos:
| Recursos | Descripción |
|---|---|
cpu |
Uso total de cpu solicitado |
memoria |
Uso total de memoria solicitada |
vainas |
Número total de pods activos en los que la fase está pendiente o activa. |
servicios |
Número total de servicios |
controladores de replicación |
Número total de controladores de replicación |
resourcequotas |
Número total de cuotas de recursos |
secretos |
Número total de secretos |
reclamaciones persistentes |
Número total de siniestros de volumen persistente |
Esta cuota de recursos puede crearse en un espacio de nombres:
|
1 2 |
./kubernetes/cluster/kubectl.sh --namespace=development create -f quota.yaml resourcequota "quota" created |
La cuota creada puede verse 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 |
Ahora, si intenta crear el controlador de replicación que funciona:
|
1 2 |
./kubernetes/cluster/kubectl.sh --namespace=development run couchbase --image=arungupta/couchbase replicationcontroller "couchbase" created |
Pero describir la cuota de nuevo muestra:
|
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ábamos que se creara un nuevo pod como parte de este controlador de replicación, pero no está ahí. Así que vamos a describir nuestro controlador de replicación:
|
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 defecto, el pod consume toda la cpu y memoria disponibles. Si se aplican cuotas de recursos, debe especificarse un valor explícito. Alternativamente se puede especificar un valor por defecto para el pod utilizando el siguiente fichero de configuración:
|
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 |
Esto restringe la CPU y la memoria que puede consumir un pod. Vamos a aplicar estos límites como:
|
1 2 |
./kubernetes/cluster/kubectl.sh --namespace=development create -f limits.yaml limitrange "limits" created |
Ahora, al volver a describir el controlador de replicación, se muestra:
|
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 |
Esto muestra la creación exitosa del pod. Y ahora cuando se describe la cuota, muestra valores correctos también:
|
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 |
Cuota de recursos proporcionan más detalles sobre cómo establecer/actualizar estos valores. La creación de otra cuota da el siguiente error:
|
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 |
Especificación de límites durante la creación de un pod
Los límites también pueden especificarse durante la creación del pod: Si el límite de memoria para cada pod está restringido a 1g, entonces una definición de pod válida sería:
|
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 |
Esto se debe a que el pod solicita 0.5G de memoria solamente. Y una definición de pod inválida sería:
|
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 |
Esto se debe a que el pod solicita 2G de memoria. La creación de un pod de este tipo da el siguiente error:
|
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 puedas aplicar espacios de nombres, cuotas de recursos y límites para compartir tus clusters en distintos entornos.