Kubernetes のスケーラブルな Web アプリケーション
このチュートリアルでは、費用が発生する場合があります。 コスト見積もりツールを使用して、予測使用量に基づいてコスト見積もりを生成します。
このチュートリアルでは、Web アプリケーションをローカル環境のコンテナー内で実行してから、Kubernetes Service で作成した Kubernetes クラスターにデプロイする手順を説明します。 オプションとして、コンテナイメージを作成し、そのイメージをプライベートレジストリにプッシュすることもできます。 また、カスタム・サブドメインをバインドし、環境の正常性を監視し、アプリケーションをスケーリングする方法についても説明します。
コンテナーは、環境間でアプリをシームレスに移動できるようにアプリとそのすべての依存関係をパッケージ化するための標準的な手段です。 仮想マシンとは異なり、コンテナーはオペレーティング・システムをバンドルしません。 アプリのコード、ランタイム、システム・ツール、ライブラリー、設定値のみがコンテナー内にパッケージされます。 コンテナーは、仮想マシンより軽量で移植しやすく、効率的です。
目標
- Kubernetes クラスターに Web アプリケーションをデプロイする。
- カスタム・サブドメインをバインドする。
- クラスターのログと正常性をモニターする。
- Kubernetes ポッドをスケーリングする。
- 開発者がサンプルのウェブアプリケーションをダウンロードまたはクローンする。
- オプションでアプリケーションをビルドして、コンテナー・イメージを生成します。
- オプションで、イメージが IBM Cloud Container Registry の名前空間にプッシュされます。
- アプリケーションが Kubernetes クラスターにデプロイされます。
- ユーザーがアプリケーションにアクセスします。
開始前に
このチュートリアルでは、以下が必要です。
- IBM Cloud CLI
- IBM Cloud Kubernetes Service プラグイン (
kubernetes-service
)
- IBM Cloud Kubernetes Service プラグイン (
kubectl
: Kubernetes クラスターと対話します。Helm 3
: チャートをデプロイします。
ご使用のオペレーティング環境でこれらのツールをダウンロードおよびインストールするための手順は、チュートリアルの概説ガイドに記載されています。
これらのツールのインストールを回避するには、 Cloud Shell IBM Cloudから使用できます。
さらに、以下を行います。
- Secrets Manager インスタンスが必要になります。 Secrets Manager を使用すると、IBM Cloud サービスまたはカスタムビルト・アプリケーションで使用されるシークレットの作成、リース、および一元管理を行うことができます。 シークレットは、専用の Secrets Manager インスタンスに保管されます。組み込み機能を使用して、シークレットの有効期限をモニターしたり、シークレットをスケジュールしたり、手動でローテーションしたりすることができます。 このチュートリアルでは、 Kubernetes を使用して、 Secrets Managerから TLS 証明書を取得し、 Kubernetesに注入します。 既にインスタンスがある場合は、既存のインスタンスを使用することもできますし、Secrets Manager サービス・インスタンスの作成で概説されている手順に従って新しいインスタンスを作成することもできます。
- オプションで、 レジストリー名前空間をセットアップします。 これは、独自のカスタム・コンテナー・イメージを作成する場合にのみ必要です。
- Kubernetesの基本を理解します。
Secrets Manager とのサービス間通信を有効にします
Secrets Manager を IBM Cloud Kubernetes Service クラスターと統合するには、サービス間通信の許可が必要です。 以下の手順に従って、認証を設定してください。 詳しくは、 Secrets Manager を参照してください。
- IBM Cloud コンソールで、「管理」>「アクセス (IAM)」 をクリックします。
- 「許可」 をクリックします。
- 「作成」 をクリックします。
- ソースサービスリストで、 Kubernetes Service を選択します。
- アクセス権限の有効範囲を 「すべてのリソース」 に設定するオプションを選択します。
- ターゲットサービスリストで、 Secrets Manager を選択します。
- アクセス権限の有効範囲を 「すべてのリソース」 に設定するオプションを選択します。
- サービスへのアクセスセクションで、 マネージャーオプションにチェックを入れます。
- 「許可」 をクリックします。
Kubernetes クラスターを作成する
IBM Cloud Kubernetes Serviceは IBM Cloud 上でコンテナ化されたアプリケーションをデプロイおよび管理するための、コンピューティングホストKubernetesを独自に作成するためのマネージドサービスです。 このチュートリアルでは、ゾーン 1 つ、ワーカー・ノード 1 つ、提供されている最小サイズ ( フレーバー ) で構成される最小クラスターで十分です。
-
Kubernetes を開き 、「クラスタの作成」 をクリックします。
-
選択した 「インフラストラクチャー」 にクラスターを作成します。
-
VPC インフラストラクチャー上の Kubernetes に VPC を選択する場合は、以下の手順を実行します。 Kubernetes クラスターを作成する前に、VPC とサブネットを作成する必要があります。 詳しくは、 VPC クラスターの作成 の資料を参照してください。
- 「VPC の作成」 をクリックします。
- 「ロケーション」 セクションで、 「地域」 と 「地域」 を選択します (例えば、
Europe
とLondon
)。 - VPCの名前を入力し、 リソースグループを選択し、必要に応じてタグを追加してリソースを整理します。
- デフォルトのセキュリティー・グループ の 「SSH を許可」 と 「ping を許可」 のチェック・マークを外します。
- 「すべてのゾーンにサブネットを作成する 」のチェックを外します。
- 「作成」 をクリックします。
- 「ワーカー・ゾーンとサブネット (Worker zones and subnets)」 の下で、サブネットが作成されなかった 2 つのゾーンのチェック・マークを外します。
- 「ゾーンごとのワーカー・ノード数 (Worker nodes per zone)」 を
1
に設定し、 「フレーバーの変更 (Change フレーバー)」 をクリックして探索し、任意のワーカー・ノード・サイズに変更します。 - 「Ingress」 で、 「Ingress シークレット管理 (Ingress secrets management)」 を有効にし、既存の Secrets Manager インスタンスを選択します。
- クラスター名 を入力し、VPC に使用したのと同じ リソース・グループ を選択します。
- このチュートリアルでは、ロギングまたはモニタリングは必要ありません。これらのオプションを無効にして、 「作成」 をクリックします。
- クラスターがアクティブになるのを待っている間に、VPC にパブリック・ゲートウェイを接続します。 仮想プライベート・クラウド にナビゲートします。
- クラスターで使用されている VPC の名前をクリックし、「サブネット」セクションまでスクロールダウンします。
- 前に作成したサブネットの名前をクリックし、 Public Gateway セクションで 「切り離し済み」 をクリックして、状態を 「接続済み」 に変更します。
-
以下のステップは、クラシック・インフラストラクチャー上の Kubernetes に対して 「クラシック」 を選択した場合です。 詳しくは、 標準クラシック・クラスターの作成 の資料を参照してください。
- 「ロケーション」 セクションで、 「地域」、複数ゾーンの 「可用性」、および メトロ (
Europe
やLondon
など) を選択します。 - 「ワーカー・ゾーンと VLAN」 の下で、1 つを除くすべてのゾーンのチェック・マークを外します。
- 「ゾーンごとのワーカー・ノード数 (Worker nodes per zone)」 を
1
に設定し、 「フレーバーの変更 (Change フレーバー)」 をクリックして探索し、任意のワーカー・ノード・サイズに変更します。 - 「マスター・サービス・エンドポイント」 の下で、 「両方ともプライベート & パブリック・エンドポイント」 を選択します。
- 「Ingress」 で、 「Ingress シークレット管理 (Ingress secrets management)」 を有効にし、既存の Secrets Manager インスタンスを選択します。
- クラスター名 を入力し、これらのリソースを作成する リソース・グループ を選択します。
- このチュートリアルでは、ロギングまたはモニタリングは必要ありません。これらのオプションを無効にして、 「作成」 をクリックします。
- 「ロケーション」 セクションで、 「地域」、複数ゾーンの 「可用性」、および メトロ (
-
サンプル・アプリケーションの複製
このセクションでは GitHubをクローンし、ランディングページと2つのエンドポイントを持つシンプルな Helmの NodeJS サンプルアプリケーションを入手して、作業を開始します。 サンプルアプリケーションは、必要に応じていつでも拡張できます。
- 端末で、以下のコマンドを実行して GitHub リポジトリーを複製します。
git clone https://github.com/IBM-Cloud/kubernetes-node-app
- アプリケーションディレクトリに変更:
cd kubernetes-node-app
このサンプルアプリケーションコードには、ローカルでの開発と Kubernetesへのデプロイに必要なすべての構成ファイルが含まれています。
Helm チャートを使用してアプリケーションをクラスターにデプロイする
Helm 3 を使用したアプリケーションのデプロイ
アプリケーションのコンテナイメージはすでに構築され IBM Cloud Container Registryのパブリックレジストリにプッシュされています。 このセクションでは Helm を使用してサンプルアプリケーションをデプロイします。 Helm を使用すれば、Helm チャートで Kubernetes アプリケーションを管理できます。非常に複雑な Kubernetes アプリケーションでも Helm チャートで定義、インストール、アップグレードできます。
注:アプリケーションをビルドして、ご自身のコンテナレジストリにプッシュしたい場合は Docker を使用して行うことができます。 Dockerfileはリポジトリに用意されており、イメージは IBM Cloud Container Registry またはその他のコンテナレジストリにプッシュすることができます。
-
MYAPP
という名前の環境変数を定義し、プレースホルダーをイニシャルに置き換えてアプリケーション名を設定しますexport MYAPP=<your-initials>kubenodeapp
-
クラスターを確認します。
ibmcloud ks cluster ls
-
クラスタ名で変数を初期化します
export MYCLUSTER=<CLUSTER_NAME>
-
kubectl
のCLI環境を初期化しますibmcloud ks cluster config --cluster $MYCLUSTER
ibmcloud target -r <region> -g <resource_group>
を使用してクラスターを作成したリージョンとリソース・グループに対して CLI が構成されていることを確認します。 クラスターへのアクセスについて、および kubectl コマンドを実行するための CLI の構成について詳しくは、CLI の構成に関するセクションを確認してください。 -
default
の Kubernetes 名前空間を使用するか、このアプリケーションの名前空間を新規作成することができます。default
Kubernetes ネームスペースを使用したい場合は、環境変数を設定するために以下のコマンドを実行してくださいexport KUBERNETES_NAMESPACE=default
- Kubernetes 名前空間を新規作成する場合は、Kubernetes サービス資料の既存のイメージ・プル・シークレットのコピーと選択した名前空間の Kubernetes サービス・アカウントにイメージ・プル・シークレットを保管するのセクションに示されている手順に従います。
完了したら、以下のコマンドを実行します
export KUBERNETES_NAMESPACE=<KUBERNETES_NAMESPACE_NAME>
-
サンプルアプリケーションディレクトリの下にあるチャートディレクトリに変更します
cd chart/kubernetesnodeapp
-
Helm チャートをインストールします。
helm install $MYAPP --namespace $KUBERNETES_NAMESPACE . --set image.repository=icr.io/solution-tutorials/tutorial-scalable-webapp-kubernetes
-
サンプル・アプリケーション・ディレクトリーに戻ります。
cd ../..
アプリケーションの表示
- 名前空間内の Kubernetes サービスをリストします。
kubectl get services -n $KUBERNETES_NAMESPACE
- 名前空間内の Kubernetesをリストアップします
kubectl get pods -n $KUBERNETES_NAMESPACE
クラスターで IBM 提供ドメインを使用する
クラスタIBMドメインが付属しています。 そのため、適切な URL を使用して標準的な HTTP/S ポートでアプリケーションを公開することができます。
Ingress を使用して、サービスへのクラスター・インバウンド接続をセットアップします。

-
IBM提供の Ingress サブドメイン と Ingress シークレットを確認します。
ibmcloud ks cluster get --cluster $MYCLUSTER
次を見つけます。
Ingress subdomain: mycluster.us-south.containers.appdomain.cloud Ingress secret: mycluster
-
Ingress サブドメインの値を保持するための環境変数
INGRESS_SUBDOMAIN
を定義します。export INGRESS_SUBDOMAIN=<INGRESS_SUBDOMAIN>
-
Ingress シークレットの値を保持するための環境変数
INGRESS_SECRET
を定義します。export INGRESS_SECRET=<INGRESS_SECRET>
-
サンプルアプリケーションディレクトリで、以下のbashコマンドを実行して、 HTTP と HTTPS をサポートする IBMのドメインを指すIngressファイル
ingress-ibmsubdomain.yaml
を作成します./ingress.sh ibmsubdomain_https
ファイルは、yaml-templatesフォルダ内のテンプレートファイル
ingress-ibmsubdomain-template.yaml
から生成されます。プレースホルダ($
)で囲まれたすべての値を、環境変数から適切な値に置き換えます。 -
Ingress をデプロイします。
kubectl apply -f ingress-ibmsubdomain.yaml
-
https://<myapp>.<ingress-subdomain>/
でブラウザでアプリケーションを開くか、以下のコマンドを実行して HTTPを確認してくださいcurl -I https://$MYAPP.$INGRESS_SUBDOMAIN
独自のカスタム・サブドメインを使用する
このセクションでは、カスタム・ドメインを所有している必要があります。 IBMクラスタのサブドメインを指す CNAME
レコードを作成する必要があります。 ドメインが example.com
の場合、CNAME は <myapp>.<example.com>
<myapp>.<ingress-subdomain>
を指します。
HTTP の使用
- カスタムドメインを指す環境変数を作成します
export CUSTOM_DOMAIN=<example.com>
- テンプレート・ファイル
ingress-customdomain-http.yaml
から、ドメインを指す Ingress ファイルingress-customdomain-http-template.yaml
を作成します。./ingress.sh customdomain_http
- Ingress をデプロイします。
kubectl apply -f ingress-customdomain-http.yaml
http://<myapp>.<example.com>/
でアプリケーションにアクセスします。
HTTPS の使用
現時点で HTTPS を使用して https://<myapp>.example.com/
でアプリケーションにアクセスしようとすると、接続がプライベートではないことを知らせるセキュリティー警告が Web ブラウザーに表示されるはずです。
ここで、以前にクラスターに構成した Secrets Manager インスタンスに証明書をインポートします。
-
「リソース・リスト」 の 「セキュリティー」 から Secrets Manager サービス・インスタンスにアクセスします。
-
左側のナビゲーションで 「シークレット」 をクリックします。
-
追加 をクリックします。
-
「パブリック証明書」、 「インポートされた証明書」 、または プライベート証明書のいずれかを選択できます。 詳細な手順については、それぞれの資料のトピック ( SSL/TLS 公開証明書の注文、 SSL/TLS 証明書のインポート 、または SSL/TLS 秘密証明書の作成) を参照してください。 証明書をインポートすることを選択した場合は、証明書ファイル、秘密鍵ファイル、および中間証明書ファイルを必ずアップロードしてください。
-
インポートされた証明書または注文された証明書の項目を見つけて、それをクリックします。
- ドメイン名が$CUSTOM_DOMAINと一致していることを確認してください。 ワイルドカード証明書をアップロードした場合は、ドメイン名にアスタリスクが含まれます。
- 証明書のCRN の横にあるコピーアイコンをクリックします。
- コピーしたばかりの値を指す環境変数を作成します。
export CERTIFICATE_CRN=<certificate CRN>
-
SSL/TLS 証明書用の Ingress シークレットをクラスター内に作成します。
ibmcloud ks ingress secret create --name nodeapp-tls-cert --cluster $MYCLUSTER --cert-crn $CERTIFICATE_CRN --namespace $KUBERNETES_NAMESPACE
-
カスタムドメインを指す環境変数を作成します
export CUSTOM_DOMAIN=<example.com>
-
テンプレート
ingress-customdomain-https-template-sm.yaml
からお客様のドメインを指すIngressファイルingress-customdomain-https.yaml
を作成します./ingress.sh customdomain_https_sm
-
Ingress をデプロイします。
kubectl apply -f ingress-customdomain-https.yaml
-
https://$MYAPP.$CUSTOM_DOMAIN/
でアプリケーションにアクセスします。
curl -I https://$MYAPP.$CUSTOM_DOMAIN
アプリケーションの正常性をモニターする
- アプリケーションの正常性を確認するには、クラスターにナビゲートしてクラスターのリストを表示し、対象のクラスターをクリックします。
- 「Kubernetes ダッシュボード (Kubernetes Dashboard)」 をクリックして、新しいタブでダッシュボードを起動します。
- 左側の 「ポッド」 をクリックし、$MYAPP に一致する ポッド名 をクリックします。
- CPU とメモリーの使用量を調べます。
- ノード IP 名をメモします。
- 右上のアクション・メニューで 「ログの表示」 をクリックして、アプリケーションの標準出力とエラーを表示します。
- 左側のペインでノードを選択し、先にメモしたノード名をクリックして、 アロケーションリソースを確認し、ノードの健全性を確認します。
- コンテナーの中に入るには、アクション・メニューで 「実行先 (Exec into)」 を選択します。
Kubernetes ポッドをスケーリングする
アプリケーションの負荷が増加したら、デプロイメントのポッド・レプリカの数を手動で増やすことができます。 レプリカは、 ReplicaSetによって管理されます。 アプリケーションを 2 つのレプリカにスケーリングするには、次のコマンドを実行します。
kubectl scale deployment kubernetesnodeapp-deployment --replicas=2
しばらくすると、 Kubernetes (または kubectl get pods
)に、お客様のアプリケーション用の2つのポッドが表示されます。 クラスタ内の Ingress コントローラが、2つのレプリカ間の負荷分散を処理します。
Kubernetes を使用すると、CPUに基づいてアプリのインスタンス数を自動的に増減させる 水平ポッドオートスケーリングを有効にすることができます。
自動スケーリング機能を作成し、ポリシーを定義するには、以下のコマンドを実行します
kubectl autoscale deployment kubernetesnodeapp-deployment --cpu-percent=5 --min=1 --max=5
オートスケーラーが正常に作成されると、以下のような表示がされます
horizontalpodautoscaler.autoscaling/<deployment-name> autoscaled
.
リソースを削除する
-
水平ポッド自動スケーリング機能を削除します。
kubectl delete horizontalpodautoscaler.autoscaling/kubernetesnodeapp-deployment
-
適用したリソースを削除します。
kubectl delete -f ingress-customdomain-https.yaml kubectl delete -f ingress-customdomain-http.yaml kubectl delete -f ingress-ibmsubdomain.yaml
-
このアプリケーションのために作成した Kubernetes 成果物を削除します。
helm uninstall $MYAPP --namespace $KUBERNETES_NAMESPACE
-
Kubernetes シークレットを削除します。
kubectl -n $KUBERNETES_NAMESPACE delete secret kubernetesnodeapp-api-key
-
外部シークレット・オペレーターを削除します。
helm uninstall external-secrets
-
サービス ID を削除します。
ibmcloud iam service-id-delete $SERVICE_ID
-
クラスターを削除します。