Programing

gcloud와 minikube간에 kubectl 클러스터를 전환하는 방법

lottogame 2020. 9. 18. 19:13
반응형

gcloud와 minikube간에 kubectl 클러스터를 전환하는 방법


저는 Kubernetes가 두 가지 환경, 즉 내 로컬 환경 (minikube를 실행하는 MacBook)과 Google의 Container Engine (GCE, Kubernetes on Google Cloud)에서 잘 작동합니다. MacBook / 로컬 환경을 사용하여 YAML 파일을 개발하고 테스트 한 다음 완료되면 GCE에서 시도합니다.

현재 각 환경에서 개별적으로 작업해야합니다. 로컬 환경에서 YAML 파일을 편집하고 준비가되면 (git) GCE 환경에 복제 한 다음 사용 / 배포해야합니다. 이것은 다소 번거로운 과정입니다.

이상적으로는 Macbook의 kubectl을 사용하여 로컬 minikube 또는 GCE Kubernetes 환경 사이를 쉽게 전환하고 YAML 파일이 사용되는 위치를 쉽게 결정하고 싶습니다. 이를 위해 컨텍스트를 전환하는 간단한 방법이 있습니까?


다음을 사용하여 로컬 (minikube)에서 gcloud로 전환 할 수 있습니다.

kubectl config use-context CONTEXT_NAME

모든 컨텍스트를 나열하려면 :

kubectl config get-contexts

로컬 및 gcloud에 대해 서로 다른 환경을 만들고 별도의 yaml 파일에 넣을 수 있습니다.


Mac 용 GUI 기반 솔루션을 찾고 있고 Docker Desktop이 설치되어있는 경우 Docker 메뉴 모음 아이콘을 사용할 수 있습니다. 여기서 kubeconfig에있는 모든 컨텍스트가 포함 된 "Kubernetes"메뉴를 찾을 수 있으며 이들 사이를 쉽게 전환 할 수 있습니다.


표준 kubectl 명령어에 대한 더 빠른 단축키는 kubectx 를 사용하는 것입니다 .

  • 컨텍스트 나열 : kubectx
    • 에 해당 kubectl config get-contexts
  • 컨텍스트 전환 (foo로) : kubectx foo
    • 에 해당 kubectl config use-context foo

macOS에 설치하려면 : brew install kubectx

kubectx 패키지에는 또한라는 네임 스페이스를 전환하기위한 유사한 도구가 포함되어 kubens있습니다.

이 두 가지는 여러 컨텍스트와 네임 스페이스에서 정기적으로 작업하는 경우 매우 편리합니다.

더 많은 정보 : https://ahmet.im/blog/kubectx/


요약 : AppleScript를 통해 Kubernetes 컨텍스트를 전환하는 GUI를 만들었습니다. shift-cmd-x를 통해 활성화합니다.

나도 같은 문제가 있었다. 명령 줄로 컨텍스트를 전환하는 것은 고통 스러웠습니다. FastScripts를 사용하여 키 콤보 (shift-cmd-x)를 설정하여 다음 AppleScript ($ (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

다른 환경의 저장소에서 YAML 파일을 복제하는 것은 확실히 이상적입니다. 해야 할 일은 환경마다 다른 매개 변수를 추출하여 YAML 파일을 템플릿 화하는 것입니다.

물론 일부 템플릿 엔진을 사용하고 YAML에서 값을 분리하고 특정 환경에 대한 YAML을 생성 할 수 있습니다. 그러나 Helm Charts 를 채택하면 쉽게 할 수 있습니다 . 샘플 차트를 살펴 보려면이 Github 저장소의 stable 디렉토리로 이동하세요.

Wordpress 차트 의 예를 들어 보려면 두 가지 환경에 대해 두 가지 다른 명령을 사용할 수 있습니다.

Dev의 경우 :

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

CLI에서이 값을 전달할 필요는 없지만 aptly라는 파일에 값을 저장할 values.yml수 있으며 환경에 따라 다른 파일을 가질 수 있습니다.

Helm 차트 표준으로 변환하려면 약간의 작업이 필요하지만 그만한 가치가 있습니다.


최신 (docker 19.03) docker context명령 도 확인하십시오 .

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 

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


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

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

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/

참고URL : https://stackoverflow.com/questions/43643463/how-to-switch-kubectl-clusters-between-gcloud-and-minikube

반응형