Technotes

Technotes for future me

Easy way to change namespace in Kubernetes

There is no easy way to change namespace in Kubernetes using kubectl command line utility. But here are some commands that you can alias in your bashrc file so that it’s just a single command that you can use to change the namespace in the Kubernetes cluster.

Change namespace

Let’s see step by step what goes in to change the namespace. So the first step is to find the context.

A context element in a kubeconfig file is used to group access parameters under a convenient name. Each context has three parameters: cluster, namespace, and user. By default, the kubectl command-line tool uses parameters from the current context to communicate with the cluster. Read more.

$ kubectl config current-context
minikube

Now I have a namespace which I have created and want to switch to it.

$ kubectl create ns mywebapp
namespace "mywebapp" created

Now we have two needed information to change the current default namespace, context and namespace name.

$ kubectl config set-context minikube --namespace mywebapp
Context "minikube" modified.

Notice that we have put the context here as minikube and namespace name as we have created, mywebapp.

So this can be put in one command and used conveniently. Just copy following bash function into your bashrc file and you will have change-ns as a command available.

function change-ns() {
    namespace=$1
    if [ -z $namespace ]; then
        echo "Please provide the namespace name: 'change-ns mywebapp'"
        return 1
    fi

    kubectl config set-context $(kubectl config current-context) --namespace $namespace
}

Verify change of namespace

How do you verify that the namespace is changed? How do you find what is the current namespace? Run following command:

kubectl get sa default -o jsonpath='{.metadata.namespace}'

Let’s deconstruct that. Every namespace that is created has a ServiceAccount created by default with name default (Read more).

For any object/artifact in Kubernetes there is a field called namespace inside it’s metadata field. Which tells you about what namespace a particular object is part of. If you don’t set it while creating, Kubernetes will set it to the current default namespace. So this is a source of knowing what current namespace is.

Look at following pod object definition, the namespace for pod storage-provisioner is kube-system.

$ kubectl get pod storage-provisioner -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: 2018-06-10T09:56:24Z
  name: storage-provisioner
  namespace: kube-system
...

Now you can use the flag -o with jsonpath type of input to tell what specific object you would like to fetch information about, in our case we want metadata.namespace.

The above command can also be converted to one command, just add following snippet to bashrc and you will have a command current-ns.

function current-ns() {
  kubectl get sa default -o jsonpath='{.metadata.namespace}'
  echo
}

Hope that helps, you with being productive with Kubernetes. Happy hacking!

Source:
https://suraj.io/post/changing-k8s-ns/

Last updated on 9 Jun 2021
Published on 9 Jun 2021
Edit on GitHub