CI部の村上です。
小ネタ的な記事ですが、掲題の件について紹介します。
前提
ここでは用語の説明をします。すでにご存知の方は読み飛ばしてください。
Helmとは
HelmはKubernetesにおけるパッケージ管理ツールです。
Linuxにおけるyumのようなもので、様々なアプリケーションがリポジトリ上に公開されています。
利用者はhelm install
などのコマンドを使って、自身のクラスター上に簡単にアプリケーションをデプロイできます。
Helmのインストール
ドキュメントに従って、インストールします。
以下のコマンドでインストールする方法が最も簡単かと思います。
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
Kubeconfigとは
Kubernetesを操作するkubectl
コマンドですが、接続先のクラスターなどの情報はkubeconfigを参照して決定しています。
kubeconfigの場所は$HOME/.kube/config
です。
kubeconfigにはcontextという要素があり、ここに接続先のクラスター情報が載っています。
contextは3つのパラメータ、cluster、namespace、userを持ちます。デフォルトでは、kubectlコマンドラインツールはクラスターとの通信にcurrent contextのパラメーターを使用します。
環境設定について
現在の環境は以下のようになっています。
- 2つのEKSクラスター
test01
とtest02
がある - kubeconfigのcurrent contextは
test01
を指定している
以下は詳細です。
EKSクラスターの状態
以下のように2つのEKSクラスターtest01
とtest02
がある状態です。
administrator:~/environment $ aws eks list-clusters { "clusters": [ "test01", "test02" ] }
kubeconfigの設定
current-contextはtest01
のEKSクラスターに設定されています。
administrator:~/environment $ kubectl config current-context i-0a5b742b0d789bd32@test01.ap-northeast-1.eksctl.io
ちなみに、もしkubectx
がインストールされている場合は上記コマンドの代わりに以下のようにします。
administrator:~/environment $ kubectx i-0a5b742b0d789bd32@test01.ap-northeast-1.eksctl.io i-0a5b742b0d789bd32@test02.ap-northeast-1.eksctl.io
こんな感じで現在のcontextに色が付きます
Helmのバージョン
バージョン3を使用します。
administrator:~/environment $ helm version version.BuildInfo{Version:"v3.5.4", GitCommit:"1b5edb69df3d3a08df77c9902dc17af864ff05d1", GitTreeState:"clean", GoVersion:"go1.15.11"}
test02
のEKSクラスターにデプロイしたい場合どうするか
contextの切り替え
この状況でtest02
のEKSクラスターに何かをデプロイしたい場合、まずkubeconfigのcontextを切り替えます。
administrator:~/environment $ kubectl config use-context i-0a5b742b0d789bd32@test02.ap-northeast-1.eksctl.io Switched to context "i-0a5b742b0d789bd32@test02.ap-northeast-1.eksctl.io".
ちなみに、もしkubectx
がインストールされている場合は上記コマンドの代わりに以下のようにします。
administrator:~/environment $ kubectx i-0a5b742b0d789bd32@test02.ap-northeast-1.eksctl.io Switched to context "i-0a5b742b0d789bd32@test02.ap-northeast-1.eksctl.io".
デプロイ
Helmでデプロイします(結果は一部省略)。
dministrator:~/environment $ helm install tokyo2020 bitnami/nginx NAME: tokyo2020 LAST DEPLOYED: Mon Aug 2 07:50:48 2021 NAMESPACE: default STATUS: deployed
test02
のEKSクラスターにデプロイされていることが確認できます。test01
にはpodがありません。
administrator:~/environment $ kubectl get pod --context=i-0a5b742b0d789bd32@test02.ap-northeast-1.eksctl.io NAME READY STATUS RESTARTS AGE tokyo2020-nginx-5c8fb6f59d-5gpbc 1/1 Running 0 8m52s administrator:~/environment $ kubectl get pod --context=i-0a5b742b0d789bd32@test01.ap-northeast-1.eksctl.io No resources found in default namespace.
やりたいこと
自分だけの検証環境とかで、いちいちcontextを切り替えるのが面倒です。
helm install
するときにデプロイ先のEKSクラスターを指定したいです。
手順
--kube-context
で指定可能でした。
kubeconfigの設定
current-contextをtest01
のEKSクラスターに戻しておきます。
administrator:~/environment $ kubectl config use-context i-0a5b742b0d789bd32@test01.ap-northeast-1.eksctl.io Switched to context "i-0a5b742b0d789bd32@test01.ap-northeast-1.eksctl.io".
current-contextがtest01
のEKSクラスターに戻りました。
administrator:~/environment $ kubectl config current-context i-0a5b742b0d789bd32@test01.ap-northeast-1.eksctl.io
Helmでデプロイ先のEKSクラスターを指定する
test02
のEKSクラスターを指定してデプロイします(結果は一部省略)
administrator:~/environment $ helm install paris2024 bitnami/nginx --kube-context i-0a5b742b0d789bd32@test02.ap-northeast-1.eksctl.io NAME: paris2024 LAST DEPLOYED: Mon Aug 2 08:12:04 2021 NAMESPACE: default STATUS: deployed
test02
のEKSクラスターにデプロイされていることが確認できます。test01
にはpodがありません。
administrator:~/environment $ kubectl get pod --context=i-0a5b742b0d789bd32@test02.ap-northeast-1.eksctl.io NAME READY STATUS RESTARTS AGE paris2024-nginx-6c5bb84cbc-5f6vb 1/1 Running 0 56s tokyo2020-nginx-5c8fb6f59d-5gpbc 1/1 Running 0 22m administrator:~/environment $ kubectl get pod --context=i-0a5b742b0d789bd32@test01.ap-northeast-1.eksctl.io No resources found in default namespace.
まとめ
ちゃんとcontextの切り替えをやった方が良い場面もありますが、省略しても良い場面ではこのようにワンライナーでやってもよいかもしれないですね。
といいつつ、私はkubectx
で切り替える派に落ち着きました。
以上です。