Kubernetes: Node Expressアプリケーションのデプロイ

このチュートリアルでは、Oracle Cloud Infrastructureアカウントを使用してKubernetesクラスタを設定します。次に、Node Expressアプリケーションをクラスタにデプロイします。

主なタスクは:

  • OCIでKubernetesクラスタを設定します。
  • クラスタにアクセスするためのOCI CLIを設定します。
  • Node ExpressアプリケーションおよびDockerイメージを構築します。
  • イメージをOCIRにプッシュします。
  • Node.js Dockerアプリケーションをクラスタにデプロイします。
  • インターネットからアプリケーションに接続します。
Oracle Cloud Infrastructure Kubernetes Engine上でNodeJS Expressアプリケーションを実行するために必要なコンポーネントのダイアグラム

その他の情報については、次のWebサイトを参照してください。

開始する前に

このチュートリアルを正常に実行するには、次が必要です:

要件
  • コンテナ・レジストリ、Kubernetesおよびロード・バランサの場合:
  • アプリケーションおよびDockerイメージを構築する場合:
    • 次のいずれかのローカル環境:
    • ローカル環境での次のアプリケーション:
      • JDK 11、および.bashrcでのJAVA_HOMEの設定。
      • Python 3.6.8以上、およびPython 3用pipインストーラ
      • Kubernetesクライアント1.11.9以上
      • Apache Maven 3.0以上
      • Docker 19.0.3以上
      • Git 1.8以上
      • Node.js 10以上
OCI Free TierでのLinux用のアプリケーションの入手

OCI Free Tier Linuxコンピュート・インスタンスを使用してデプロイメントを管理する場合、次の各項では、必要なソフトウェアをインストールするための情報を提供します。

Linuxインスタンスのインストール
  • Always Freeコンピュート・シェイプのLinux VMをOracle Cloud InfrastructureにインストールしますLinuxインスタンスに接続するには、sshがサポートされているマシンが必要です。
    • Oracle Linux VMのインストール
      • 2項および3項に従います。
      • 有料アカウントを持っている場合は、2項で、オファリングに基づいてコンピュート・オプションを選択します。
      • インスタンスに接続するには、4項のステップ1-5に従います。
      • Apacheの手順はスキップします。
    • Ubuntu VMのインストール
Node.jsのインストール

システムにNode.jsをインストールします。

インストール・コマンドの実行

Node.jsおよびNPMをインストールするには、次のコマンドを実行します:

  1. Oracle Linux:
    sudo yum update

    Node.jsのYumリポジトリを設定します。次に、nodejsパッケージをインストールします。

    sudo yum install -y oracle-nodejs-release-el7
    sudo yum install -y nodejs
  2. Ubuntu:
    sudo apt update

    nodejsおよびnpmパッケージをインストールします。

    sudo apt install -y nodejs
    sudo apt install -y npm
  3. インストールを確認します。
    node -v
    npm -v
ファイアウォールの構成(オプション)

Nodeアプリケーションのブラウザベースのテストを行う場合は、Linuxインスタンスでポート3000を使用可能にします。

  • Oracle Linux
    sudo firewall-cmd --add-service=http --permanent
    sudo firewall-cmd --add-service=https --permanent
    sudo firewall-cmd --reload
  • Ubuntu Linux
    sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 3000 -j ACCEPT
    sudo netfilter-persistent save
VCNのイングレス・ルールの作成(オプション)

次のステップに従って、VCNのパブリック・サブネットを選択し、イングレス・ルールを追加します。

  1. ナビゲーション・メニューを開き、「ネットワーキング」「Virtual Cloudネットワーク」の順にクリックします。
  2. コンピュート・インスタンスを使用して作成したVCNを選択します。
  3. 新しいVCNが表示され、<your-subnet-name>サブネット・リンクをクリックします。

    パブリック・サブネット情報は、ページの下部にあるセキュリティ・リストとともに表示されます。VCNのデフォルト・セキュリティ・リストへのリンクが表示されます。

  4. 「デフォルト・セキュリティ・リスト」リンクをクリックします。

    VCNのデフォルトのイングレス・ルールが表示されます。

  5. 「イングレス・ルールの追加」をクリックします。

    「Add Ingress Rules」ダイアログが表示されます。

  6. イングレス・ルールに次の情報を入力します。

    イングレス・ルールを次のように入力します:

    • ステートレス:選択
    • ソース・タイプ: CIDR
    • ソースCIDR: 0.0.0.0/0
    • IPプロトコル: TCP
    • ソース・ポート範囲: (空白のまま)
    • 宛先ポート範囲: 3000
    • 説明: HTTP接続の許可
  7. 「イングレス・ルールの追加」をクリックします。

    これで、HTTP接続が許可されます。VCNはNode Express用に構成されています。

インスタンスをインターネットから使用できるようにするイングレス・ルールが正常に作成されました。

Python 3およびPip 3のインストール
  1. 現在のインストールを確認します。
    python3 --version
  2. Python 3の場合は、次のコマンドを実行します:
    • Oracle Linux:
      sudo yum update
      sudo yum install -y python3
    • Ubuntu:
      sudo apt update
      sudo apt install -y python3
  3. Python3用のpipのインストールを確認します。
    pip3 -V

    Python3用のpipがインストールされている場合の出力例:

    pip <version> from xxx/lib/python3.x/site-packages/pip (python 3.x)
  4. Python 3用のpipをインストールするには、次のコマンドを実行します:
    • Oracle Linux:
      sudo yum update
      sudo yum install -y python3-pip
    • Ubuntu:
      sudo apt update
      sudo apt install -y python3-pip
  5. Python 3用のpipのインストールを確認します。
    pip3 -V
Kubernetesクライアントのインストール
  1. 現在のインストールを確認します:
    kubectl version --client
    Kubernetesを使用している場合、バージョンは<major-version>.<minor-version>となります。たとえば、バージョン1.20の場合、次のようになります:
    version.Info{Major:"1", Minor:"20"...
  2. kubectlクライアントをインストールするには、次のリンクを参照してください:
  3. インストールを確認します。
    kubectl version --client
Dockerのインストール
  1. 現在のインストールを確認します:
    docker -v
  2. Oracle Linux

    Oracle LinuxにDockerをインストールするには、次のコマンドを実行します。

    sudo yum install docker-engine
    sudo systemctl start docker
    sudo systemctl enable docker

    ノート:最後のコマンドでは、再起動時にDockerを開始できます。

  3. Ubuntu Linux

    Ubuntu LinuxにDockerをインストールするには、次のリンクを参照してください: Dockerの取得

  4. インストールを確認します。
    docker -v

1. 準備

アプリケーションを作成およびデプロイするための環境を準備します。

サービス制限の確認
  1. Oracle Cloud Infrastructure Consoleにログインします。
  2. ナビゲーション・メニューを開き、「ガバナンスと管理」をクリックします。「Governance」で、「Limits、 Quotas and Usage」をクリックします。
  3. リージョンのサービス制限を検索します:
    • 次のオプションでフィルタします:
      • サービス:リージョン
      • スコープ:テナント
      • リソース:サブスクライブ済リージョン数
      • コンパートメント: <tenancy-name> (ルート)
    • サービス制限を検索します:
      • 制限名: subscribed-region-count
      • サービス制限: 最小2
  4. Find your available Compute core count for the VM.Standard.E3.Flex shape:
    • 次のオプションでフィルタします:
      • サービス:コンピュート
      • スコープ: <first-availability-domain>。例: EMlr:US-ASHBURN-AD-1
      • リソース: Standard.E3のコア。FlexおよびBM.Standard.E3.128インスタンス
      • コンパートメント: <tenancy-name> (ルート)
    • 使用可能なコア数を確認します:
      • 制限名: standard-e3-core-ad-count
      • 使用可能: 最小1
    • スコープを繰り返します: <second-availability-domain>および<third-availability-domain>。各リージョンには、このシェイプで使用可能なコアが少なくとも1つ必要です。
  5. 使用可能な50 GBブロック・ボリュームがあるかどうかを確認します:
    • 次のオプションでフィルタします:
      • サービス:ブロック・ボリューム
      • スコープ: <first-availability-domain>。例: EMlr:US-ASHBURN-AD-1
      • リソースボリューム・サイズ(GB)
      • コンパートメント: <tenancy-name> (ルート)
    • 使用可能なブロック・ボリューム・ストレージを確認します:
      • 制限名: total-storage-gb
      • 使用可能: 最小50
    • スコープを繰り返します: <second-availability-domain>および<third-availability-domain>。各リージョンでは、少なくとも50GBのブロック・ボリュームが使用可能である必要があります。
  6. 使用可能なフレキシブル・ロード・バランサの数を確認します:
    • 次のオプションでフィルタします:
      • サービス: LbaaS
      • スコープ: <your-region>。例: us-ashburn-1
      • リソース: <blank>
      • コンパートメント: <tenancy-name> (ルート)
    • 使用可能なフレキシブル・ロード・バランサの数を確認します:
      • 制限名: lb-flexible-count
      • 使用可能: 最小1
ノート

このチュートリアルでは、3つのコンピュート・インスタンスをVM.Standard.E3で作成します。クラスタ・ノードのフレックス・シェイプ。別のシェイプを使用するには、そのコア数でフィルタします。たとえば、VM.Standard2.4の場合、Standard2ベースのVMおよびBMインスタンス用コアでフィルタし、数を取得します

すべてのシェイプのリストは、VM標準シェイプを参照してください。

ノート

このチュートリアルでは、「クイック作成」ワークフローを使用して、柔軟なロード・バランサをホストするパブリック・リージョン・サブネットを持つクラスタを作成します。別のロード・バランサを使用するには、カスタム・ワークフローを使用して、使用する既存のネットワーク・リソースを明示的に指定できます(ロード・バランサを作成する既存のサブネットを含む)。

ロード・バランサに別の帯域幅を使用するには、その(100Mbps帯域幅400Mbps帯域幅など)でフィルタします。

認可トークンの作成
  1. ナビゲーション・メニューで、「プロファイル」メニュー「プロファイル」メニュー・アイコンを選択し、表示されるオプションに応じて、「ユーザー設定」または「自分のプロファイル」を選択します
  2. 「認証トークン」をクリックします。
  3. 「トークンの生成」をクリックします。
  4. 説明を入力します。
  5. 「トークンの生成」をクリックします。
  6. トークンをコピーして保存します。
  7. 閉じる」をクリックします。
ノート

トークンは、作成後すぐに保存してください。後でアクセスすることはできません。
必要な情報の収集
  1. Oracle Cloud Infrastructure Consoleから次の資格証明情報を収集します。
    • テナント名: <tenancy-name>
      • ナビゲーション・メニューで、「プロファイル」メニュー「プロファイル」メニュー・アイコンを選択し、「テナンシ: <your_tenancy_name>を選択します。
    • テナント・ネームスペース: <tenancy-namespace>
      • ナビゲーション・メニューで、「プロファイル」メニュー「プロファイル」メニュー・アイコンを選択し、「テナンシ: <your_tenancy_name>を選択します。
      • 「オブジェクト・ストレージ・ネームスペース」の値をコピーします。
      ノート

      一部のアカウントでは、テナンシ名とネームスペースが異なります。このチュートリアルでは必ずネームスペースを使用してください。
    • テナントOCID: <tenancy-ocid>
      • ナビゲーション・メニューで、「プロファイル」メニュー「プロファイル」メニュー・アイコンを選択し、「テナンシ: <your_tenancy_name>を選択します。
      • OCIDのコピー。
    • ユーザー名: <user-name>
      • ナビゲーション・メニューで、「プロファイル」メニュー「プロファイル」メニュー・アイコンを選択し、表示されるオプションに応じて「ユーザー設定」または「自分のプロファイル」を選択します
    • ユーザーOCID: <user-ocid>
      • ナビゲーション・メニューで、「プロファイル」メニュー「プロファイル」メニュー・アイコンを選択し、表示されるオプションに応じて「ユーザー設定」または「自分のプロファイル」を選択します
      • OCIDのコピー。
  2. リージョン情報を検索します。
    • リージョン: <region-identifier>
      • コンソールの上部のナビゲーション・バーで、リージョンを検索します。例: 米国東部(アッシュバーン)
      • リージョンおよび可用性ドメインの表からリージョン識別子を見つけます。
      • 例: us-ashburn-1
    • リージョン・キー: <region-key>
  3. 「認証トークンの作成」セクションから認証トークンをコピーします。
    • 認証トークン: <auth-token>
OCIコマンドライン・インタフェースの設定
Python仮想環境およびラッパーのインストール

Pythonのvirtualenvは、プロジェクトのすべての実行可能ファイルとライブラリを含むフォルダを作成します。

virtualenvwrapperは、virtualenvの拡張機能です。仮想環境での作業をより快適にするための一連のコマンドが用意されています。また、すべての仮想環境を1つの場所に配置します。virtualenvwrapperは、環境名のタブ補完を提供します。

  1. virtualenvをインストールします。
    pip3 install --user virtualenv
  2. virtualenvwrapperをインストールします。
    pip3 install --user virtualenvwrapper
  3. virtualenvwrapper.shスクリプトの場所を見つけます。
    grep -R virtualenvwrapper.sh
    パスの例:
    • Linuxの例: /home/ubuntu/.local/bin/virtualenvwrapper.sh
    • MacOSの例: /usr/local/bin/virtualenvwrapper.sh
  4. .bashrcで仮想環境ラッパーを構成します。
    sudo vi .bashrc

    次のテキストを追加します。

    # set up Python env
    export WORKON_HOME=~/envs
    export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
    export VIRTUALENVWRAPPER_VIRTUALENV_ARGS=' -p /usr/bin/python3 '
    source <path-to-virtualenvwrapper.sh>

    <path-to-virtualenvwrapper.sh>をその値に置き換えます。

    環境内のPython3バイナリの場所に基づいて、/usr/bin/python3を正しい場所に更新します。

    ファイルを保存します。

  5. 現在のウィンドウでコマンドをアクティブ化します。
    source ~/.bashrc
    出力例:
    virtualenvwrapper.user_scripts creating /home/ubuntu/envs/premkproject
    virtualenvwrapper.user_scripts creating /home/ubuntu/envs/postmkproject
    virtualenvwrapper.user_scripts creating /home/ubuntu/envs/initialize
    virtualenvwrapper.user_scripts creating /home/ubuntu/envs/premkvirtualenv
    virtualenvwrapper.user_scripts creating /home/ubuntu/envs/postmkvirtualenv
    virtualenvwrapper.user_scripts creating /home/ubuntu/envs/prermvirtualenv
    virtualenvwrapper.user_scripts creating /home/ubuntu/envs/postrmvirtualenv
    virtualenvwrapper.user_scripts creating /home/ubuntu/envs/predeactivate
    virtualenvwrapper.user_scripts creating /home/ubuntu/envs/postdeactivate
    virtualenvwrapper.user_scripts creating /home/ubuntu/envs/preactivate
    virtualenvwrapper.user_scripts creating /home/ubuntu/envs/postactivate
    
OCI CLIのインストール
  1. 仮想環境を起動します。
    workon cli-app
  2. 仮想環境の名前cli-appがコマンド・プロンプトの左側に表示されていることを確認します。

    例: (cli-app) ubuntu@<ubuntu-instance-name>:~$

  3. OCI CLIをインストールします。
    pip3 install oci-cli
  4. インストールをテストします:
    oci --version

    すべてが正しく設定されている場合は、バージョンが表示されます。

    oci --help
OCI CLIの構成
  1. 仮想環境で次のコマンドを入力します:
    oci setup config
  2. 必要な情報の収集の項の回答を入力します:
    • 構成[$HOME/.oci/config]の場所: <take-default>
    • ユーザーOCID: <user-ocid>
    • テナントOCID: <tenancy-ocid>
    • リージョン(us-ashburn-1など): <region-identifier>
  3. 次の情報を入力して、OpenSSL API暗号化キーを設定します:
    • 新しいAPI署名RSAキー・ペアを生成しますか[Y/n]: Y
    • キー[$HOME/.oci]のディレクトリ: <take-default>
    • キー[oci_api_key]の名前 <take-default>
  4. 仮想環境を非アクティブ化します:
    deactivate

    環境の(cli-app)接頭辞は表示されなくなりました。

ノート

秘密キーはoci_api_key.pemで、公開キーはoci_api_key_public.pemです。
ユーザー・アカウントへの公開キーの追加
  1. cli-app環境をアクティブ化します:
    workon cli-app
  2. 公開キーを表示します。
    cat $HOME/.oci/oci_api_key_public.pem
  3. 公開キーをコピーします。
  4. ユーザー・アカウントに公開キーを追加します:
    • 「コンソール」に移動します。
    • ナビゲーション・メニューで、「プロファイル」メニュー「プロファイル」メニュー・アイコンを選択し、表示されるオプションに応じて「ユーザー設定」または「自分のプロファイル」を選択します
    • 「APIキー」をクリックします。
    • 「APIキーの追加」をクリックします。
    • 「公開キーの貼付け」をクリックします。
    • BEGIN PUBLIC KEYおよびEND PUBLIC KEYの行を含む、前のステップの値を貼り付けます
    • 追加」をクリックします。
ノート

  • OCI CLIを使用する場合は常に、workon cli-appを使用してアクティブ化します
  • プロジェクト名を変更すると、workonによって現在の作業環境が非アクティブ化されます。このようにして、環境をすばやく切り替えることができます。

2. クラスタの設定

Kubernetesクラスタの管理オプションをインストールおよび構成します。後で、アプリケーションをこのクラスタにデプロイします。

コンパートメント・ポリシーの追加

ユーザー名が管理者グループ内にある場合は、この項をスキップしてください。それ以外の場合は、管理者に依頼してテナンシに次のポリシーを追加します:

allow group <the-group-your-username-belongs> to manage compartments in tenancy

この権限を持つユーザーは、チュートリアルのすべてのリソースのコンパートメントを作成できます。

ポリシーを追加するステップ
  1. ナビゲーション・メニューで、「プロファイル」メニュー「プロファイル」メニュー・アイコンを選択し、表示されるオプションに応じて「ユーザー設定」または「自分のプロファイル」を選択します
  2. 左ペインで、「グループ」をクリックします。
  3. メモ帳で、ユーザー名が属するグループ名をコピーします。
  4. ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします。「アイデンティティ」で、「ポリシー」をクリックします。
  5. 「コンパートメント」ドロップダウンからコンパートメントを選択します。
  6. ポリシーの作成をクリックします。
  7. 次の情報を入力します:
    • 名前: manage-compartments
    • 説明: Allow the group <the-group-your-username-belongs> to list, create, update, delete and recover compartments in the tenancy.
    • コンパートメント: <your-tenancy>(root)
  8. 「Policy Builder」で、「Show manual editor」をクリックします。
  9. 次のポリシーを貼り付けます:
    allow group <the-group-your-username-belongs> to manage compartments in tenancy
  10. 作成」をクリックします。

参照: IAMのVerbとResource-Typeの組合せcompartmentsリソース・タイプ

コンパートメントの作成

このチュートリアルで作成するリソースのコンパートメントを作成します。

  1. Oracle Cloud Infrastructure Consoleにサインインします。
  2. ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします。「アイデンティティ」で、「コンパートメント」をクリックします。
  3. 「コンパートメントの作成」をクリックします。
  4. 次の情報を入力します:
    • 名前: <your-compartment-name>
    • 説明: Compartment for <your-description>.
    • 親コンパートメント: <your-tenancy>(root)
  5. 「コンパートメントの作成」をクリックします。

参照: コンパートメントの作成

リソース・ポリシーの追加

ユーザー名が管理者グループ内にある場合は、この項をスキップしてください。それ以外の場合は、管理者に依頼してテナンシに次のポリシーを追加します:

allow group <the-group-your-username-belongs> to manage all-resources in compartment <your-compartment-name>

この権限を使用すると、コンパートメント内のすべてのリソースを管理できるため、基本的にそのコンパートメントでの管理権限が付与されます。

ポリシーを追加するステップ
  1. ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします。「アイデンティティ」で、「ポリシー」をクリックします。
  2. 「コンパートメント」ドロップダウンからコンパートメントを選択します。
  3. ポリシーの作成をクリックします。
  4. 次の情報を入力します:
    • 名前: manage-<your-compartment-name>-resources
    • 説明: Allow users to list, create, update, and delete resources in <your-compartment-name>.
    • コンパートメント: <your-tenancy>(root)
  5. 「ポリシー・ビルダー」で、次の選択肢を選択します:
    • ポリシーのユースケース: Compartment Management
    • 共通ポリシー・テンプレート: Let compartment admins manage the compartment
    • グループ: <the-group-your-username-belongs>
    • 場所: <your-tenancy>(root)
  6. 作成」をクリックします。

参照: 共通ポリシー

クイック作成を使用したクラスタの作成

「クイック作成」ワークフローを使用して、デフォルト設定および新しいネットワーク・リソースでクラスタを作成します。

  1. Oracle Cloud Infrastructure Consoleにサインインします。
  2. ナビゲーション・メニューを開き、「開発者サービス」をクリックします。「コンテナとアーティファクト」で、「Kubernetesクラスタ(OKE)」をクリックします。
  3. 「クラスタの作成」をクリックします。
  4. 「クイック作成」を選択します。
  5. 「ワークフローの起動」をクリックします。

    「クイック作成クラスタ」ダイアログが表示されます。

  6. 次の情報を入力します
    • 名前: <your-cluster-name>
    • コンパートメント: <your-compartment-name>
    • Kubernetesバージョン: <take-default>
    • Kubernetes APIエンドポイント:パブリック・エンドポイント

      Kubernetesクラスタは、パブリックIPアドレスが自動的に割り当てられたパブリック・サブネットでホストされます。

    • Kubernetesワーカー・ノード:プライベート・ワーカー

      Kubernetesワーカー・ノードは、プライベート・サブネットでホストされます。

    • シェイプ: VM.Standard.E3.Flex
    • OCPU数の選択: 1
    • メモリー量(GB): 16
    • ノード数: 3
  7. 「拡張オプションの表示」をクリックします。

    デフォルトのままにします。

    • カスタム・ブート・ボリューム・サイズを指定します:チェック・ボックスのクリア。
    • イメージ検証:チェックボックスをクリアします。
    • SSHキーの追加: SSHキーなし
  8. 次へ」をクリックします。

    すべての選択内容が表示されます。これらを調べて、すべてが正しく構成されていることを確認します。

  9. 「クラスタの作成」をクリックします。

    クラスタに設定されているサービスが表示されます。

  10. 閉じる」をクリックします。
  11. 少々お待ちください。クラスタの作成には数分かかります。
Kubernetesクラスタが正常に作成されました。
クラスタへのローカル・アクセスの設定

Kubernetesクラスタを作成したら、クラスタにアクセスするようにローカル・システムを設定します。

  1. Oracle Cloud Infrastructure Consoleにサインインします。
  2. ナビゲーション・メニューを開き、「開発者サービス」をクリックします。「コンテナとアーティファクト」で、「Kubernetesクラスタ(OKE)」をクリックします。
  3. <your-cluster>へのリンクをクリックします。

    クラスタに関する情報が表示されます。

  4. 「クラスタへのアクセス」をクリックします。
  5. 「ローカル・アクセス」をクリックします。
  6. ダイアログに示されるステップに従います。参照用にここに再印刷されます。
    ノート

    仮想環境にいない場合は、kubectlコマンドを実行する前にworkon cli-appと入力します。

    oci CLIバージョンを確認します。

    oci -v

    .kubeディレクトリが存在しない場合は作成します。

    mkdir -p $HOME/.kube

    設定用のkubeconfigファイルを作成します。「自分のクラスタへのアクセス」ダイアログの情報を使用します。

    oci ce cluster create-kubeconfig <use data from dialog>

    KUBECONFIG環境変数をエクスポートします。

    export KUBECONFIG=$HOME/.kube/config
    ノート

    環境変数を新しいシェルで開始する場合は、export KUBECONFIG=$HOME/.kube/config~/.bashrcファイルに追加します。
  7. 次のコマンドを使用してクラスタ構成をテストします。

    クラスタをリストします:

    kubectl get service

    デプロイメントの詳細を取得します:

    kubectl describe deployment

    ポッドを取得します:

    kubectl get pods
    ノート

    アプリケーションがデプロイされていないため、最後の2つのコマンドでは、「デフォルトのネームスペースにリソースが見つかりません。」が生成されます。
    ノート

    別のクラスタを参照するには、コマンドラインで別の構成ファイルを指定します。例:
    kubectl --kubeconfig=</path/to/config/file>

クラスタ・アクセスが設定されると、アプリケーションをデプロイする準備が整います。

3. ローカル・アプリケーションの構築

ローカル・アプリケーションと、そのアプリケーションのDockerイメージを構築します。

ローカル・アプリケーションの作成

Node.jsアプリケーションを作成します。

  1. OCI CLIセッションを開始します。
  2. アプリケーションのディレクトリを作成します。
    mkdir node-hello-app
    cd node-hello-app
  3. package.jsonファイルを作成します

    ファイルを作成します:

    vi package.json

    ファイルに次のテキストを入力し、オプションのauthorおよびrepositoryフィールドを更新して、ファイルを保存します:

    {
        "name": "node-hello-app",
        "version": "1.0.0",
        "description": "Node Express Hello application",
        "author": "Example User <username@example.com>",
        "main": "app.js",
        "scripts": {
            "start": "node app.js"
        },
        "repository": {
            "type": "git",
            "url": "git://github.com/username/repository.git"
        },
        "dependencies": {
            "express": "^4.0.0"
        },
        "license": "UPL-1.0"
    }                    
  4. NPMパッケージをインストールします。
    npm install
  5. 「Hello, World!」アプリケーションを作成します。

    ファイルを作成します:

    vi app.js

    ファイルに次のテキストを入力し、ファイルを保存します:

    const express = require('express')
    const app = express()
    port = 3000
    
    app.get('/', function (req, res) {
        res.send('<h1>Hello World from Node.js!</h1>')
    })
    
    app.listen(port, function() {
        console.log('Hello World app listening on port ' + port);
    })
                        

Node.jsアプリケーションが正常に設定されました。

ローカル・アプリケーションの実行

Node.jsアプリケーションを実行します。

  1. Node.jsアプリケーションを実行します。
    node app.js
    Node Expressサーバーが起動し、次が表示されます:
    Hello World app listening on port 3000
  2. curlまたはブラウザを使用してアプリケーションをテストします。
    • curlでテストするには、次のように入力します:
      curl -X GET http://localhost:3000
    • ブラウザでテストするには、ブラウザ・ウィンドウをhttp://<your-ip-address>:3000 (オプション)に接続します。
    アプリは次を返します
    <h1>Hello World from Node.js!</h1>
  3. 実行中のアプリケーションを停止します。

    Ctrl+Cを押して、起動したターミナル・ウィンドウでアプリケーションを停止します。

Node.jsおよびExpressを使用してHello Worldアプリケーションが正常に作成されました。

参照:

  • この例の詳細については、Expressの開始を参照してください。
Dockerイメージの構築

次に、Node.js ExpressアプリケーションのDockerイメージを作成します。

  1. node-hello-appディレクトリにいることを確認します。
  2. Dockerイメージを構築します
    docker build -t node-hello-app .

    成功メッセージが表示されます。

    [INFO] BUILD SUCCESS
    Successfully tagged node-hello-app:latest
  3. Dockerイメージを実行します:
    docker run --rm -p 3000:3000 node-hello-app:latest
  4. アプリケーションをテストします。
    curl -X GET http://localhost:3000
    アプリは次を返します
    <h1>Hello World from Node.js!</h1>
  5. 実行中のアプリケーションを停止します。
完了しました。Node.js Expressイメージが正常に作成されました。

4. Dockerイメージのデプロイ

Node.js ExpressイメージをOCIコンテナ・レジストリにプッシュします。その後、イメージを使用してアプリケーションをデプロイします。

Dockerリポジトリの作成
  1. ナビゲーション・メニューを開き、「開発者サービス」をクリックします。「Containers & Artifacts」で、「Container Registry」をクリックします。
  2. 左側のナビゲーションで、<your-compartment-name>を選択します。
  3. 「リポジトリの作成」をクリックします。
  4. 任意のリポジトリ名でプライベート・リポジトリを作成します:
    <repo-name> = <image-path-name>/<image-name>

    例: node-apps/node-hello-app

    これで、ローカル・イメージをコンテナ・レジストリにプッシュする準備ができました。
    ノート

    Dockerイメージをレジストリ・リポジトリにプッシュする前に、リポジトリがコンパートメントに存在する必要があります。リポジトリが存在しない場合、Dockerのpushコマンドは正しく機能しません。
    ノート

    リポジトリ名のスラッシュは、階層ディレクトリ構造を表していません。オプションの<image-path-name>は、リポジトリの編成に役立ちます。
ローカル・イメージのプッシュ

ローカルDockerイメージを作成したら、イメージをコンテナ・レジストリにプッシュします。

次のステップに従います。

  1. OCI CLIセッションを開きます。
  2. OCIコンテナ・レジストリにログインします:
    docker login <region-key>.ocir.io

    ログイン名とパスワードの入力を求められます。

    • ユーザー名: <tenancy-namespace>/<user-name>
    • パスワード: <auth-token>
  3. ローカルDockerイメージをリストします:
    docker images

    システム上のDockerイメージが表示されます。最後の項で作成したイメージnode-hello-appを特定します

  4. ローカル・イメージにレジストリのURLリポジトリ名タグ付けして、そのリポジトリにプッシュできるようにします。
    docker tag <your-local-image> <repo-url>/<repo-name>
    • <repo-url>を次のように置き換えます:
      <region-key>.ocir.io/<tenancy-namespace>/
    • <repo-name>を次のように置き換えます:

      Dockerリポジトリの作成の項の<image-folder-name>/<image-name>

    • 両方を組み合せた後の例を次に示します:
      docker tag node-hello-app iad.ocir.io/my-namespace/node-apps/node-hello-app

      この例では、コンポーネントは:

      • リポジトリURL: iad.ocir.io/my-namespace/
      • リポジトリ名: node-apps/node-hello-app
    ノート

    OCIコンテナ・レジストリでは、ルート・コンパートメント(テナンシ)のみでなく、任意のコンパートメントでのレジストリ・リポジトリの作成がサポートされるようになりました。作成したリポジトリにイメージをプッシュするには、レジストリURLを正確なリポジトリ名と組み合せます。OCIコンテナ・レジストリは、一意のリポジトリ名を照合し、イメージをプッシュします。
  5. Dockerイメージをチェックして、イメージがコピーされているかどうかを確認します。
    docker images
    • タグ付きイメージはローカルイメージと同じイメージIDを持ちます。
    • タグ付けされたイメージ名は:
      <region-key>.ocir.io/<tenancy-namespace>/<image-path-name>/<image-name>
  6. イメージをコンテナ・レジストリにプッシュします。
    docker push <copied-image-name>:latest
    例:
    docker push iad.ocir.io/my-namespace/node-apps/node-hello-app:latest
  7. ナビゲーション・メニューを開き、「開発者サービス」をクリックします。「Containers & Artifacts」で、「Container Registry」をクリックします。

pushコマンドが完了したら、コンテナ・レジストリでイメージを探します。

イメージのデプロイ
コンテナ・レジストリのイメージを使用して、イメージおよびアプリケーションをデプロイできるようになりました。
  1. アプリケーションのレジストリ・シークレットを作成します。このシークレットは、クラスタにデプロイするときにイメージを認証します。

    シークレットを作成するには、このテンプレートの情報を入力します。

    kubectl create secret docker-registry ocirsecret --docker-server=<region-key>.ocir.io  --docker-username='<tenancy-namespace>/<user-name>' --docker-password='<auth-token>'  --docker-email='<email-address>'

    コマンドを実行すると、secret/ocirsecret createdのようなメッセージが表示されます。

  2. シークレットが作成されたことを確認します。次のコマンドを発行します:
    kubectl get secret ocirsecret --output=yaml

    出力には、シークレットに関する情報がyamlフォーマットで含まれています。

  3. 次のテンプレートを使用して、レジストリ・イメージへのホストURLを決定します:
    <region-code>.ocir.io/<tenancy-namespace>/<repo-name>/<image-name>:<tag>
    例:
    iad.ocir.io/my-namespace/node-apps/node-hello-app:latest
  4. システムで、次のテキストを使用してnode-app.yamlというファイルを作成します:
    次のプレースホルダを置き換えます:
    • <your-image-url>
    • <your-secret-name>
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: node-app
    spec:
      selector:
        matchLabels:
          app: app
      replicas: 3
      template:
        metadata:
          labels:
            app: app
        spec:
          containers:
          - name: app
            image: <your-image-url>
            imagePullPolicy: Always
            ports:
            - name: app
              containerPort: 3000
              protocol: TCP
          imagePullSecrets:
            - name: <your-secret-name>
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: node-app-lb
      labels:
        app: app
      annotations:
        service.beta.kubernetes.io/oci-load-balancer-shape: "flexible"
        service.beta.kubernetes.io/oci-load-balancer-shape-flex-min: "10"
        service.beta.kubernetes.io/oci-load-balancer-shape-flex-max: "100"
    spec:
      type: LoadBalancer
      ports:
      - port: 3000
      selector:
        app: app
  5. 次のコマンドを使用してアプリケーションをデプロイします
    kubectl create -f node-app.yaml
    出力:
    deployment.apps/node-app created
    service/node-app-lb created
    ノート

    node-app.yamlファイルでは、ダッシュの後のコードによって柔軟なロード・バランサが追加されます。
アプリケーションのテスト
アプリケーションをデプロイした後、ロード・バランサのロードに数秒かかる場合があります。
  1. ロード・バランサが稼働中かどうかを確認します:
    kubectl get service

    ロード・バランサにIPアドレスが割り当てられるまで、このコマンドを繰り返します。

    ノート

    ロード・バランサのデプロイを待機中に、次のコマンドを使用してクラスタのステータスを確認できます:
    • 各ポッド・ステータスの取得: kubectl get pods
    • アプリケーション・ステータスの取得: kubectl get deployment
  2. ロード・バランサのIPアドレスを使用して、ブラウザでアプリケーションに接続します:
    http://<load-balancer-IP-address>:3000

    ブラウザに<h1>Hello World from Node.js!</h1>が表示されます

  3. クラスタからアプリケーションをアンデプロイします。(オプション)アプリケーションを削除するには、次のコマンドを実行します:
    kubectl delete -f node-app.yaml
    出力:
    deployment.apps/node-app deleted
    service "node-app-lb" deleted

    これで、アプリケーションがクラスタから削除されます。

次の手順

Hello Worldアプリケーションが正常に作成され、Kubernetesクラスタにデプロイされ、Node Expressフレームワークを使用してインターネット上でアクセスできるようになりました。

次のサイトをチェックして、Oracle製品を使用した開発に関する詳細情報を確認してください: