263

I have Kubernetes working well in two different environments, namely in my local environment (MacBook running minikube) and as well as on Google's Container Engine (GCE, Kubernetes on Google Cloud). I use the MacBook/local environment to develop and test my YAML files and then, upon completion, try them on GCE.

Currently I need to work with each environment individually: I need to edit the YAML files in my local environment and, when ready, (git) clone them to a GCE environment and then use/deploy them. This is a somewhat cumbersome process.

Ideally, I would like to use kubectl from my Macbook to easily switch between the local minikube or GCE Kubernetes environments and to easily determine where the YAML files are used. Is there a simple way to switch contexts to do this?

Eric Broda
  • 6,701
  • 6
  • 48
  • 72

15 Answers15

522

You can switch from local (minikube) to gcloud and back with:

kubectl config use-context CONTEXT_NAME

to list all contexts:

kubectl config get-contexts

You can create different enviroments for local and gcloud and put it in separate yaml files.

Taylor D. Edmiston
  • 12,088
  • 6
  • 56
  • 76
Mark
  • 17,887
  • 13
  • 66
  • 93
  • 12
    How do you add it to your kubectl contexts? Is there come gcloud command to do it? Found it: $ gcloud container clusters get-credentials $CLUSTER_NAME – Justin Thomas Feb 01 '18 at 16:58
  • 2
    The above didn't show me the original context, but `grep 'name:' ~/.kube/config` did. It was `minikube`, so I could switch back to it with `kubectl config use-context minikube` – Jordan Morris Jun 16 '20 at 01:16
  • 1
    You can create context with "minikube start --keep-context" – Aleksey Kanaev Jul 23 '21 at 10:49
58

List contexts

kubectl config get-contexts

Switch contexts

kubectl config set current-context MY-CONTEXT
Jay Modi
  • 3,161
  • 4
  • 35
  • 52
Sergey Onishchenko
  • 6,943
  • 4
  • 44
  • 51
26

A faster shortcut to the standard kubectl commands is to use kubectx:

  • List contexts: kubectx
    • Equivalent to kubectl config get-contexts
  • Switch context (to foo): kubectx foo
    • Equivalent to kubectl config use-context foo

To install on macOS: brew install kubectx

The kubectx package also includes a similar tool for switching namespaces called kubens.

These two are super convenient if you work in multiple contexts and namespaces regularly.

More info: https://ahmet.im/blog/kubectx/

Taylor D. Edmiston
  • 12,088
  • 6
  • 56
  • 76
9

If you're looking for a GUI-based solution for Mac and have the Docker Desktop installed, you can use the Docker Menu Bar icon. Here you can find "Kubernetes" menu with all the contexts you have in your kubeconfig and easily switch between them.

zCHIP
  • 99
  • 2
  • 5
  • This appears more like a comment but not an answer. – coderpc Jan 09 '19 at 22:07
  • 1
    This is a great answer (especially combined with `gcloud container clusters get-credentials $CLUSTER_NAME` from Justin Thomas' comment to the accepted answer). – thebjorn Jul 09 '19 at 19:28
7

To get all context

C:\Users\arun>kubectl config get-contexts

To get current context

C:\Users\arun>kubectl config current-context

To switch context

C:\Users\arun>kubectl config use-context <any context name from above list>
Arun
  • 1,011
  • 11
  • 13
5

Latest 2020 answer is here,

A simple way to switch between kubectl context,

kubectl top nodes **--context=**context01name

kubectl top nodes --context=context02name

You can also store the context name as env like context01name=gke_${GOOGLE_CLOUD_PROJECT}_us-central1-a_standard-cluster-1

Swam Guru
  • 473
  • 5
  • 9
3

I got bored of typing this over and over so I wrote a simple bash utility to switch contexts

enter image description here

You can find it here https://github.com/josefkorbel/kube-switch

Josef Korbel
  • 1,168
  • 1
  • 9
  • 32
3

The canonical answer of switching/reading/manipulating different kubernetes environments (aka kubernetes contexts) is, as Mark mentioned, to use kubectl config, see below:

$ kubectl config                                                                                                                                                                                                                 
Modify kubeconfig files using subcommands like "kubectl config set current-context my-context"

Available Commands:
  current-context Displays the current-context
  delete-cluster  Delete the specified cluster from the kubeconfig
  delete-context  Delete the specified context from the kubeconfig
  get-clusters    Display clusters defined in the kubeconfig
  get-contexts    Describe one or many contexts
  rename-context  Renames a context from the kubeconfig file.
  set             Sets an individual value in a kubeconfig file
  set-cluster     Sets a cluster entry in kubeconfig
  set-context     Sets a context entry in kubeconfig
  set-credentials Sets a user entry in kubeconfig
  unset           Unsets an individual value in a kubeconfig file
  use-context     Sets the current-context in a kubeconfig file
  view            Display merged kubeconfig settings or a specified kubeconfig file

Usage:
  kubectl config SUBCOMMAND [options]

Behind the scene, there is a ~/.kube/config YAML file that stores all the available contexts with their corresponding credentials and endpoints for each contexts.

Kubectl off the shelf doesn't make it easy to manage different kubernetes contexts as you probably already know. Rather than rolling your own script to manage all that, a better approach is to use a mature tool called kubectx, created by a Googler named "Ahmet Alp Balkan" who's on Kubernetes / Google Cloud Platform developer experiences Team that builds tooling like this. I highly recommend it.

https://github.com/ahmetb/kubectx

$ kctx --help                                                                                                                                                                                                                  
USAGE:
  kubectx                       : list the contexts
  kubectx <NAME>                : switch to context <NAME>
  kubectx -                     : switch to the previous context
  kubectx <NEW_NAME>=<NAME>     : rename context <NAME> to <NEW_NAME>
  kubectx <NEW_NAME>=.          : rename current-context to <NEW_NAME>
  kubectx -d <NAME> [<NAME...>] : delete context <NAME> ('.' for current-context)
                                  (this command won't delete the user/cluster entry
                                  that is used by the context)

  kubectx -h,--help         : show this message
Devy
  • 9,655
  • 8
  • 61
  • 59
2

TL;DR: I created a GUI to switch Kubernetes contexts via AppleScript. I activate it via shift-cmd-x.

I too had the same issue. It was a pain switching contexts by the command line. I used FastScripts to set a key combo (shift-cmd-x) to run the following AppleScript (placed in this directory: $(HOME)/Library/Scripts/Applications/Terminal).

use AppleScript version "2.4" -- Yosemite (10.10) or later
use scripting additions

do shell script "/usr/local/bin/kubectl config current-context"
set curcontext to result

do shell script "/usr/local/bin/kubectl config get-contexts -o name"
set contexts to paragraphs of result

choose from list contexts with prompt "Select Context:" with title "K8s Context Selector" default items {curcontext}
set scriptArguments to item 1 of result

do shell script "/usr/local/bin/kubectl config use-context " & scriptArguments

display dialog "Switched to " & scriptArguments buttons {"ok"} default button 1
cwingrav
  • 949
  • 1
  • 10
  • 10
1

Cloning the YAML files across repos for different environments is definitely ideal. What you to do is templatize your YAML files - by extracting the parameters which differ from environment to environment.

You can, of course, use some templating engine and separate the values in a YAML and produce the YAML for a specific environment. But this is easily doable if you adopt the Helm Charts. To take a look at some sample charts go to stable directory at this Github repo

To take an example of the Wordpress chart, you could have two different commands for two environments:

For Dev:

helm install --name dev-release --set \ wordpressUsername=dev_admin, \ wordpressPassword=dev_password, \ mariadb.mariadbRootPassword=dev_secretpassword \ stable/wordpress

It is not necessary to pass these values on CLI though, you can store the values in a file called aptly values.yml and you could have different files for different environments

You will need some work in converting to Helm chart standards, but the effort will be worth it.

Vishal Biyani
  • 4,297
  • 28
  • 55
1

Check also the latest (docker 19.03) docker context command.

Ajeet Singh Raina ) illustrates it in "Docker 19.03.0 Pre-Release: Fast Context Switching, Rootless Docker, Sysctl support for Swarm Services"

Context Switching

A context is essentially the configuration that you use to access a particular cluster.

Say, for example, in my particular case, I have 4 different clusters – mix of Swarm and Kubernetes running locally and remotely.
Assume that I have a default cluster running on my Desktop machine , 2 node Swarm Cluster running on Google Cloud Platform, 5-Node Cluster running on Play with Docker playground and a single-node Kubernetes cluster running on Minikube and that I need to access pretty regularly.

Using docker context CLI I can easily switch from one cluster(which could be my development cluster) to test to production cluster in seconds.

$ sudo docker context --help
Usage:  docker context COMMAND
Manage contexts
Commands:
  create      Create a context
  export      Export a context to a tar or kubeconfig file
  import      Import a context from a tar file
  inspect     Display detailed information on one or more contexts
  ls          List contexts
  rm          Remove one or more contexts
  update      Update a context
  use         Set the current docker context
Run 'docker context COMMAND --help' for more information on a command.

For example:

[:)Captain'sBay=>sudo docker context ls
NAME                DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT                 ORCHESTRATOR
default *           Current DOCKER_HOST based configuration   unix:///var/run/docker.sock   https://127.0.0.1:16443 (default)   swarm
swarm-context1 
VonC
  • 1,262,500
  • 529
  • 4,410
  • 5,250
1

I use kubeswitch (disclaimer: I wrote the tool) that can be used just like kubectx, but is designed for a large number of kubeconfig files. If you have to deal with hundreds or thousands of kubeconfig files, this tool might be useful to you, otherwise kubectx or kubectl config use-context might be sufficient.

For instance, it adds capabilities like reading from vault, hot reload while searching, and an index to speed up subsequent searches.

You can install it from here.

EDIT: now also includes support for GKE directly. So you can use and discover kubeconfig files without having to manually download and update them.

Daniel Föhr
  • 185
  • 1
  • 4
0

In case you might be looking for a simple way to switch between different contexts maybe this will be of help.

I got inspired by kubectx and kswitch scripts already mentioned, which I can recommend for most use-cases. They are helping with solving the switching task, but are breaking for me on some bigger or less standard configurations of ~/.kube/config. So I created a sys-exec invocation wrapper and a short-hand around kubectl.

If you call k without params you would see an intercepted prompt to switch context.

Switch kubectl to a different context/cluster/namespace.
Found following options to select from:
 >>> context: [1] franz
 >>> context: [2] gke_foo_us-central1-a_live-v1
 >>> context: [3] minikube
 --> new num [?/q]:

Further, k continues to act as a short-hand. The following is equivalent:

kubectl get pods --all-namespaces
k get pods -A
k p -A
Yauhen Yakimovich
  • 13,635
  • 8
  • 60
  • 67
0

It's a good idea to save it as alias if you do not want to install external lib.

alias kctx1='kubectl config use-context context1'

If you want to use the alias in your current shell session, you can use the source command to execute the script. Here's how:

source script.sh

This will run the script in the current shell session and make the alias available for immediate use.

Note that aliases set within a script are only available within that script's scope. If you want to define aliases that persist beyond the script's execution, you should consider adding them to your shell configuration file (e.g., .bashrc or .bash_profile).

-1

yes, i think this is what your asking about. To view your current config, use kubectl config view. kubectl loads and merges config from the following locations (in order)

--kubeconfig=/path/to/.kube/config command line flag
KUBECONFIG=/path/to/.kube/config env variable
$HOME/.kube/config  - The DEFAULT

i use --kubeconfig since i switch alot between multiple clusters. its slightly cumbersome but it works well.

see these for more info. https://kubernetes.io/docs/tasks/administer-cluster/share-configuration/ and https://kubernetes.io/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/

JamStar
  • 361
  • 1
  • 10
  • I don't tink the user is asking about how to use multiple configs for Kubectl The question is around how to use Yaml code across multiple environments – Vishal Biyani Apr 27 '17 at 06:33