A Namespace is a mechanism to partition resources created by users into a logically named group.
A single cluster should be able to satisfy the needs of multiple users or groups of users (henceforth a ‘user community’).
Each user community wants to be able to work in isolation from other communities.
Each user community has its own:
A cluster operator may create a Namespace for each unique user community.
The Namespace provides a unique scope for:
You can list the current namespaces in a cluster using:
$ kubectl get namespaces NAME LABELS STATUS default <none> Active kube-system <none> Active
Kubernetes starts with two initial namespaces:
defaultThe default namespace for objects with no other namespace
kube-systemThe namespace for objects created by the Kubernetes system
You can also get the summary of a specific namespace using:
$ kubectl get namespaces <name>
Or you can get detailed information with:
$ kubectl describe namespaces <name> Name: default Labels: <none> Status: Active No resource quota. Resource Limits Type Resource Min Max Default ---- -------- --- --- --- Container cpu - - 100m
Note that these details show both resource quota (if present) as well as resource limit ranges.
Resource quota tracks aggregate usage of resources in the Namespace and allows cluster operators to define Hard resource usage limits that a Namespace may consume.
A limit range defines min/max constraints on the amount of resources a single entity can consume in a Namespace.
A namespace can be in one of two phases:
Active the namespace is in use
Terminating the namespace is being deleted, and can not be used for new objects
See the design doc for more details.
To create a new namespace, first create a new YAML file called
my-namespace.yaml with the contents:
apiVersion: v1 kind: Namespace metadata: name: <insert-namespace-name-here>
$ kubectl create -f ./my-namespace.yaml
Note that the name of your namespace must be a DNS compatible label.
There’s an optional field
finalizers, which allows observables to purge resources whenever the namespace is deleted. Keep in mind that if you specify a nonexistent finalizer, the namespace will be created but will get stuck in the
Terminating state if the user tries to delete it.
More information on
finalizers can be found in the namespace design doc.
You can delete a namespace with
$ kubectl delete namespaces <insert-some-namespace-name>
WARNING, this deletes everything under the namespace!
This delete is asynchronous, so for a time you will see the namespace in the
When you create a Service, it creates a corresponding DNS entry.
This entry is of the form
<service-name>.<namespace-name>.svc.cluster.local, which means
that if a container just uses
<service-name> it will resolve to the service which
is local to a namespace. This is useful for using the same configuration across
multiple namespaces such as Development, Staging and Production. If you want to reach
across namespaces, you need to use the fully qualified domain name (FQDN).