DEV Community

Cover image for Understanding Kubernetes Namespaces: Types and Working with Examples
Avesh
Avesh

Posted on

Understanding Kubernetes Namespaces: Types and Working with Examples

Kubernetes is an open-source container orchestration platform that helps manage containerized applications across a cluster of machines. As Kubernetes applications scale, managing resources, access control, and environment segregation become complex. This is where Kubernetes Namespaces come in, providing a way to organize, isolate, and manage resources within the same cluster efficiently. In this article, we’ll explore Kubernetes Namespaces in detail, including types, how they work, and practical examples.


Table of Contents

  1. What are Kubernetes Namespaces?
  2. Why Use Namespaces in Kubernetes?
  3. Default Kubernetes Namespaces
  4. Creating and Managing Namespaces
  5. Working with Resources in Different Namespaces
  6. Examples of Using Kubernetes Namespaces
  7. Namespace Best Practices

1. What are Kubernetes Namespaces?

A Namespace in Kubernetes is a logical partition that helps isolate groups of resources, such as pods, services, and deployments, within the same Kubernetes cluster. They allow for the efficient management of resources and access control, creating a way to manage different environments (e.g., development, testing, production) within a single Kubernetes cluster.

In simple terms, namespaces are like virtual clusters within a single physical cluster.


2. Why Use Namespaces in Kubernetes?

Namespaces help:

  • Resource Isolation: Each namespace isolates resources, so you can control and organize them according to application needs.
  • Access Control: With Role-Based Access Control (RBAC), namespaces help limit access to resources based on user roles and responsibilities.
  • Environment Segregation: Namespaces allow you to separate environments (like development, staging, and production) in the same Kubernetes cluster.
  • Resource Quotas: They enable the use of quotas to limit resource usage within each namespace, preventing applications from consuming resources excessively.

3. Default Kubernetes Namespaces

Kubernetes comes with several default namespaces:

  • default: Used for resources with no specified namespace. Suitable for simple applications and smaller environments.
  • kube-system: Contains Kubernetes internal components like the API server, controller manager, and scheduler.
  • kube-public: Accessible across the entire cluster. Typically used for cluster information that’s needed for public access.
  • kube-node-lease: Holds node lease objects, which help manage node health and are used by the node heartbeat feature in Kubernetes 1.13+.

4. Creating and Managing Namespaces

You can easily create, view, and delete namespaces in Kubernetes using the kubectl command-line tool.

Creating a Namespace

To create a new namespace, use the following YAML configuration or create it directly with kubectl.

Example: Create a development namespace using YAML.

apiVersion: v1
kind: Namespace
metadata:
  name: development
Enter fullscreen mode Exit fullscreen mode

Then, apply it:

kubectl apply -f development-namespace.yaml
Enter fullscreen mode Exit fullscreen mode

Alternatively, create a namespace directly using kubectl:

kubectl create namespace development
Enter fullscreen mode Exit fullscreen mode

Listing Namespaces

To list all namespaces in the cluster:

kubectl get namespaces
Enter fullscreen mode Exit fullscreen mode

Deleting a Namespace

To delete a namespace, use:

kubectl delete namespace development
Enter fullscreen mode Exit fullscreen mode

Note: Deleting a namespace deletes all resources within it, so use caution.


5. Working with Resources in Different Namespaces

When working with namespaces, you can specify the namespace for each resource:

  • Creating Resources in a Namespace: Use kubectl -n to specify the namespace. For example, to create a deployment in the development namespace:
  kubectl create deployment my-app --image=nginx -n development
Enter fullscreen mode Exit fullscreen mode
  • Switching Default Namespace: To avoid specifying the -n flag repeatedly, you can set the default namespace for your session:
  kubectl config set-context --current --namespace=development
Enter fullscreen mode Exit fullscreen mode
  • Viewing Resources in a Namespace: Use kubectl get with -n to view resources in a specific namespace. For example:
  kubectl get pods -n development
Enter fullscreen mode Exit fullscreen mode

6. Examples of Using Kubernetes Namespaces

Example 1: Deploying Different Environments

Let’s create development, staging, and production namespaces to separate different environments in the same cluster.

kubectl create namespace development
kubectl create namespace staging
kubectl create namespace production
Enter fullscreen mode Exit fullscreen mode

Now, you can deploy applications in these namespaces to keep environments isolated.

kubectl create deployment dev-app --image=nginx -n development
kubectl create deployment stage-app --image=nginx -n staging
kubectl create deployment prod-app --image=nginx -n production
Enter fullscreen mode Exit fullscreen mode

Example 2: Setting Resource Quotas

Resource quotas are important for managing resources effectively within namespaces. Here’s an example of setting CPU and memory limits in the development namespace.

apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-quota
  namespace: development
spec:
  hard:
    requests.cpu: "1"       # Total CPU requests in namespace
    requests.memory: "1Gi"  # Total memory requests in namespace
    limits.cpu: "2"         # Total CPU limits in namespace
    limits.memory: "2Gi"    # Total memory limits in namespace
Enter fullscreen mode Exit fullscreen mode

Apply the quota to the development namespace:

kubectl apply -f dev-quota.yaml
Enter fullscreen mode Exit fullscreen mode

This quota ensures that applications in the development namespace cannot exceed the specified CPU and memory resources.


7. Namespace Best Practices

  1. Namespace Naming Conventions: Use consistent names that reflect the environment (e.g., dev, staging, prod) or the team owning the resources.
  2. Avoid Overusing Namespaces: Only create new namespaces when you need true resource isolation. Too many namespaces can make management difficult.
  3. Resource Quotas: Set quotas in namespaces to prevent resource abuse and to ensure fair usage across applications.
  4. Use Role-Based Access Control (RBAC): Restrict access to namespaces based on user roles. For example, give developers access to the dev namespace but restrict access to production.
  5. Keep Monitoring and Auditing Enabled: Use monitoring tools like Prometheus and Grafana to keep an eye on resource utilization within namespaces.

Conclusion

Kubernetes Namespaces are an effective way to manage, organize, and control access to resources in a Kubernetes cluster. By creating namespaces for different environments or teams, you can ensure better organization and isolation within your cluster. Leveraging namespaces with tools like RBAC, Resource Quotas, and network policies can create a secure, organized, and efficient Kubernetes environment.

With the examples and best practices covered here, you should be well-equipped to make the most of namespaces in your Kubernetes journey.

Top comments (0)