Helmでデプロイ先のEKSクラスターを指定する

記事タイトルとURLをコピーする

CI部の村上です。

小ネタ的な記事ですが、掲題の件について紹介します。

前提

ここでは用語の説明をします。すでにご存知の方は読み飛ばしてください。

Helmとは

HelmはKubernetesにおけるパッケージ管理ツールです。

Linuxにおけるyumのようなもので、様々なアプリケーションがリポジトリ上に公開されています。

利用者はhelm installなどのコマンドを使って、自身のクラスター上に簡単にアプリケーションをデプロイできます。

Helmのインストール

ドキュメントに従って、インストールします。

以下のコマンドでインストールする方法が最も簡単かと思います。

curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

helm.sh

Kubeconfigとは

Kubernetesを操作するkubectlコマンドですが、接続先のクラスターなどの情報はkubeconfigを参照して決定しています。

kubeconfigの場所は$HOME/.kube/configです。

kubeconfigにはcontextという要素があり、ここに接続先のクラスター情報が載っています。

contextは3つのパラメータ、cluster、namespace、userを持ちます。デフォルトでは、kubectlコマンドラインツールはクラスターとの通信にcurrent contextのパラメーターを使用します。

kubernetes.io

環境設定について

現在の環境は以下のようになっています。

  • 2つのEKSクラスターtest01test02がある
  • kubeconfigのcurrent contextはtest01を指定している

f:id:swx-murakami:20210803070755p:plain

以下は詳細です。

EKSクラスターの状態

以下のように2つのEKSクラスターtest01test02がある状態です。

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に色が付きます f:id:swx-murakami:20210802164515p:plain

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で切り替える派に落ち着きました。

以上です。

村上博哉 (執筆記事の一覧)

2020年4月入社。機械学習が好きです。記事へのご意見など:hiroya.murakami@serverworks.co.jp