[超小ネタ]direnvを使ってkubectlとkubeconfigをプロジェクト(ディレクトリ)毎に切り替える

超小ネタですが、direnvを使ってプロジェクト毎にkubectlのバージョン、kubeconfigのファイルを切り替える方法を紹介します。
2019.01.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

おはようございます、加藤です。複数のKubernetes環境を管理しているとバージョン毎にkubectlを切り替えるが必要になる場合があり面倒だったりしませんか? また、kubeconfigのcontextはkubectxで切り替えられるけど、そもそも単一ファイルで管理するのが不安だったりしませんか? Kubernetesとその周辺ツールでもっといい方法があるかもしれませんが、私はdirenvで対応しているのでその方法をご紹介ます。

前提

  • direnvがインストール済みであること

紹介

この方法を使うには、プロジェクト毎に専用のディレクトリが存在し、そのディレクトリに移動してから作業を行うことが必須になります。

kubectl

まず、kubectlのバイナリを任意のディレクトリに保存し実行権限を付与しておきます。私は下記の様に AWS or GCP とバージョン毎に配置しています。

 tree ~/bin/kubectl/
/Users/$USER/bin/kubectl/
├── aws
│   ├── v1.10.3
│   │   └── kubectl
│   └── v1.11.5
│       └── kubectl
└── gcp
    └── v1.12.0
        └── kubectl

後は、.envrcで以下の様に定義します。(GKE v1.12.0の場合)

.envrc

PATH_add ~/bin/kubectl/gcp/v1.12.0

設定が完了したら、whichコマンドで意図したバイナリが実行されているか確認しましょう。

$ direnv allow
$ which kubectl
/Users/$USER/bin/kubectl/gcp/v1.12.0/kubectl
$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.0", GitCommit:"0ed33881dc4355495f623c6f22e7dd0b7632b7c0", GitTreeState:"clean", BuildDate:"2018-09-27T17:05:32Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"darwin/amd64"}

kubeconfig

kubeconfigを作業ディレクトリ配下に作成するようにします。

.envrc

export KUBECONFIG="$(pwd)/.kube/config"

$(pwd)を使用して絶対パスにしているのは、サブディレクトリに移動した際にも参照が可能にする為です。 これでkubectlなどが$(pwd)/.kube/configを参照してくれる様になります。

また事前にこの設定を行って置くと...

$ aws eks update-kubeconfig --name cluster_name
$ gcloud container clusters get-credentials cluster_name

これらのコマンドも$(pwd)/.kube/configにconfigを出力してくれます!!

まとめ

.envrc

export KUBECONFIG="$(pwd)/.kube/config"
PATH_add ~/bin/kubectl/gcp/v1.12.0

また、EKSを使っている方は下記のブログもおすすめです。

[超小ネタ] Amazon Elastic Container Service for Kubernetes(EKS)でkubectlする際に毎回MFAを求められて面倒なのを回避する

あとがき

超小ネタですが、誰かの為になれば幸いです。