はじめに
今回はIBM Cloud上のKuberenetes環境でHelmを使ってアプリケーションをデプロイする流れを整理します。
Kubernetesを使用したことがない方や、これから勉強される初心者の方向けの基礎的な内容です。
全体的な流れを記述するとともに、問題なくアプリケーションがデプロイされたことを確認することが目的です。
前提条件
・今回の内容にはIBM Cloudのアカウント(無料利用可能)が前提となっています。
・この記事でのコマンドは全てMacOS向けとなっています。
Helmについて
Helmは公式HPにも記載されているとおり、「Kubernetesパッケージ管理」をサポートするツールです。
Kubernetesでのアプリケーション・リソースをパッケージングし、それを「Chart(チャート)」という一つのパッケージとしてKuberenetesクラスターに配布するツールとなります。
Kubernetes環境の構築
今回Kubernetes環境はIBM CloudのKubernetesソリューションである、「IBM Cloud Kubernetes Service(IKS)」のクラシック環境を使用します。
IBM Cloudコンソールのナビゲーション・メニューでKubernetes
→クラスター
をクリックします。
今回はクラシック環境で、東京リージョンでの最小限構成で作成しました。
無料枠も利用可能ですので、もし無料で試してみたい方は、料金プランを無料
に変更し、適切なクラスター名を設定して環境を作成してください。
クラスターの一覧で作成したクラスターに入ると、以下の画面が表示されます。
なお、クラスター作成時には多少の時間がかかる可能性があります。Statusが「正常」になっていることを確認してください。
(もしErrorなどが発生した場合には、IBM Cloud Docsを参照ください。)
なお、コンソールではなくコマンドでもKubernetes環境を立ち上げる方法については、過去の記事を参考にしてください。
これでKuberenetes環境の立ち上げは完了です。
アプリケーションデプロイの流れ
Helmのインストール
まず、Helmがインストールされていない場合には、手順に従って自分のPCなどの開発環境にHelmをインストールします。
Helmはv3.0.2以上であることを確認します。(2024/12/18現在、v3.16.4です。)
インストールが完了したら、コマンドにてHelmのバージョンを確認します。
helm version
version.BuildInfo{Version:"v3.16.4", GitCommit:"472c5736ab01133de504a826bd9ee12cbe4e7904", GitTreeState:"clean", GoVersion:"go1.18.10"}
IBM Cloudにログイン
IBM Cloudにログインします。ログインはCLIを使用したワンタイム・パスコードを利用すると便利です。
右上のプロフィールアイコンをクリックし、CLIとAPIにログイン
をクリックしますと、以下のログインCLIが表示されます。
IBM Cloud CLIをコピーしコマンド入力にてログインを行います。
Kubernetesクラスター指定
今回アプリケーションをデプロイするクラスターを指定します。
Kubernetesの環境を設定するには、exportコマンドが必要です。exportコマンドは、ibmcloud ks cluster config
コマンドを入力して取得します。
なお、クラスターIDはクラスター画面に表示されています。
ibmcloud ks cluster config --cluster <cluster-id>
<cluster-id> のコンテキストを現在の kubeconfig ファイルに追加しました。
これで、クラスターに対して「kubectl」コマンドを実行できます。 例えば、「kubectl get nodes」を実行します。
クラスターに初めてアクセスする場合、RBAC の同期中に「kubectl」コマンドが数秒間失敗することがあります。
Helmを使用してデプロイするアプリケーションのクローン
今回Helmチャートを使用してデプロイするアプリケーションは「JpetStore」アプリケーションです。
「JpetStore」は簡潔なECサイト機能を含んでいるサンプルアプリケーションです。
Gitコマンドを使って、JpetStoreリポジトリをクローンします。
git clone https://github.com/ibm-cloud-labs/jpetstore-kubernetes-compact.git --depth 1
「JpetStore」アプリケーションをデプロイします。
なお、デプロイはjpetstore-kubernetes-compact/helm
ディレクトリで操作します。
cd ../helm
helm install jpetstore ./modernpets/
NAME: jpetstore
LAST DEPLOYED: Fri Jan 27 15:57:43 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Get Cluster Public IP Adress:
$ ibmcloud ks workers mycluster
デプロイの確認を行います。
helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
jpetstore default 1 2023-01-26 19:03:06.402354 +0900 JST deployed modernpets-0.1.5 1.0
デプロイされたPodsも確認します。
kubectl get pods
NAME READY STATUS RESTARTS AGE
jpetstore-modernpets-jpetstoredb-54644d98f5-lgwfr 1/1 Running 0 117s
jpetstore-modernpets-jpetstoreweb-68f5bd5d79-6bhnt 1/1 Running 0 117s
jpetstore-modernpets-jpetstoreweb-68f5bd5d79-lzbjl 1/1 Running 0 117s
上記出力から、Webコンテナ(jpetstoreweb)のPodsが2つ,DBコンテナ(jpetstoredb)のPodsが1つがデプロイされていることが分かります。
DeploymentやServiceについても確認します。
kubectl get all
NAME READY STATUS RESTARTS AGE
jpetstore-modernpets-jpetstoredb-54644d98f5-lgwfr 1/1 Running 0 117s
jpetstore-modernpets-jpetstoreweb-68f5bd5d79-6bhnt 1/1 Running 0 117s
jpetstore-modernpets-jpetstoreweb-68f5bd5d79-lzbjl 1/1 Running 0 117s
sungyunmoon@SungyunnoMacBook-Pro helm % kubectl get all
NAME READY STATUS RESTARTS AGE
pod/jpetstore-modernpets-jpetstoredb-54644d98f5-lgwfr 1/1 Running 0 2m33s
pod/jpetstore-modernpets-jpetstoreweb-68f5bd5d79-6bhnt 1/1 Running 0 2m33s
pod/jpetstore-modernpets-jpetstoreweb-68f5bd5d79-lzbjl 1/1 Running 0 2m33s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/db ClusterIP 172.21.198.176 <none> 3306/TCP 2m33s
service/kubernetes ClusterIP 172.21.0.1 <none> 443/TCP 15m
service/web NodePort 172.21.67.242 <none> 80:31000/TCP 2m33s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/jpetstore-modernpets-jpetstoredb 1/1 1 1 2m33s
deployment.apps/jpetstore-modernpets-jpetstoreweb 2/2 2 2 2m33s
NAME DESIRED CURRENT READY AGE
replicaset.apps/jpetstore-modernpets-jpetstoredb-54644d98f5 1 1 1 2m33s
replicaset.apps/jpetstore-modernpets-jpetstoreweb-68f5bd5d79 2 2 2 2m33s
ブラウザーでのアプリケーションの確認
アプリケーションのデプロイが完了すると、次はブラウザーでの状態を確認します。現在「Jpetstore」アプリケーションは、Kubernetesクラスター上で動作していて、インターネットに公開されている状態です。
確認のために、ワーカーノードのパブリックIPアドレス(Public IP)とノードポートを取得します。
ibmcloud ks worker ls --cluster <cluster-id>
OK
ID パブリック IP プライベート IP フレーバー 状態 状況 ゾーン バージョン
kube-cf9n2nnt0ven2m0lmlqg-moonmyclust-default-0000019d 169.56.0.231 10.132.238.120 u3c.2x4.encrypted normal Ready tok02 1.25.5_1528
kube-cf9n2nnt0ven2m0lmlqg-moonmyclust-default-00000280 165.192.80.43 10.193.189.3 u3c.2x4.encrypted normal Ready tok05 1.25.5_1528
kube-cf9n2nnt0ven2m0lmlqg-moonmyclust-default-0000033b 128.168.82.163 10.192.64.52 u3c.2x4.encrypted normal Ready tok04 1.25.5_1528
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
db ClusterIP 172.21.198.176 <none> 3306/TCP 13m
kubernetes ClusterIP 172.21.0.1 <none> 443/TCP 26m
web NodePort 172.21.67.242 <none> 80:31000/TCP 13m
ブラウザでPublic IP
:NodePort
を開きます。
今回の場合のPublic IP
:NodePort
は以下の通りです。
- Public IP: 169.56.0.231 (3つとも可能ですが、今回は1行目のIPアドレスを使用します。)
- NodePort: 31000
つまり、「169.56.0.231:31000」 にアクセスするとアプリケーションが開きます。画面は以下のようになります。
カテゴリーをクリックして情報を確認したり、右上の検索欄なども使えるので、一度いじりながら確認してみてください。
Kubernetesダッシュボードの確認
最初に立ち上げたKubernetesに入り、ダッシュボードを確認してみます。
右上のKubernetesダッシュボード
をクリックしアクセスします。
ダッシュボードに入りますと、先ほどデプロイしたアプリケーションの情報が記載されていることがわかります。
ワークロードのStatusやCPUとメモリーの使用量など、クラスター情報が見やすくなっているので確認してみてください。
最後に
今回はIBM Cloud上にKubernetesクラスターを立ち上げ、Helmを利用したサンプルアプリケーションのデプロイを実施しました。
前回の記事ではサンプルアプリケーションとしてguestbookを使用してデプロイしたことがありますが、Helmを使用することによってより簡単にデプロイができちゃうことがわかりました。
ただ、Kubernetesダッシュボードの操作法などはまだまだ勉強が必要であるため、今後も引き続きスキルを身につけ、記事を投稿していきたいと思います。
注意点
- このアカウントではディスカウントが適用されているため、表示価格が通常の定価と異なる場合があります。
- 料金はドル-円為替レートに基づいて課金されるため、同じサービスでも料金の変動があります。
- Qiita記事作成にあたり、環境の時間軸の前後やインスタンス名の違いなどがあります。
参考
・【IBM Cloud】 IBM Open Labs上のKubernetesでアプリをデプロイしてみた
・IBM Cloud Docs - IBM Cloud Kubernetes Service
・Helm HP