Namespaces provide a scope for Kubernetes resources, carving up your cluster in smaller units. You can think of it as a workspace you’re sharing with other users. Many resources such as pods and services are namespaced, while some, for example, nodes are not namespaced (but cluster-wide). As a developer you’d usually use an assigned namespace, however admins may wish to manage them, for example to set up access control or resource quotas.
Let’s list all namespaces (note that the output will depend on the environment you’re using, we’re using the OpenShift Playground here):
kubectl get ns
NAME STATUS AGE
default Active 98d
kube-node-lease Active 98d
kube-public Active 98d
kube-system Active 98d
openshift Active 98d
openshift-apiserver Active 98d
...
You can learn more about a namespace using the describe
verb, for example:
kubectl describe ns default
Name: default
Labels: <none>
Status: Active
No resource quota.
No resource limits.
Let’s now create a new namespace
called test
now:
kubectl apply -f https://raw.githubusercontent.com/openshift-evangelists/kbe/main/specs/ns/ns.yaml
namespace "test" created
kubectl get ns
NAME STATUS AGE
default Active 98d
kube-node-lease Active 98d
kube-public Active 98d
kube-system Active 98d
openshift Active 98d
openshift-apiserver Active 98d
...
test Active 16s
Alternatively, we could have created the namespace using the kubectl create namespace test
command.
To launch a pod in
the newly created namespace test
, do:
kubectl apply --namespace=test -f https://raw.githubusercontent.com/openshift-evangelists/kbe/main/specs/ns/pod.yaml
Note that using above method the namespace becomes a runtime property, that is,
you can deploy the same pod or service, etc. into multiple
namespaces (for example: dev
and prod
). Hard-coding the
namespace directly in the metadata
section like shown in the following is possible but causes less flexibility when deploying your apps:
apiVersion: v1
kind: Pod
metadata:
name: podintest
namespace: test
To list namespaced objects such as our pod podintest
, run the following command:
kubectl get pods --namespace=test
NAME READY STATUS RESTARTS AGE
podintest 1/1 Running 0 16s
You can remove the namespace (and everything inside) with:
kubectl delete ns test
If you’re an admin, you might want to check out the docs for more info how to handle namespaces.