Search code examples
kubectl

How to manage multiple GKE projects in one Google Cloud Account


Given a situation where I have three separate GKE instances in different Google Cloud projects under the same billing account, how can I configure kubectl so that the commands I execute with it only apply to a specific cluster?


Solution

  • kubectl access to Kubernetes API servers are managed by configuration contexts.

    Here is some documentation for how to do so. In a nutshell, you would stand up multiple Kubernetes clusters and then specify a configuration like so:

    apiVersion: v1
    kind: Config
    preferences: {}
    
    clusters:
    - cluster:
      name: development
    - cluster:
      name: scratch
    
    users:
    - name: developer
    - name: experimenter
    
    contexts:
    - context:
      name: dev-frontend
    - context:
      name: dev-storage
    - context:
      name: exp-scratch
    

    To automatically generate one, you can run the following commands:

    # Add cluster details to the file
    kubectl config --kubeconfig=config-demo set-cluster development --server=https://1.2.3.4 --certificate-authority=fake-ca-file
    
    kubectl config --kubeconfig=config-demo set-cluster scratch --server=https://5.6.7.8 --insecure-skip-tls-verify
    
    
    # Add user details to the configuration file
    kubectl config --kubeconfig=config-demo set-credentials developer --client-certificate=fake-cert-file --client-key=fake-key-seefile
    
    kubectl config --kubeconfig=config-demo set-credentials experimenter --username=exp --password=some-password
    
    
    # Add context details to the configuration file
    kubectl config --kubeconfig=config-demo set-context dev-frontend --cluster=development --namespace=frontend --user=developer
    
    kubectl config --kubeconfig=config-demo set-context dev-storage --cluster=development --namespace=storage --user=developer
    
    kubectl config --kubeconfig=config-demo set-context exp-scratch --cluster=scratch --namespace=default --user=experimenter
    

    After that, you can safe the context. Then, going forward, when you run a kubectl command, the action will apply to the cluster and namespace listed in the specifeid context. For example:

    kubectl config --kubeconfig=config-demo use-context dev-frontend
    

    To then change the context to another one you specified:

    kubectl config --kubeconfig=config-demo use-context exp-scratch