Home Explore Blog CI



kubernetes

1st chunk of `content/en/blog/_posts/2015-08-00-Using-Kubernetes-Namespaces-To-Manage.md`
d8aa2f565300d7275408b1a37a27c1bdaa85e140ec16028a0000000100000c0c
---
title: " Using Kubernetes Namespaces to Manage Environments "
date: 2015-08-28
slug: using-kubernetes-namespaces-to-manage
url: /blog/2015/08/Using-Kubernetes-Namespaces-To-Manage
author: >
   Ian Lewis (Google)
---
#####  One of the advantages that Kubernetes provides is the ability to manage various environments easier and better than traditional deployment strategies. For most nontrivial applications, you have test, staging, and production environments. You can spin up a separate cluster of resources, such as VMs, with the same configuration in staging and production, but that can be costly and managing the differences between the environments can be difficult.

#####  Kubernetes includes a cool feature called [namespaces][4], which enable you to manage different environments within the same cluster. For example, you can have different test and staging environments in the same cluster of machines, potentially saving resources. You can also run different types of server, batch, or other jobs in the same cluster without worrying about them affecting each other.



### The Default Namespace

Specifying the namespace is optional in Kubernetes because by default Kubernetes uses the "default" namespace. If you've just created a cluster, you can check that the default namespace exists using this command:
```
$ kubectl get namespaces
NAME          LABELS    STATUS
default                  Active
kube-system              Active
```

Here you can see that the default namespace exists and is active. The status of the namespace is used later when turning down and deleting the namespace.

####  Creating a New Namespace

You create a namespace in the same way you would any other resource. Create a my-namespace.yaml file and add these contents:

```
kind: Namespace  
apiVersion: v1  
metadata:  
 name: my-namespace  
 labels:  
   name: my-namespace  
```

Then you can run this command to create it:
```
$ kubectl create -f my-namespace.yaml
```
####  Service Names

With namespaces you can have your apps point to static service endpoints that don't change based on the environment. For instance, your MySQL database service could be named mysql in production and staging even though it runs on the same infrastructure.

This works because each of the resources in the cluster will by default only "see" the other resources in the same namespace. This means that you can avoid naming collisions by creating pods, services, and replication controllers with the same names provided they are in separate namespaces. Within a namespace, short DNS names of services resolve to the IP of the service within that namespace. So for example, you might have an Elasticsearch service that can be accessed via the DNS name elasticsearch as long as the containers accessing it are located in the same namespace.

You can still access services in other namespaces by looking it up via the full DNS name which takes the form of SERVICE-NAME.NAMESPACE-NAME. So for example, elasticsearch.prod or elasticsearch.canary for the production and canary environments respectively.

Title: Using Kubernetes Namespaces to Manage Environments
Summary
Kubernetes namespaces allow managing different environments (test, staging, production) within the same cluster, saving resources and simplifying management. Namespaces isolate resources, preventing naming collisions and allowing static service endpoints across environments. Resources in a cluster will by default only be able to see other resources in the same namespace. Services in other namespaces can be accessed via their full DNS name.