πŸ”₯Save up to $132K/month in CI costs!Try Freeβ†’
Skip to main content

Understanding Namespaces in Kubernetes - A Complete Guide for DevOps Engineers

10 min read
Author: James Smith
Senior Kubernetes Engineer
Kubernetes is my thingβ€”I love building scalable systems and fine-tuning container workflows for better performance.

This article was last updated on January 15, 2025, to include advanced techniques for managing Kubernetes namespaces, such as optimizing resource quotas, troubleshooting namespace conflicts, and best practices for production-ready namespace setups, along with simplified explanations to enhance clarity.

What are Kubernetes Namespaces? A Beginner's Guide​

TL;DR

What are Kubernetes Namespaces?
Think of namespaces as separate floors in an office building. Each team gets their own floor where they can organize their stuff without interfering with others.

Why do you want Kubernetes Namespaces?
They provide a way to organize and isolate resources in your cluster, and help you avoid naming conflicts; they also make access control and resource quotas easier to manage.

When to Use Kubernetes Namespaces?
Use namespaces when you have several teams, projects, or environments sharing the same cluster and need to keep their resources apart.

After having spent a few sleepless nights debugging namespace-related issues in production, I can say that Kubernetes namespaces are something no DevOps engineer can live without.

For simplicity, think of it this way: if Kubernetes is a huge apartment building, then namespaces are the different apartments. Each tenant-that is, a team-gets their own space to arrange their furniture, that is, resources, as they see fit without bothering other tenants.

Steps we'll cover:

Understanding Kubernetes Clusters vs Namespaces​

I should elaborate by borrowing a real-life analogy which works for me when training new team members: Consider a whole office building to be one big Kubernetes cluster; namespaces in such a case would then represent different floors or departments within that office building.

The Cluster (The Building)​

A complete, self-contained installation of Kubernetes

  • Has its own control plane-in other words, the central management of the building
  • Contains all the physical or virtual infrastructure
  • Manages the overall security and access control
  • Runs its own set of system components

Namespaces (The Floors/Departments)​

  • Logical partitions within the cluster
  • Share the same cluster resources
  • Can communicate with each other unless explicitly restricted
  • Have their own access controls and resource quotas
  • Must not exist outside of a cluster

Interactive Decision Helper​

Not sure about using multiple clusters versus namespaces? Have a look at our interactive decision helper:

Kubernetes Architecture Decision Helper

Question 1 of 5

What level of isolation do you need?

This tool will help you make an informed decision based on your specific requirements for:

  • Resource isolation
  • Network security
  • Geographical distribution
  • Team organization
  • Cost considerations
  • Operational comply

Following is a real-world example that I have recently worked with. We had three environments: development, staging, and production. We could have set these up in two ways:

  1. Multiple Clusters Approach:

    # Each environment gets its own cluster
    production-cluster.company.com
    staging-cluster.company.com
    development-cluster.company.com
  2. Single Cluster with Namespaces:

    # One cluster with multiple namespaces
    kubectl get namespaces
    development
    staging
    production

We decided on the former in our production environment, separate cluster, but we divided our development cluster into namespaces to carve out team workspaces. Here's why:

When to Use Multiple Clusters:

  • Isolation: Complete isolation required (for example, production)
  • Different geographical regions
  • Different cloud providers
  • Distinct security requirements
  • Separate billing requirements

When to Use Namespaces:

  • Team separation within the same environment
  • Isolation of feature development
  • Resource Quota Management
  • Cost-effective resource sharing
  • Less administrative overhead
Click to zoom

I learned this distinction the hard way when we first tried to use namespaces for production isolation. When a network issue occurred, all namespaces were affected since they were sharing the same cluster infrastructure. And that's how we came to know: for real isolation, use separate clusters; for logical separation, use namespaces.

How Kubernetes Namespaces Work: Understanding Resource Isolation​

Click to zoom

Let me tell you a story as to why namespaces matter. Early on, I worked on a cluster where all the teams deployed into the default namespace. It's like everybody just threw their clothes in one giant closet; you can imagine what happened. We had naming conflicts, accidental deletions, and no ability to track usage per team.

Namespaces provide a scope for access, as well as resource quota management for environments involving several teams. That would be like giving each department of a company its budget and office space-to manage their resources independently without interfering with others.

Kubernetes Clusters vs Namespaces: Key Differences​

Kubernetes Clusters vs Namespaces: A Quick Comparison

FeatureClustersNamespaces
DefinitionA full Kubernetes installation with its own control plane.Logical partitions within a cluster to isolate resources.
Use CaseIsolation, mostly across environments such as production, staging, and development. Organize resources for teams, applications or projects in a single cluster.
Resource SharingNot shared amongst, clusters.Share the same cluster resources -_namespaces.
Network IsolationComplete network isolation between clusters.Requires additional configurations like Network Policies for isolation.
Access ControlManaged cluster-wide, often enough with separate IAM roles.Can be managed at namespace level in RBAC (Role-Based Access Control)
Management OverheadHigh, especially for multiple clusters.Lower, since all namespaces share the same cluster infrastructure.
CostHigher since each cluster needs its own infrastructure.Cost-effective since resources are shared within a single cluster.
DNS FormatNot applicable (cluster-level resource).<service-name>.<namespace-name>.svc.cluster.local

When to Use Multiple Namespaces in Kubernetes​

I remember this one project where we had three teams on one cluster: frontend, backend, and data science. Each one of them had different naming conventions, resource requirements, and security needs. Here is how we arranged things:

Create namespace for each team

kubectl create namespace frontend
kubectl create namespace backend
kubectl create namespace data-science

For minor differences, such as different software versions, I've learned to use labels instead of creating separate namespaces. That's like using sticky notes to organize things within a room, rather than creating a new room for each variant:

kubectl label deployment my-app version=v1.0
kubectl label deployment my-app version=v1.1

Default Kubernetes Namespaces: Understanding System Components​

By default, when you create a Kubernetes cluster it is already initialized with several, pre-configured namespaces; much like when you move into a new house - the previous owner had already sectioned the open area off into rooms:

  • default: A sort of living room - everything lands up there if you don't specify a different one. I have learned the hard way not to use this for production workloads!

  • kube-node-lease: It is like the maintenance room at your building; it keeps track of node heartbeats and helps in detection of node failures.

  • kube-public: This is the "lobby" of your building, so to say-in other words, information here is readable by anyone, without the need for authentication.

  • kube-system: This is the utility room, where all of the important cluster components reside. I tell my team: "Look, but don't touch!

Best Practices for Managing Kubernetes Namespaces​

After having broken things a few times (okay, more than a few), here's what I've learned:

Use Clear Naming Conventions

Good:

kubectl create namespace prod-frontend

Not so good:

kubectl create namespace stuff-team1

Never Use 'kube-' Prefix

That is reserved for the system namespaces - once I gave once managed to make something of panic having caused because the namespace had been in conflict with system components.

How to Create and Manage Kubernetes Namespaces​

To create a namespace it is as easy as:

kubectl create namespace <namespace-name>

To delete a namespace:

kubectl delete namespace <namespace-name>

Setting Up Namespace Preferences in Kubernetes​

Here's a tip I wish I'd known earlier - you can set a default namespace for your context:

kubectl config set-context --current --namespace=<insert-namespace-name-here>

Verify your change with:

kubectl config view --minify | grep namespace:

Understanding DNS in Kubernetes Namespaces​

Let me show you how DNS works in Kubernetes - it's actually pretty simple! When you create a service, Kubernetes gives it a DNS name automatically. It's like giving each service its own phone number.

Here's the basic format:

<service-name>.<namespace-name>.svc.cluster.local

Let's say you have:

  • A frontend service in the 'dev' namespace
  • A database in the 'prod' namespace

They would get these DNS names:

Frontend service DNS

frontend.dev.svc.cluster.local

Database service DNS

database.prod.svc.cluster.local

Want to try it out? Here's a quick test you can run:

Create a test pod to check DNS

kubectl run dns-test --image=busybox -n dev -- sleep 3600

Try to ping your service

kubectl exec -it dns-test -n dev -- ping frontend.dev.svc.cluster.local

Kubernetes Resource Scopes: Namespace vs Cluster Level​

Think of your Kubernetes cluster like a big building. Some things belong to specific apartments (namespaced), and some things are shared by everyone (cluster-wide).

Here's what I mean:

Namespaced stuff (belongs to specific namespaces):

# Example Deployment (namespaced)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: dev # This makes it namespace specific!
spec:
replicas: 3
# ... rest of config

Cluster-wide stuff (shared by everyone):

# Example StorageClass (cluster-wide)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-storage # No namespace needed!
provisioner: ebs.csi.aws.com

How to List Resources in Kubernetes Namespaces​

Need to know what resources go where? Here are some super useful commands I use every day:

Show me everything in my namespace

kubectl get all -n my-namespace

List all namespaced resources

kubectl api-resources --namespaced=true

List all cluster-wide resources

kubectl api-resources --namespaced=false

Want to see which namespace a resource is in?

kubectl get pods --all-namespaces | grep my-pod

Pro tip: I always use these commands when I'm not sure where something should go!

Understanding Cluster-Wide Resources in Kubernetes

Some resources should be accessible from anywhere within your cluster Similar to how one should be able to enter the elevator in every apartment building Nodes, for example, need to universally be reachable, so the scheduler can do its magic.

Conclusions​

After working with Kubernetes for years, I grew to love namespaces as one of its most powerful features. They are the foundation of a well-organized apartment building: when used correctly, they keep everything in order and avoid chaos.

Remember: Good namespace organization is like good housekeeping – it's easier to never make the mess than it's to clean it up later. Trust me - I've done both!