IBM Cloud Kubernetes Service アプリケーションへの Cloud Databases デプロイメントの接続

Cloud Databases 「Hello World」Kubernetes の例リポジトリーには、Cloud Databases デプロイメントを IBM Cloud Kubernetes Service アプリケーションに接続する方法を詳述した、さまざまなプログラミング言語で作成されたサンプル IBM Cloud® アプリケーションが保持されています。

サンプル・リポジトリーの各 Git ブランチは、Node.js または Python を使用する特定のプログラミング言語のサンプルに対応しています。 各フォルダー内のファイルは、データベースまたはメッセージ・キューに対応しています。

サンプル・アプリケーションを試す

使用するそれぞれのリポジトリーを複製します。 例えば、**「Node」リポジトリーを複製するには、「Node」ブランチを選択します。 次に、「Clone or download」**をクリックして、SSH または HTTPS を使用して複製するために必要な URL を取得します。 このコマンドは、次のようになります。

git clone -b node git@github.com:IBM-Cloud/clouddatabases-helloworld-kubernetes-examples.git

または、HTTPS を使用した複製:

git clone -b node https://github.com/IBM-Cloud/clouddatabases-helloworld-kubernetes-examples.git

ブランチが複製されたら、試行するデータベースの適切なディレクトリーを選択します。 各データベースには、データベースまたはメッセージ・キューと、IBM Cloud Kubernetes Service を使用するアプリケーションのプロビジョンとデプロイを行う方法に関する指示があります。

IBM Cloud 上での実行

  1. IBM Cloud アカウントをまだ持っていない場合は、ここで登録してください。

  2. IBM Cloud CLI のダウンロードとインストール。 IBM Cloud CLI ツールを使用すると、コンソールまたは CLI から IBM Cloud と通信することができます。

  3. Kubernetes Service CLI プラグインと Container Registry CLI プラグインをインストールします

    ibmcloud plugin install container-service
    ibmcloud plugin install container-registry
    

    インストールを検証するには、以下を実行します。

    ibmcloud plugin list
    

    次のような応答を受け取ります。

    Listing installed plug-ins...
    
    Plugin Name                            Version   Status
    container-registry                     0.1.382
    container-service/kubernetes-service   0.3.34
    
  4. Kubernetes CLI をダウンロードしてインストールします。

    ご使用のプラットフォーム用の Kubernetes CLI をダウンロードしてインストールするための手順に従います。

  5. CLI ツールで IBM Cloud に接続し、プロンプトに従ってログインします。

    ibmcloud login
    

    フェデレーテッド・ユーザー ID がある場合は、ibmcloud login --sso コマンドを使用して、シングル・サインオン ID でログインします。

データベースの作成

このプロセスにより、指定したサービスに標準データベース・インスタンスが作成されます。これにより、選択したプランで追加料金が発生する可能性があります。

  1. 以下のコマンドを使用して、リソース・グループをターゲットにする必要があります。

    ibmcloud target -g <RESOURCE_GROUP>
    

詳しくは、リソースおよびリソース・グループの処理 (ibmcloud resource) を参照してください。

  1. データベースは、CLI からibmcloud resource service-instance-createコマンドを使用して作成できます。 このコマンドでは、サービス・インスタンス名、サービス名、プラン名、ロケーションが使用されます。

  2. サービス名は、 databases-for-mongodb``databases-for-elasticsearch 以下の Cloud Databases いずれかのサービスです databases-for-mysqldatabases-for-postgresql``databases-for-redis``messages-for-rabbitmq

    ibmcloud resource service-instance-create <INSTANCE_NAME> <SERVICE_NAME> standard <REGION>
    

データベースインスタンス名を覚えておいてください。 Find your region identifier here.

前の例では、Shared Computeインスタンスを規定した。 詳しくは、ホスティングモデルの概要 をご覧ください。

Kubernetes アプリの構成

  1. Kubernetes Service の作成。 クラスターをセットアップしたい場所とリソース・グループを選択します。 使用するクラスター・タイプを選択します。 この例では、1 つのワーカー・ノードに付属するライト・プランのみが必要です。 クラスターがプロビジョンされると、アクセス・タブの下に、クラスターにアクセスして環境変数を設定するためのステップのリストが表示されます。 デプロイメントが正常にプロビジョンされて実行されていることを確認することもできます。

  2. IBM Cloud の正しい Kubernetes Service リソース・グループをターゲットにしていることを確認します。

    リソース・グループの名前がdefault以外の場合は、以下のコマンドを使用してクラスター・リソース・グループをターゲットにします。

    ibmcloud target -g <RESOURCE_GROUP_NAME>
    

    この例では、defaultリソース・グループを使用します。

  3. Container Registry 内で独自のプライベート・イメージ・リポジトリーを作成して、アプリケーションの Docker イメージを保管します。 イメージをプライベートにしようとしているので、名前空間を作成する必要があります。こうすると、イメージ・リポジトリーへの固有の URL が作成されます。

    ibmcloud cr namespace-add <YOUR_NAMESPACE>
    
  4. クラスターに Cloud Databases デプロイメントを追加します。

    ibmcloud ks cluster service bind --cluster <YOUR_CLUSTER_NAME> --namespace default    --service <INSTANCE_NAME_OR_CRN>
    

    「default」名前空間は、ユーザー作成のイメージ・ストア名前空間ではなく、Kubernetes インスタンスを参照します。 同様に、データベースでパブリック・エンドポイントとプライベート・エンドポイントの両方が使用されている場合は、デフォルトではパブリック・エンドポイントが使用されます。 したがって、プライベート・エンドポイントを選択する場合は、最初にデータベースのサービス・キーを作成して、データベースへのバインド時に Kubernetes でこのサービス・キーを使用できるようにする必要があります。 サービス・キーをセットアップするには、以下のコマンドを使用します。

    ibmcloud resource service-key-create <YOUR-PRIVATE-KEY> --instance-name    <INSTANCE_NAME_OR_CRN> --service-endpoint private  
    

    --service-endpoint private を使用してプライベート・サービス・エンドポイントが選択されます。 その後、次のコマンドを使用して、プライベート・エンドポイントを介してデータベースを Kubernetes クラスターにバインドします。

    ibmcloud ks cluster service bind <YOUR_CLUSTER_NAME> default    <INSTANCE_NAME_OR_CRN> --key <YOUR-PRIVATE-KEY>
    
  5. クラスターの名前空間内に Kubernetes シークレットが作成されたことを確認します。 Kubernetes は、シークレットを使用して、IBM Cloud Identity and Access Management (IAM) API キーや URL などの、コンテナーがアクセス権限の取得に使用する機密情報を格納します。 クラスターをこのセッションのコンテキストとして設定し、デプロイメントのインスタンスにアクセスするための API キーを取得するには、以下のコマンドを実行します。

    ibmcloud ks cluster config --cluster <CLUSTER_NAME_OR_ID>
    

    結果

    kubectl get secrets --namespace=default
    

    your_database_name を Kubernetes サービスにバインドした際に生成されたシークレットの名前を保存してください。

  6. まだ行っていない場合は、以下のコマンドを使用して、使用可能な言語の 1 つのアプリをコンソールからローカル環境に複製します

    git clone -b <LANGUAGE> git@github.com:IBM-Cloud/clouddatabases-helloworld-kubernetes-examples.git
    
  7. この新しく作成したディレクトリーに cd で移動し、データベース・フォルダーに cd で移動します。 サービスに接続し、データベースから読み取り、データベースを更新するコードが、server.js 内にあります。 アプリの機能については、コードの構造とコードのコメントを参照してください。 publicディレクトリーには、Web アプリケーションの HTML、スタイルシート、および JavaScript が含まれています。 ただし、アプリケーションを機能させるには、まずこのアプリケーションの Docker イメージを Container Registry にプッシュする必要があります。

  8. アプリケーションの Docker イメージをビルドし、Container Registry にプッシュします。 該当するリージョンを指定し、コンテナーに名前を付けます。

    ibmcloud cr build -t <REGION>.icr.io/<NAMESPACE>/<CONTAINER_NAME> .
    

    以下を使用して、コンテナー・レジストリー内のイメージを表示できます。

    ibmcloud cr images
    

    次のような応答を受け取ります

    REPOSITORY                                TAG      DIGEST        NAMESPACE   CREATED       SIZE    SECURITY STATUS
    <region>.icr.io/mynamespace/container_name latest   81c3959ea657  mynamespace 4 hours ago   28 MB   No Issues
    
  9. Kubernetes のデプロイメント構成ファイル clouddb-deployment.yaml を更新します。

    image 名を、前のステップで取得したリポジトリー名に変更します。

    image: "<REGION>.icr.io/mynamespace/<container_name>" # Edit me
    

    ここで、secretKeyRefの下で、<db-secret-name>の名前を、データベース・デプロイメントを Kubernetes クラスターにバインドしたときに作成したシークレットの名前と一致するように変更します。

    secretKeyRef:
       name: <DB-SECRET-NAME> # Edit me
    

    ファイルの末尾にあるservice構成については、nodePortは、アプリケーションにアクセスできるポートを示します。 30000 から 32767 の範囲内のポートがありますが、ここでは 30081 を選択しました。 TCP ポートは 8080 に設定されます。これは、Node.js アプリケーションがコンテナー内で実行されるポートです。

Kubernetes アプリのデプロイ

  1. アプリケーションを Kubernetes Service にデプロイします。 アプリケーションをデプロイすると、自動的に Kubernetes クラスターにバインドされます。

    kubectl apply -f clouddb-deployment.yaml
    
  2. アプリケーションの IP を取得します。

    ibmcloud ks workers -c <CLUSTER_NAME>
    

    結果は以下のようになります。

    ID                                                 Public IP        PrivateIP      Machine Type   State    Status   Zone    Version
    kube-hou02-pa1a59e9fd92f44af9b4147a27a31db5c4-w1   199.199.99.999   10.76202.188   free           normal   Ready    hou02   1.10.11_1536
    

    この時点で、ポート 30082 から、アプリケーションにパブリック IP からアクセスできます。

    clouddatabases-helloworld アプリは、_例_データベースの内容を表示します。 アプリがサービスに接続されていることを示すには、いくつかの語をデータベースに追加します。 これらの語は追加されるつど表示され、最近追加された語が最初に表示されます。

コードの構成

コードの構成
ファイル 説明
server.js BINDING (資格情報を表示するために Kubernetes デプロイメント・ファイルで作成した名前) からの資格情報を使用してデータベースへの接続を確立し、データベースに対する作成操作と読み取り操作を処理します。
main.js PUT コマンドのユーザー入力を処理し、GET コマンドの結果を解析して、データベースの内容を出力します。

アプリでは、PUT 操作と GET 操作を以下のように使用します。

  • PUT

    • main.js からユーザー入力を取得します。
    • ユーザー入力をデータベースに追加します。
  • GET

    • データベースの内容を取得します。
    • データベース・コマンドの応答を main.js に返します。