# Namespace

Namespaces provide a mechanism for isolating groups of resources within a single cluster. Names of resources need to be unique within a namespace, but not across namespaces. Namespace-based scoping is applicable only for namespaced objects (e.g. `Deployments`, `Services`, `Pods`, etc.) and not for cluster-wide objects (e.g. `StorageClass`, `Nodes`, `PersistentVolumes`, etc.).

By default, a Kubernetes cluster will instantiate a default namespace when provisioning the cluster to hold the default set of Pods, Services, and Deployments used by the cluster.

## Create

To create new namespace we can use `kubectl create` command or using yaml file definition.

Lets try to create new namespace using command.

```bash
➜ kubectl create namespace test  
namespace/test created
```

We can get list of namespace using `kubectl get` command.

```bash
➜ kubectl get namespace
NAME                   STATUS   AGE
default                Active   28d
kube-node-lease        Active   28d
kube-public            Active   28d
kube-system            Active   28d
kubernetes-dashboard   Active   28d
test                   Active   6s
```

To delete a namespace we can use `kubectl delete` command.

```bash
➜ kubectl delete namespace test
namespace "test" deleted
```

Now lets try to create namespace using yaml file definition. This method is preferred if you want to use infrastructure as a code (IaC).

Create new file `namespace.yaml` and put this namespace definition below. This will create a new namespace named `limited`.

```yaml
apiVersion: v1
kind: Namespace
metadata:
  name: limited
  labels:
    name: limited
```

Lets apply using `kubectl apply` and get the name space again.

```bash
kubectl apply -f namespace.yaml  
namespace/limited created
```

```bash
➜ kubectl get namespace        
NAME                   STATUS   AGE
default                Active   28d
kube-node-lease        Active   28d
kube-public            Active   28d
kube-system            Active   28d
kubernetes-dashboard   Active   28d
limited                Active   10s
```

## References

* <https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/>
* <https://kubernetes.io/docs/tasks/administer-cluster/namespaces-walkthrough/>
* <https://kubernetes.io/docs/reference/kubectl/generated/kubectl_create/kubectl_create_namespace/>
